Qeephp中的控制器视图机制
Qeephp中的控制器视图机制
Qee中视图是如何被调用的
处理视图的两个类的职责分别是什么
控制器中的数据时如何传递到前台视图的
视图的模板继承机制是如何实现的
Qee中视图是如何被调用的
每次请求访问一个action生成视图,函数调用的次序是
Controller->execute() 返回QView_Render_PHP视图对象
QView_Render_PHP->execute() 该函数调用该类中的display函数
QView_Render_PHP->display() 该函数调用该类中的fetch函数
QView_Render_PHP->fetch() 该函数调用QView_Render_PHP_Parser中的parser函数
QView_Render_PHP_Parser->parser() 该函数是递归函数,用来处理qee的模板继承机制,同时该函数调用该类中的_include()函数,加载页面view,并执行页面中的_block,_endblock,_control,_element函数
QView_Render_PHP_parser->block() 该函数用来加载view中的block到view的block的堆栈中
QView_Render_PHP_parser->endblock() 该函数用来将堆栈中的block及其内容转移到堆栈的blocks参数中,并且设置占位符
QView_Render_PHP_parser->control 调用控件,直接生成字符串返回
QView_Render_PHP_parser->element 调用element,直接生成字符串返回
最后返回页面的html字符串,在index.php人口文件中显示
处理视图的两个类的职责分别是什么
QView_Render_PHP类主要的作用是获取视图view的文件名并加载文件,获取控制器中传递过来的变量,设置一些常用的全局变量到view中,例如 $_BASE_DIR
QView_Render_PHP_parser主要负责将解析QView_Render_PHP类加载视图文件,把控制器总的变量都传递给视图,同时实现qeephp视图的模板继承机制
每次请求访问页面,都要生成一个QView_Render_PHP和QView_Render_PHP_parser对象
控制器中的数据是如何传递到前台视图的
每次执行action后,都会将变量以$this->_view["变量名"] =>变量值 的方式传递给QView_Render_PHP类,
QView_Render_PHP类通过fetch()函数调用QView_Render_PHP_parser类的assign函数赋值给QView_Render_PHP_parser类的_vars属性,
在执行block函数,在执行QView_Render_PHP_parser->parser()函数时,调用QView_Render_PHP_parser->_include()函数,该函数调用extract($this->_vars);函数,使得view页面中可以直接以变量的形式使用$this->_vars数组中的变量,Extract()函数的作用就是直接定义数组当中的名值对为变量,然后include $___filename;导入文件,让文件中可以使用$this->_vars中的变量值
下面为_include函数

视图的模板继承机制是如何实现的
Qee的模板继承机制主要是QView_Render_PHP_parser类中的parser()、block()、endblock()三个函数来实现的,
parser()函数主要解决的是view页面如何继承布局layout的问题,
Block()和endblock()函数主要解决的是view中block块如何替换layout中的block的问题
这两个函数操作的都是一个名为stacks的视图堆栈,parser函数是将view以及layout页面存入堆栈,block和endblock函数主要是将block块内容存入view或layout的堆栈中,以下为stacks堆栈中的一个view视图有的参数及其值

视图堆栈stacks中的视图数组中的配置
参数名 | 值 | 说明 |
id | Int 随机数(数字,例如1350873922) | 每个视图view都会有一个编号,做为视图的唯一编号,不论是view还是布局layout的id都是一个 |
contents | String 类型%block_contents_placeholder_main_1350873922% 或 页面的具体html内容 | %block_contents_placeholder_main_1350873922%是一个占位符,每个block函数都会生成一个这个语句,是用来被继承该页面的语句块替换用的 |
extends | String _layouts/default1_layout | 该页面所继承的布局 |
blocks | Array 模块名 => 模块内容 | 页面块的内容,每个view中的所有block中的内容,qee中的视图继承机制,就是通过将view中的block的内容替换布局layout中的block的内容,这样就实现了模板继承机制 |
Blocks_stacks | Array 模块名 => 模块内容 | View在加载时,临时存放view中block的堆栈 |
Blocks_config | Array 模块名 => append|repalce|空 | View中模块替换布局中的模块时需要的配置, Append表示view中模块继承布局中的模块时,是将view中的内容放到布局中模块的后面 Repalce表示是替换布局中模块的内容,默认情况下就是replace |
Nested_blocks | Array array(子嵌套模块,父嵌套模块) | 框架记录每个模块的嵌套关系 |
每次页面请求访问,qee会将view页面先压入堆栈中,然后再将view页面继承的layout压入堆栈,再压入该layout继承的layout到堆栈中,依次类推,知道某个layout没有继承的layout为止,
在view或layout依次压入堆栈时,qee会执行view或layout页面,调用页面中block函数将block的内容压入view或layout中的blocks_stacks块堆栈中,并通过调用endblock函数依次调用抛出blocks_stacks堆栈中的block内容,并设置block的占位符
如果view页面中block块的嵌套次序为
Mian
First
Second
则在调用完页面中所有的block函数之后,view页面中的blocks_stacks堆栈中的结构为 Second
First
Main
下面为block函数

块main最先压入到堆栈中,而endblock函数则是将堆栈中的块一个一个抛出,并设置占位符,
下面为endblock函数

将堆栈中的内容块转移到blocks中,下面为view页面中的blocks的数据

最后通过parser函数将view中的block块的内容替换layout中的同名block块内容

浙公网安备 33010602011771号