View应用

视图(view)是MVC中的V。作用是完成视图文件的处理并将页面内容显示出来。

DoitPHP支持PHP和HML两种文件格式的视图文件,当视图文件为PHP时,直接由Controller基类(Controller Class)所提供的视图处理类方法直接搞定,无需调用视图基类(View Class)的文件,更无需实例化视图基类。因此PHP的视图文件运行效率要高于HTML的视图文件。在我们大量的测试中,实现同样功能的页面,用PHP视图文件运行效率要比HTML的视图文件时高出9%。不过用HTML视图文件也有它的优势,就是便于团队协作。在一个大型的web开发团队里,网站前台设计人员并不是都懂PHP代码。

在介绍DoitPHP视图应用之前,先明确几个概念:

View应用 - 图1

布局视图(layout):如上面所示,白色框架中的即是layout。布局就是整个页面的版面设计。通常大部分网站页面的版面设计都遵寻一个统一的布局。所以使用布局视图文件,可以实现视图文件代码的“重复利用”,从而提高程序开发效率。

控制器视图(content):即当前Action视图内容(如上图content的部分),这部分页面内容通常都是变化的。

挂件视图(widget):挂件(小部件)就是用于边栏中各种小模块,通常包括主菜单、搜索表单、登陆表单、热门文章列表、日历显示、广告区块、及菜单导航条。开发同一个挂件,可以被多个所需要的视图共用,所以DoitPHP的挂件也是为了实现代码共用,提高程序开发效率而设计的。

一、DoitPHP视图机制的运行原理

1、当视图为PHP文件时:如下图所示:首先由controller基类中的方法:assign()把页面内容的变量赋值到视图类方法的作用域中,便于加载视图文件时对变量内容的调用。其次分析出当前页面所要调用的视图文件(控制器视图)的路径。再次由display()加载和显示视图文件内容。其中display()的执行过程为:首先加载视图文件,依据assign()所赋值的变量值,获取视图文化的内容。其次分析布局视图文件。当布局文件存在时则获取其页面内容,接下来将控制器视图的内容赋值到布局视图$viewContent变量中。最后显示页面内容。如果布局视图文件不存在,则直接显示控制器视图页面内容。

View应用 - 图2

注:除了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、模板变量。

<!— {$模板变量} —>

<!— {$模板变量['索引']} —>或<!— {$模板变量.索引} —>

  1. 例:
  2.  
  3. <!-- {$sitename} -->
  4.  
  5. <!-- {$lines['name']} -->或<!-- {$lines.name} -->

3、判断语句的模板标签。

<!— {if $模板变量1 运算符 $模板变量}—>

  1. 模板内容1
  2. <!-- {else}-->
  3. 模板内容2
  4. <!-- {/if}-->

  1. <!-- {if $模板变量1 运算符 $模板变量2}-->
  2. 模板内容1
  3. <!-- {else if $模板变量1 运算符 $模板变量3}-->
  4. 模板内容2
  5. <!-- {else}-->
  6. 模板内容3
  7. <!-- {/if}-->

注:这里的运算符支持:> 、< 、>= 、<=、==、!= 、<>。

  1. 例一、
  2. <!-- {$x>$y} -->
  3. x大于y
  4. <!-- {else} -->
  5. x不大于y
  6. <!-- {/if} -->
  7.  
  8. 例二、
  9. <!-- {if $x>$y}-->
  10. x大于y
  11. <!-- {else if $x==$y} -->
  12. x等于y
  13. <!-- {else} -->
  14. X小于y
  15. <!-- {/if} -->
  16.  
  17. 例三、
  18. <!-- {if $x >300}-->
  19. x大于300
  20. <!-- {else if $x>200} -->
  21. X大于200
  22. <!-- {else} -->
  23. x小于等于200
  24. <!-- {/if} -->
  25.  
  26. 例四、
  27. <!-- {if $x == true}-->
  28. xtrue
  29. <!-- {else} -->
  30. xfalse
  31. <!-- {/if} -->
  32.  
  33. 例五、
  34. <!-- {if $x == false}-->
  35. xfalse
  36. <!-- {else} -->
  37. xtrue
  38. <!-- {/if} -->
  39.  
  40. 例六、
  41. <!-- {if $data['num'] == $total_num}-->或<!-- {if $data.num == $total_num}-->
  42. 数量为<!-- {$total_num} -->
  43. <!-- {else} -->
  44. 数量不为<!-- {$total_num} -->
  45. <!-- {/if} -->
  46.  
  47. 例七、
  48. <!-- {if $data['num'] == 200}-->或<!-- {if $data.num == 200}-->
  49. 数量为200
  50. <!-- {else} -->
  51. 数量不为200
  52. <!-- {/if} -->
  53.  
  54. 例八、
  55. <!-- {if $data['num'] > 200}-->或<!-- {if $data.num > 200}-->
  56. 数量大于200
  57. <!-- {else if $data['num'] > 100}-->
  58. 数量大于100
  59. <!-- {else} -->
  60. 数量不大于100
  61. <!-- {/if} -->
  62.  
  63. 例九、
  64. <!-- {if $data['state']== true}-->
  65. state开启
  66. <!-- {else} -->
  67. state未开启
  68. <!-- {/if} -->
  69.  
  70. 例十、
  71. <!-- {if $data['menu']== 'index'}-->
  72. 首页
  73. <!-- {else} -->
  74. 其它
  75. <!-- {/if} -->

4、循环语句的模板标签。

  1. <!-- {loop 模板数组 $索引变量=>$值变量} -->
  2. 执行语句
  3. <!-- {/loop} -->
  4. <!-- {loop 模板数组 $值变量} -->
  5. 执行语句
  6. <!-- {/loop} -->
  1. 例一、
  2. <!-- {loop $data $key=>$value} -->
  3. <!-- {$key} -->:<!-- {$value} -->
  4. <!-- {/loop} -->
  5.  
  6. 例二、
  7. <!-- {loop $data $value} -->
  8. n+1
  9. <!-- {/loop} -->

5、include模板标签。

<!— {include 模板文件} —>

注:此模板文件一般为共享性模板文件。如:每个页面的版信息。如果将版权信息这部分单独自作一个独立模板,让每个页面通过include的方式进行共享。

  1. 例一、
  2. <!-- {include common/copyright } -->

注:common为系统目录views中的子目录,copyright为文件名。模板文件这里省略了.html的后缀名。

  1. 例二、
  2. <!-- {include copyright } -->

注:这里的模板名称只有copyright,没有上面例一中的common目录。当模板文件名不含模板所在的目录时,系统默认为这个页面(就是调用include的模板所在的页面)的controller所对应的模板存放目录。如:当前cotroller为demo。就是视图目录中子目录demo的目录。

6、widget模板标签。

<!— {widget 参数} —>

DoitPHP 视图还支持一个比inclue还要高级的模板共享功能,即挂件(widget)功能。(关于具体的widget,以后还会详细说明)。这里的参数为widget名。

  1. 例一、
  2. <!-- {widget login} -->

7、执行类方法模板标签。

<!— {php PHP语句} —>

eval的功能为在模板中执行PHP语句。

  1. 例一、
  2. <!-- {php echo substr($name, 0, 3)} -->

这个eval模板标签将编译成:<?php echo substr($name, 0, 3) ?>。该明白怎么使用了吧?

原文: http://www.doitphp.com/index/documentation/?articleid=22