一步一步重写 CodeIgniter 框架 (8) —— 视图的嵌套输出与返回
视图函数在控制器中通过 $this->load-view() 来调用,从而输出 html,有时候为了调试或附加处理的需要,我们需要打印出这些输出,而不是直接通过浏览器输出,这在 php 中是通过缓冲区来实现的,详细的函数参考 http://www.php.net/manual/zh/ref.outcontrol.php
所以我们在 _ci_load 函数中可以看到
ob_start();
        include($_ci_path);
        // 如果需要返回数据,则从缓冲区中返回数据
        if ($_ci_return === TRUE) {
            $buffer = ob_get_contents();
            @ob_end_clean();
            return $buffer;
        }
        // 如果是嵌套的视图中的输出,则直接 flush, 以便外层视图可以得到 buffer 中的内容,
        // 而最外层的 buffer 则导出到 output 类中进行最后的处理
        if (ob_get_level() > $this->_ci_ob_level + 1) {
            ob_end_flush();
        } else {
            $_ci_CI->output->append_output(ob_get_contents());
            @ob_end_clean();
        }
1)在 include 视图文件之前,开启缓冲区 ob_start(),那么视图文件的内容就全部输出到缓冲区,而不是通过浏览器输出
2) 如果调用时参数 _ci_return 为 True, 则说明这个视图文件的内容直接返回即可,不需要加入到最终的浏览器输出中,所以调用 ob_get_contents 函数获得返回值,并清理缓冲区 ob_end_clean()
3)注意 CI 中的 output 类是执行完所有的 view 视图加载后,对最终内容进行处理的,所以但凡是超出第一层 buffer 的内容,全部加入缓冲区,直到第一层的视图完毕, 通过 append_output 函数教给 Output 类来处理
加入以上代码后,相比之前,可以对视图进行任意层次的嵌套了~
为了测试结果,我们在 test_view 中嵌套另一个视图 test_inner_view
<?php echo 'I am the inner people of zzy, lc & lyq';
而 原先的 test_view 则更改为
<html>
<head>
<title>My First View</title>
</head>
<body>
<h1>Welcome, we finally met by MVC, my name is Zhangzhenyu!</h1>
<p><?php echo $info ?></p>
<div style="border: 1px solid #ccc;">
<?php $this->load->view('test_inner_view') ?>
</div>
</body>
</html>
访问 http://localhost/learn-ci/index.php/welcome/hello
可以看到输出如下
Welcome, we finally met by MVC, my name is Zhangzhenyu!
People you want in our model is Zhangzhenyu
一步一步重写 CodeIgniter 框架 (8) —— 视图的嵌套输出与返回的更多相关文章
- 一步一步重写 CodeIgniter 框架 (9) —— 使用 CodeIgniter 类库
		通过前面几节的内容,我们从零开始搭建了一个非常方便的MVC框架,理解了 CodeIgniter 框架最核心的部分.然而一个框架的便利不仅仅在于提供一个MVC就可以了,它还必须具有较高的扩展性.下面将从 ... 
- 一步一步重写 CodeIgniter 框架 (6) —— 实现在控制器Controller中加载View
		1. 控制器将模型类获得的数据,传递给视图进行显示,所以视图必须负责接收数据,另外重要的一点是当模型和视图分开后,多个模型的数据可以传递给一个视图进行展示,也可以说一个模型的数据在多个不同的视图中进行 ... 
- 一步一步重写 CodeIgniter 框架 (5) —— 实现Controller,并加载Model
		CodeIgniter 框架采用MVC模式,而MVC模式中起纽带作用的就是C(控制器),在控制器的中通过加载模型获得数据,将数据传到视图中进行展示.本课将实现在控制器中加载模型. 1. 控制器的实现 ... 
- 一步一步重写 CodeIgniter 框架 (4) —— load_class 管理多个对象实例的思路
		我们使用CodeIgniter 框架最主要是想利用其 MVC 特性,将模型.视图分开,并通过控制器进行统一控制.在尝试实现 MVC 模式之前,我们将实现其中一个对程序结构非常有用的技巧,就是 load ... 
