PHP.MVC的模板标签系统(四)


Posted in PHP onSeptember 05, 2006

页面布局

    在这个单元中我们将看到如何使用模板标签系统构造一个标准的模板页面。这个例子我们使用了一个简单的HTML页面布局,请看下图:

PHP.MVC的模板标签系统(四)

    这个页面有多个标准单元组成,就像页面设计者和开发者熟悉的那样.这个页面的主体由3个包含的单元组成:页眉,页内容主体和页脚.我们现在就看看这些单元并且了解如何使用模板标签系统来实现.

页主体

    下面的代码单元显示的是主体:
The Page Body Layout 
1
<@ saleMonth    = data.getValueBean('SALE_MONTH') @>
<@ saleTitle    = data.getValueBean('SALE_TITLE') @>
<@ dealHeading  = data.getValueBean('DEAL_HEADING') @>
<@ salesAreaID  = "Central District" @>

<html>
<head>
   <link rel='stylesheet' type='text/CSS' href="./style/pageStyles.css"/>
   <title>
2     <@ =viewConfig.getAppTitle @>
   </title>
</head>
<body>

<table class='pageLayoutTable'>

   <!-- PAGE HEADER -->
   <tr>
      <td class='pageHeader'>
         <!-- including the page header component -->
         <!-- The base template base directory is "./tpl"  -->
3        <@ include 'pageHeader.ssp' @>
      </td>
   </tr>

   <!-- PAGE CONTENTS -->
   <tr valign='top'>
      <td class='pageContent'>
         <!-- including the page contents component -->
4        <@ include 'sale/pageContent.ssp' @>
      </td>
   </tr>

   <!-- PAGE FOOTER -->
   <tr>
      <td class='pageFooter'>
         <!-- including the page footer omponent -->
5        <@ include 'pageFooter.ssp' @>
      </td>
   </tr>
</table>

</body>
</html>

1:页声明
    第一个有趣的条目是页顶部的页声明(1).我们在页面开始声明了这些变量,因此这些变量将能在下面的页面和像页眉那样的包含页所使用.
2:页标题
    下一步我们使用表达式来初始化页面标题(2).这个值能够从配置文件中view-resources元素利用ViewResourcesConfig->getAppTitle来得到:
<view-resources
   appTitle = "Flash Jacks' Sleek Tab Site"
   ...
</view-resources>
3:页眉
    页眉是下一个有趣的条目(3).在这里我们使用包含指令来插入页眉模板文件到页主体中.我们将在下一个子单元中来看一看页眉.
    我们仅仅使用了页面直接去读取页眉,不论页的组件存储在哪里.这是一个好机会来介绍模板标签系统的目录设置.默认情况下,模板目录布局如下所示(注意这些路径相对于我们的应用程序):
The Default PhpMVC_Tags Template Directory Layout Paths (relative) 
The Template Files  './WEB-INF/tpl' 
The Compiled Template Files  './WEB-INF/tpl_C' 
    如果需要的话我们可以在配置文件的view-resources结点来重新定义他们,就像这样:
<view-resources
   ...
   tplDir   = "./WEB-INF/tpl-admin"
   tplDirC  = "./WEB-INF/tpl_admin_C"
   ...
</view-resources>
4:页内容主体
    这是另外一个包含指令被用来插入模板文件(4)到主体中.注意包含的文件位于模板目录的sales子目录中:
"./WEB-INF/tpl/sale/pageContent.ssp"
5:页脚
    又是一个包含指令,就像页眉一样.

页眉单元

    在这个例子中页眉模板文件('pageHeader.ssp')只是一个简单的单元,就像这样:
<!-- Page Header -->
<span>
   <@ =viewConfig.getAppTitle @>
</span>
    当主体页面(包括包含的页面)被编译的时候,页眉的表达式被转换成下面这样:
<!-- Page Header -->
<span>
   <?php print $viewConfig->getAppTitle(); ?>
</span>
    被编译的页面被存储在编译模板目录中,就像上面所说的,默认的编译模板目录是:
'./WEB-INF/tpl_C'

页内容主体单元

    页内容主体模板文件有一点复杂.文件('sale/pageContent.ssp')内容显示如下:
...
1
<@ item1=data->getValueBean("ITEM_1") @>
<@ products=data->getValueBean("PRODUCTS_ARRAY") @>

2
<h4><@=dealHeading @> <@=saleMonth @></h4>

3
<b>Clearance deals</b>
<table class='productsTable'>
   <tr>
      <td class='prodItemDesc'>
         <@ =item1.getName @>
      </td>
      <td class='prodItemValue'>
         <@ =item1.getCost @>
      </td>
   </tr>
