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 相关文章推荐
虚拟主机中对PHP的特殊设置
Oct 09 PHP
实现dedecms全站URL静态化改造的代码
Mar 29 PHP
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
Dec 19 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
May 02 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 PHP
php+mysqli使用预处理技术进行数据库查询的方法
Jan 28 PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 PHP
php+mysql+jquery实现日历签到功能
Feb 27 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
Dec 16 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函数
2011/05/31 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
Three.js源码阅读笔记(物体是如何组织的)
2012/12/27 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
Javascript 中创建自定义对象的方法汇总
2014/12/04 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
vue.js的提示组件
2017/03/02 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
浅谈python中的占位符
2017/11/09 Python
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
遇到的Mysql的面试题
2014/06/29 面试题
入党思想汇报怎么写
2014/04/03 职场文书
高中学校对照检查材料
2014/08/31 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
营业用房租赁协议书
2014/11/26 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
工作服管理制度范本
2015/08/06 职场文书
2016年春季开学典礼新闻稿
2015/11/25 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python