一步一步重写 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 函数与类有不同的地方,它不能继承,只能覆盖或者添加新的函数,或者直接完全新定义的一组函数. 由 ...
随机推荐
- android 之Fragment(官网资料翻译)
原文地址: http://blog.csdn.net/lilu_leo/article/details/7671533 *************************** 正文分割线 ***** ...
- 非常可乐(bfs)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- c#第五次作业---正文提取
1.正文文本 1.正文文本 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFC ...
- HTML5+CSS3正式开课
HTML5+CSS3 HTML5+CSS3 HTML5+CSS3
- MBProgressHUD简单使用
使用HUD最多的情形用于请求等待提示 例如做登录的时候在确认登陆的时候可以用HUD提示正在登陆. 最基本的使用 初始化 //self.view代表在哪个view中显示hud MBProgressHUD ...
- c++实现二分查找
简要描述: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除 困难. 条件:查找的数组必须要为有序数组. 二分查找的过程剩简要描述如下图: 二种实 ...
- asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录
MVC下的全局异常过滤器注册方式如下:标红为asp.net mvc ,asp.net mvc api 注册全局异常过滤器的不同之处 using SuperManCore; using System. ...
- Binary Tree Preorder Traversal and Binary Tree Postorder Traversal
Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...
- openrisc 之 Wishbone总线学习笔记——总线互联
一,总线命名规范 1,wishbone总线接口信号都是高电平有限 2,wishbone接口信号都是以 _i ,或者是 _o 结束.i表示输入, o表示输出. ()表示该信号为总线信号,总线位宽可以大于 ...
- centos下网络代理服务器的配置
一.临时生效,只在当前用户当前打开的shell终端下生效 在当前控制台下执行如下命令 export http_proxy=http://username:password@proxy_ip:port/ ...