View应用
视图(view)是MVC中的V。作用是完成视图文件的处理并将页面内容显示出来。
DoitPHP支持PHP和HML两种文件格式的视图文件,当视图文件为PHP时,直接由Controller基类(Controller Class)所提供的视图处理类方法直接搞定,无需调用视图基类(View Class)的文件,更无需实例化视图基类。因此PHP的视图文件运行效率要高于HTML的视图文件。在我们大量的测试中,实现同样功能的页面,用PHP视图文件运行效率要比HTML的视图文件时高出9%。不过用HTML视图文件也有它的优势,就是便于团队协作。在一个大型的web开发团队里,网站前台设计人员并不是都懂PHP代码。
在介绍DoitPHP视图应用之前,先明确几个概念:
布局视图(layout):如上面所示,白色框架中的即是layout。布局就是整个页面的版面设计。通常大部分网站页面的版面设计都遵寻一个统一的布局。所以使用布局视图文件,可以实现视图文件代码的“重复利用”,从而提高程序开发效率。
控制器视图(content):即当前Action视图内容(如上图content的部分),这部分页面内容通常都是变化的。
挂件视图(widget):挂件(小部件)就是用于边栏中各种小模块,通常包括主菜单、搜索表单、登陆表单、热门文章列表、日历显示、广告区块、及菜单导航条。开发同一个挂件,可以被多个所需要的视图共用,所以DoitPHP的挂件也是为了实现代码共用,提高程序开发效率而设计的。
一、DoitPHP视图机制的运行原理
1、当视图为PHP文件时:如下图所示:首先由controller基类中的方法:assign()把页面内容的变量赋值到视图类方法的作用域中,便于加载视图文件时对变量内容的调用。其次分析出当前页面所要调用的视图文件(控制器视图)的路径。再次由display()加载和显示视图文件内容。其中display()的执行过程为:首先加载视图文件,依据assign()所赋值的变量值,获取视图文化的内容。其次分析布局视图文件。当布局文件存在时则获取其页面内容,接下来将控制器视图的内容赋值到布局视图$viewContent变量中。最后显示页面内容。如果布局视图文件不存在,则直接显示控制器视图页面内容。
注:除了assign()可以对视图变量赋值外,还有render()的第二参数也可以实现视图变量赋值。
2、当视图文件为HTML时:首先使用assign()对视图变量完成赋值,然后由display()完成视图文件的加载,编译和显示。当display()运行时,首先分析视图文件的编译文件,当编译文件需要重新生成时则加载视图文件,将视图文件中的“模板标签”转换为PHP代码。将处理后的内容写入编译文件。如编译文件无需重新生成时,则直接加载编译文件并显示其内容。 注:虽然视图文件是HTML的,依然支持布局视图和挂件视图。
当视图文件为PHP,视图操作由DoitPHP核心类View Classs来完成;当视图文件为HTML时,视图操作由DoitPHP核心类Template Classs来完成,挂件的视图操作由核心类WidgetTemplate Class来完成。
二、视图基类的模板标签说明
DoitPHP的视图标签和discuz模板的标签类似,操作非常简单。注:这些视图标签只有当视图文件为HTML时才有“用武之地”。如果视图文件是PHP的,直接用PHP代码就OK了,以下模板标签不适用。下面将模板标签的详细使用方法介绍一下:
1、模板标签边界符。
<!— {模板标签内容} —>
为了照顾不同软件在HTML注释代码<!— —>的操作支持不同。<!— —>与{}之间有无空隔(仅只是一个空格),模板都支持。如:<!—{$doitphp}—>和<!— {$doitphp} —>都是“合法”的。
2、模板变量。
<!— {$模板变量} —>
<!— {$模板变量['索引']} —>或<!— {$模板变量.索引} —>
- 例:
- <!-- {$sitename} -->
- <!-- {$lines['name']} -->或<!-- {$lines.name} -->
3、判断语句的模板标签。
<!— {if $模板变量1 运算符 $模板变量}—>
- 模板内容1
- <!-- {else}-->
- 模板内容2
- <!-- {/if}-->
或
- <!-- {if $模板变量1 运算符 $模板变量2}-->
- 模板内容1
- <!-- {else if $模板变量1 运算符 $模板变量3}-->
- 模板内容2
- <!-- {else}-->
- 模板内容3
- <!-- {/if}-->
注:这里的运算符支持:> 、< 、>= 、<=、==、!= 、<>。
- 例一、
- <!-- {$x>$y} -->
- x大于y
- <!-- {else} -->
- x不大于y
- <!-- {/if} -->
- 例二、
- <!-- {if $x>$y}-->
- x大于y
- <!-- {else if $x==$y} -->
- x等于y
- <!-- {else} -->
- X小于y
- <!-- {/if} -->
- 例三、
- <!-- {if $x >300}-->
- x大于300
- <!-- {else if $x>200} -->
- X大于200
- <!-- {else} -->
- x小于等于200
- <!-- {/if} -->
- 例四、
- <!-- {if $x == true}-->
- x为true
- <!-- {else} -->
- x为false
- <!-- {/if} -->
- 例五、
- <!-- {if $x == false}-->
- x为false
- <!-- {else} -->
- x为true
- <!-- {/if} -->
- 例六、
- <!-- {if $data['num'] == $total_num}-->或<!-- {if $data.num == $total_num}-->
- 数量为<!-- {$total_num} -->
- <!-- {else} -->
- 数量不为<!-- {$total_num} -->
- <!-- {/if} -->
- 例七、
- <!-- {if $data['num'] == 200}-->或<!-- {if $data.num == 200}-->
- 数量为200
- <!-- {else} -->
- 数量不为200
- <!-- {/if} -->
- 例八、
- <!-- {if $data['num'] > 200}-->或<!-- {if $data.num > 200}-->
- 数量大于200
- <!-- {else if $data['num'] > 100}-->
- 数量大于100
- <!-- {else} -->
- 数量不大于100
- <!-- {/if} -->
- 例九、
- <!-- {if $data['state']== true}-->
- state开启
- <!-- {else} -->
- state未开启
- <!-- {/if} -->
- 例十、
- <!-- {if $data['menu']== 'index'}-->
- 首页
- <!-- {else} -->
- 其它
- <!-- {/if} -->
4、循环语句的模板标签。
- <!-- {loop 模板数组 $索引变量=>$值变量} -->
- 执行语句
- <!-- {/loop} -->
- 或
- <!-- {loop 模板数组 $值变量} -->
- 执行语句
- <!-- {/loop} -->
- 例一、
- <!-- {loop $data $key=>$value} -->
- <!-- {$key} -->:<!-- {$value} -->
- <!-- {/loop} -->
- 例二、
- <!-- {loop $data $value} -->
- n+1次
- <!-- {/loop} -->
5、include模板标签。
<!— {include 模板文件} —>
注:此模板文件一般为共享性模板文件。如:每个页面的版信息。如果将版权信息这部分单独自作一个独立模板,让每个页面通过include的方式进行共享。
- 例一、
- <!-- {include common/copyright } -->
注:common为系统目录views中的子目录,copyright为文件名。模板文件这里省略了.html的后缀名。
- 例二、
- <!-- {include copyright } -->
注:这里的模板名称只有copyright,没有上面例一中的common目录。当模板文件名不含模板所在的目录时,系统默认为这个页面(就是调用include的模板所在的页面)的controller所对应的模板存放目录。如:当前cotroller为demo。就是视图目录中子目录demo的目录。
6、widget模板标签。
<!— {widget 参数} —>
DoitPHP 视图还支持一个比inclue还要高级的模板共享功能,即挂件(widget)功能。(关于具体的widget,以后还会详细说明)。这里的参数为widget名。
- 例一、
- <!-- {widget login} -->
7、执行类方法模板标签。
<!— {php PHP语句} —>
eval的功能为在模板中执行PHP语句。
- 例一、
- <!-- {php echo substr($name, 0, 3)} -->
这个eval模板标签将编译成:<?php echo substr($name, 0, 3) ?>。该明白怎么使用了吧?
原文: http://www.doitphp.com/index/documentation/?articleid=22