- 一步一步重写 CodeIgniter 框架 (3) —— 用面向对象重构代码
		前面两篇文章为了重点突出 CodeIgniter 框架的原理,程序的结构很乱,有很多全局变量,在这一课中我们采用面向对象的方法对原先代码进行重构. 到目前为止,程序主要完成的就是 URL 分析,并根据 ... 
- 一步一步重写 CodeIgniter 框架 (1) —— url 如何映射到具体的方法
		CodeIgniter 框架最显著的特征就是 MVC 模式,它的做法就是提取 url 中的'分段', 映射到某个类的某个方法,从而由该方法来输出最终显示的页面内容.那么我们第一课中就是实现一个这样的原 ... 
- 一步一步重写 CodeIgniter 框架 (12) —— 代码再重构,回归 CI
		第一课中搭建的基本的 框架模型, 只有一个 index.php 作为执行文件,按这种方式最不稳定的因素就是路径的问题. 我们经常需要通过合适的参数,比如 load_class('output') 或 ... 
- 一步一步重写 CodeIgniter 框架 -- 原因和思路
		CodeIgniter 是一个非常轻量级的 PHP 框架,说是轻量级,最新版的代码只有不到2M. 其最重要的特点就是 MVC 模式来编写代码,如果大家看过一些用 PHP 来编写网站的书籍或教程,无一例 ... 
- 一步一步重写 CodeIgniter 框架 (11) —— 使用 CodeIgniter 函数库
		在完成了CI框架的类库扩展后,很自然我们就会想到函数库的扩展.函数库的扩展在 CI 中称为 helper 函数与类有不同的地方,它不能继承,只能覆盖或者添加新的函数,或者直接完全新定义的一组函数. 由 ... 
随机推荐
- java csv 文件 操作类
			一个CSV文件操作类,功能比较齐全: package tool; import java.io.BufferedReader; import java.io.BufferedWriter; impor ... 
- 2014年去哪儿网笔试题--有两个文件context.txt和words.conf,请尝试将他们合并成为一段文字,并打印出来。
			有两个文件context.txt和words.conf,请尝试将他们合并成为一段文字,并打印出来. 这两个文件内容如下: context.txt “并不是每个人都需要$(qunar)自己的粮食,$(f ... 
- Flex TextInput的restrict属性应用
			1,<mx:TextInput id="test_ti" width="160" maxChars="20" restrict=&qu ... 
- 【源码】实现Android闹钟功能使用HTML+JS,并附带Alarm代码分享
			先是开发手册中最终功能的实现函数,再是Alarm接口的源码. 参数: argu:型如“key1=value1;key2=value2;......”的参数表.首先,该参数表支持 rexseeNotif ... 
- Foundation Sorting: Single List Insertion Sort
			/* List Insertion Sorting. * Implementation history:. * 2013-09-15, Mars Fu, first version. */ #incl ... 
- OutLook 2010 收件箱子文件夹收到新邮件时没有桌面通知
			开始---规则----管理规则和通知 规则和通知---电子邮件规则---批量选择账号---更改规则---在新邮件通知和窗口显示(选中)---确定 录入通知邮件消息---确定 效果如下: 
- Enze Second day
			哈喽,很高兴在云和学院又学了一天的新知识,现在,我来继续总结一下今天所学的以及对昨天的一些补充. 变量 • 声明变量的语法格式: –数据类型 变量名; •赋值: 变量名=值; 变量的命名 • ... 
- string.Format()字符串格式化
			Format()基本语法: {索引[,对齐][:格式字符串]} ·索引:表示引用的对象列表中的第n个对象参数. ·对齐(可选):设置宽度与对齐方式,该参数为带符号的整数.正数为 ... 
- 前端CSS规范大全
			一.文件规范 1.文件均归档至约定的目录中(具体要求以豆瓣的CSS规范为例进行讲解): 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用 ... 
- C#学习日记之数据库连接
			一.webconfig设置和参数解释 在C#中新建一个网站时,webconfig文件中会有一个默认的数据库连接语句,如下 <connectionStrings> <add name= ... 
