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) ?>。该明白怎么使用了吧?