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将向Java靠拢
Oct 09 PHP
做一个有下拉功能的留言版
Oct 09 PHP
php 文件上传实例代码
Apr 19 PHP
PHP实现C#山寨ArrayList的方法
Jul 16 PHP
PHP中配置IIS7实现基本身份验证的方法
Sep 24 PHP
PHP翻页跳转功能实现方法
Nov 30 PHP
Zend Framework教程之Autoloading用法详解
Mar 08 PHP
orm获取关联表里的属性值
Apr 17 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
php变量与数组相互转换的方法(extract与compact)
Dec 02 PHP
PHP实现一个限制实例化次数的类示例
Sep 16 PHP
laravel 获取某个查询的查询SQL语句方法
Oct 12 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
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
python使用marshal模块序列化实例
2014/09/25 Python
提升Python程序运行效率的6个方法
2015/03/31 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
numpy自动生成数组详解
2017/12/15 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
解决Python一行输出不显示的问题
2018/12/03 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
2019/04/29 Python
解决pandas展示数据输出时列名不能对齐的问题
2019/11/18 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
努比亚手机官网:nubia
2016/10/06 全球购物
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
幼儿园新学期寄语
2014/01/18 职场文书
五分钟演讲稿
2014/04/30 职场文书
篮球赛口号
2014/06/18 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
升学宴演讲稿
2014/09/01 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
教师考核鉴定意见
2015/06/05 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js