頁面配置
在這個單元中我們將看到如何使用模板標籤系統構造一個標準的模板頁面。這個例子我們使用了一個簡單的HTML頁面配置,請看:
這個頁面有多個標準單元組成,就像頁面設計者和開發人員熟悉的那樣.這個頁面的主體由3個包含的單元組成:頁首,頁內容主體和頁尾.我們現在就看看這些單元並且瞭解如何使用模板標籤系統來實現.
頁主體
下面的代碼單元顯示的是主體:
The Page Body Layout
1
<@ saleMonth = data.getValueBean('SALE_MONTH') @>
<@ saleTitle = data.getValueBean('SALE_TITLE') @>
<@ dealHeading = data.getValueBean('DEAL_HEADING') @>
<@ salesAreaID = "Central District" @>
<br/>2 <@ =viewConfig.getAppTitle @><br/>
3 <@ include 'pageHeader.ssp' @> |
4 <@ include 'sale/pageContent.ssp' @> |
5 <@ include 'pageFooter.ssp' @> |
1:頁聲明
第一個有趣的條目是頁頂部的頁聲明(1).我們在頁面開始聲明了這些變數,因此這些變數將能在下面的頁面和像頁首那樣的包含頁所使用.
2:網頁標題
下一步我們使用運算式來初始化頁面標題(2).這個值能夠從設定檔中view-resources元素利用ViewResourcesConfig->getAppTitle來得到:
appTitle = "Flash Jacks' Sleek Tab Site"
...
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結點來重新定義他們,就像這樣:
...
tplDir = "./WEB-INF/tpl-admin"
tplDirC = "./WEB-INF/tpl_admin_C"
...
4:頁內容主體
這是另外一個包含指令被用來插入模板檔案(4)到主體中.注意包含的檔案位於模板目錄的sales子目錄中:
"./WEB-INF/tpl/sale/pageContent.ssp"
5:頁尾
又是一個包含指令,就像頁首一樣.
頁首單元
在這個例子中頁首模板檔案('pageHeader.ssp')只是一個簡單的單元,就像這樣:
<@ =viewConfig.getAppTitle @>
當主體頁面(包括包含的頁面)被編譯的時候,頁首的運算式被轉換成下面這樣:
getAppTitle(); ?>
被編譯的頁面被儲存在編譯模板目錄中,就像上面所說的,預設的編譯模板目錄是:
'./WEB-INF/tpl_C'
頁內容主體單元
頁內容主體模板檔案有一點複雜.檔案('sale/pageContent.ssp')內容顯示如下:
...
1
<@ item1=data->getValueBean("ITEM_1") @>
<@ products=data->getValueBean("PRODUCTS_ARRAY") @>
2
<@=dealHeading @> <@=saleMonth @>
3
Clearance deals
<@ =item1.getName @> |
<@ =item1.getCost @> |
4
Todays specials
<@ =item.getName @> |
<@ =item.getCost @> |
Our Staff at Your Service
...
5
Area Manager: |
<@ =viewConfig.getAreaManager @> |
...
1:一些更多的聲明
在頁面頂部所顯示的額外聲明(1)能讓我們聲明頁變數以便下面能夠使用.在內容被處理之後,這些聲明將在編譯後像下面這樣顯示:
getValueBean("ITEM_1"); ?>
...
getValueBean("PRODUCTS_ARRAY"); ?>
2:使用運算式來顯示內容單元標題
現在我們使用兩個運算式(2)來顯示內容單元的標題.注意我們聲明這些變數是"全域"變數在首頁面的頂部.處理完後,運算式將轉換這些代碼,就像這樣:
當頁面被顯示到使用者的瀏覽器中,內容單元的標題看起來就像這樣:
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迴圈中我們能使用運算式來顯示產品資料:
<@ =item.getName @>
<@ =item.getCost @>
5:顯示ViewResourcesConfig屬性
最後我們從view-resources元素所定義的ViewResourcesConfig屬性來顯示"Area Manager"(5)在我們的內容頁:
appTitle = "Flash Jacks' Sleek Tab Site"
...
className = "MyViewResourcesConfig">
但是注意在這個例子中我們使用了一個繼承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')就像這樣:
<@ =viewConfig.getCopyright @>
當主體頁面(包括包含的頁面)被編譯,在頁尾中的運算式被轉換成下面這樣:
getCopyright(); ?>
編譯的頁首頁面被儲存在編譯模板目錄.預設的編譯模板目錄是:
'./WEB-INF/tpl_C'