</table>

4
<b>Todays specials</b>
<table class='productsTable'>
<?php foreach($products as $item) { ?>
  <tr>
    <td class='prodItemDesc'>
         <@ =item.getName @>
    </td>
    <td class='prodItemValue'>
         <@ =item.getCost @>
    </td>
  </tr>
<?php } ?>
</table>

<b>Our Staff at Your Service</b>
...
5
<table class='productsTable'>
  <tr>
    <td class='prodItemDesc'>
      <b>Area Manager: </b>
    </td>
    <td class='prodItemDesc'>
      <@ =viewConfig.getAreaManager @>
    </td>
  </tr>
  ...
</table>
1:一些更多的声明
    在页面顶部所显示的额外声明(1)能让我们声明页变量以便下面能够使用.在内容被处理之后,这些声明将在编译后像下面这样显示:
<?php $item1=$data->getValueBean("ITEM_1"); ?>
...
<?php $products=$data->getValueBean("PRODUCTS_ARRAY"); ?>
2:使用表达式来显示内容单元标题
    现在我们使用两个表达式(2)来显示内容单元的标题.注意我们声明这些变量是"全局"变量在主页面的顶部.处理完后,表达式将转换这些代码,就像这样:
<?php print $dealHeading; ?> <?php print $saleMonth; ?>
    当页面被显示到用户的浏览器中,内容单元的标题看起来就像这样:
Jack's Super Deals for : May 2010.
3:使用表达式来显示一些数据条目
    现在我们能显示一些实际的数据(3).在这个页内容主体单元中我们访问一些在PhpMVCTabAction类的ActionObject中的产品条目数据.一个简化版的PhpMVCTabAction类在下面展示:
class PhpMVCTabAction extends Action {
   ...
   function execute($mapping, $form, &$request, &$response) {
      // Our value bean container
      $valueBeans =& new ValueBeans();

      // Define some strings we need on our View template page
      // These could be defined globally in the phpmvc-config.xml file.
      // See: ExtendedController example.
      $appTitle      = "Flash Jack's Include Page";
      $saleMonth     = "May 2010";
      $saleTitle     = "Flash Jack's Super Sale";
      $dealHeading   = "Jack's Super Deals for :";
      ...

      // Save the string variables to our Value object
      $valueBeans->addValueBean('APP_TITLE'     , $appTitle);
      $valueBeans->addValueBean('SALE_MONTH'    , $saleMonth);
      $valueBeans->addValueBean('SALE_TITLE'    , $saleTitle);
      $valueBeans->addValueBean('DEAL_HEADING'  , $dealHeading);
      ...

      // Some float values we could receive from a database query
      // Note: The prices are formatted in the Products class constructor.
      // Eg: "$ n,nnn.nn"
      $price1 =  125.00;
      ...

      // Setup some clearance deals (individual object instances):
      // Note: The Product class file was included in our local prepend.php file
      $item1 = new Product('Super Duper', $price1);
      ...
      $valueBeans->addValueBean('ITEM_1', $item1);
      ...

      // Todays specials (array of object instances)
      $products = array();
      $products[] = new Product('Gooses Bridle', $price3);
      ...
      $valueBeans->addValueBean('PRODUCTS_ARRAY', $products);

      // Our staff
      $staff1 =& new Staff('Bruce', 'Sales', 'Karate');
      ...
      $valueBeans->addValueBean('STAFF_1', $staff1);
      ...

      // Save the Value object
      $this->saveValueObject($request, $valueBeans);
    在上面的代码中,我们能看到$item1被创建并被保存成ActionObject的valueBeans条目.Bean数据条目现在能在模板页面中被重新获得:
<@ item1=data->getValueBean("ITEM_1") @>
    我们可以像下面那样显示条目的值:
<@ =item1.getName @>
...
<@ =item1.getCost @>
4:显示数组
    我们也可以直接使用一些PHP代码在我们的模板页上.在这个分离的MVC模式中,我们应该仅在这里编写代码去操纵这些通过ActionObject和ViewResourcesConfig实例(可能我们的自定义Bean也可以)提供的数据.在上面的也内容单元('sale/pageContent.ssp')中,我们使用一个PHP的foreach语法(4)来循环读取$products数组.我们能在上面的PhpMVCTabAction类中看到$products数组被创建并被保存在ActionObject中,就和上面的$item1 Bean相似.在foreach循环中我们能使用表达式来显示产品数据:
<?php foreach($products as $item) { ?>
   <tr>
      <td class='prodItemDesc'>
         <@ =item.getName @>
      </td>
      <td class='prodItemValue'>
         <@ =item.getCost @>
       </td>
   </tr>
<?php } ?>
5:显示ViewResourcesConfig属性
    最后我们从view-resources元素所定义的ViewResourcesConfig属性来显示"Area Manager"(5)在我们的内容页:
<view-resources
       appTitle    = "Flash Jacks' Sleek Tab Site"
       ...
       className   = "MyViewResourcesConfig">

       <!-- We can set some properties on our custom ViewResourcesConfig class        -->
       <set-property property="areaManager" value="Joe J. Blogs Esq."/>
  </view-resources>
    但是注意在这个例子中我们使用了一个继承ViewResourcesConfig类的对象(MyViewResourcesConfig)来设置一些自定义的属性.我们定义了一个扩展ViewResourcesConfig类的对象,在配置文件里使用className="MyViewResourcesConfig"属性,并且MyViewResourcesConfig类定义在文件"MyViewResourcesConfig.php"中.MyViewResourcesConfig类(classes/MyViewResourcesConfig.php)实现了setter/getter方法去处理自定义属性("areaManager"),这个属性我们在view-resources结点中定义:
class MyViewResourcesConfig extends ViewResourcesConfig {

   // ----- Properties ----------------------------------------------------- //

   var $areaManager = '';

   function getAreaManager() {
      return $this->areaManager;
   }

   function setAreaManager($areaManager) {
      $this->areaManager = $areaManager;
   }
    我们现在能使用表达式在我们的页面上实现"Area Manager"了:
<@ =viewConfig.getAreaManager @>
    注意:在真实的应用程序中数据能从关系型数据库中得到.

页脚单元

    页脚单元和上面讨论过的页眉单元的处理相类似.页脚模板文件('tpl/pageFooter.ssp')就像这样:
<!-- Page Footer -->
<span>
  <@ =viewConfig.getCopyright @>
</span>
    当主体页面(包括包含的页面)被编译,在页脚中的表达式被转换成下面这样:
<!-- Page Footer -->
<span>
   <?php print $viewConfig->getCopyright(); ?>
</span>
    编译的页眉页面被存储在编译模板目录.默认的编译模板目录是:
'./WEB-INF/tpl_C'

PHP 相关文章推荐
MySQL中create table语句的基本语法是
Jan 15 PHP
PHP 七大优势分析
Jun 23 PHP
php 处理上百万条的数据库如何提高处理查询速度
Feb 08 PHP
通过5个php实例细致说明传值与传引用的区别
Aug 08 PHP
CodeIgniter图像处理类的深入解析
Jun 17 PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
May 08 PHP
js+php实现静态页面实时调用用户登陆状态的方法
Jan 04 PHP
PHP弱类型的安全问题详细总结
Sep 25 PHP
php之header的不同用法总结(实例讲解)
Nov 28 PHP
php压缩文件夹最新版
Jul 18 PHP
phpstudy2020搭建站点的实现示例
Oct 30 PHP
PHP.MVC的模板标签系统(三)
Sep 05 #PHP
PHP.MVC的模板标签系统(二)
Sep 05 #PHP
PHP.MVC的模板标签系统(一)
Sep 05 #PHP
apache+mysql+php+ssl服务器之完全安装攻略
Sep 05 #PHP
Windows下PHP5和Apache的安装与配置
Sep 05 #PHP
玩转图像函数库―常见图形操作
Sep 03 #PHP
生成静态页面的PHP类
Jul 15 #PHP
You might like
利用php获取服务器时间的实现代码
2013/06/07 PHP
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
PHP获取当前文件的父目录方法汇总
2016/07/21 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
php上传excel表格并获取数据
2017/04/27 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
微信小程序实现人脸识别
2018/05/25 Javascript
Vue Element 分组+多选+可搜索Select选择器实现示例
2018/07/23 Javascript
详解在vue-test-utils中mock全局对象
2018/11/07 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python字符串逐字符或逐词反转方法
2015/05/21 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
python微信公众号之关键词自动回复
2018/06/15 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
如何通过python检查文件是否被占用
2020/12/18 Python
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
LUISAVIAROMA德国官网:时尚奢侈品牌购物网站
2020/11/12 全球购物
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
师德师风建设方案
2014/05/08 职场文书
通报表扬范文
2015/01/17 职场文书
2015年女工委工作总结
2015/07/27 职场文书
浅谈redis整数集为什么不能降级
2021/07/25 Redis
Java字符串逆序方法详情
2022/03/21 Java/Android
python3 字符串str和bytes相互转换
2022/03/23 Python