PHP.MVC 框架的模板標籤系統(PhpMVC_Tags)提供三類標籤,讓視圖層具備動態內容生成、模組化佈局與配置驅動的能力。本文詳細解析各類標籤語法、配置機制與 ActionDispatcher 整合方式。
將內容模組化,支援頁眉、頁腳、側邊欄等可重用片段。被包含頁面可為 HTML 或其他標籤模板。
<@ include 'pageHeader.ssp' @>
<@ include 'pageFooter.ssp' @>
在模板中宣告頁面級變數,甚至跨包含頁面共享。
<@ salesAreaID = "Central District" @>
<@ pageTitle = "產品列表" @>
<@ user = $session.user @> {* 也可引用物件 *}
在模板中執行表達式並輸出結果,支援變數輸出、方法呼叫、屬性存取。
<@ =salesAreaID @> {* 輸出變數 *}
<@ =viewConfig.getAreaManager() @> {* 呼叫方法 *}
<@ =$product.price * $product.quantity @> {* 運算表達式 *}
<@ =date('Y-m-d H:i:s') @> {* PHP 內建函式 *}
語法提醒: 表達式標籤以
=開頭,類似 JSP 的<%= %>或 ASP.NET 的<%: %>。
PHP.MVC beta 0.4.0 引入 ViewResourcesConfig 類,透過 .phpmvc-config.xml 的 <view-resources> 元素配置:
<view-resources
appTitle="Flash Jacks' Sleek Tab Site"
copyright="Copyright @ 2010 Flash Jack. All rights reserved."
contactInfo="flash.jack@jackshost.com"
processTags="true"
compileAll="true"
className="MyViewResourcesConfig">
<!-- 自訂屬性注入 -->
<set-property property="areaManager" value="Joe J. Blogs Esq." />
</view-resources>
| 屬性 | 類型 | 預設值 | 說明 |
|---|---|---|---|
| processTags | boolean | false | 是否處理標籤頁面。開發階段建議 true,生產可設 false 提升效能 |
| compileAll | boolean | false | true=編譯所有模板;false=僅編譯修改過的模板(增量編譯) |
| className | string | ViewResourcesConfig | 自訂配置類名稱,需繼承 ViewResourcesConfig |
| appTitle, copyright... | string | - | 自訂全域屬性,可在模板中透過 viewConfig.getAppTitle() 存取 |
<?php
class MyViewResourcesConfig extends ViewResourcesConfig {
private $areaManager;
public function getAreaManager() {
return $this->areaManager;
}
public function setAreaManager($value) {
$this->areaManager = $value;
}
// 可新增更多業務相關的 getter/setter
}
?>
<!-- Page Header -->
<span>
<@ =viewConfig.getAppTitle() @>
</span>
<div class="footer">
<@ =viewConfig.getCopyright() @> | <@ =viewConfig.getContactInfo() @>
</div>
ActionDispatcher(beta 0.4.0+ 預設 Dispatcher)負責將四類核心物件暴露給視圖模板:
| 物件類型 | 用途 | 在控制器中儲存 | 在模板中取用 |
|---|---|---|---|
| FormBean | 表單資料封裝 | $this->saveFormBean($request, $this) (FormAction)$this->saveFormBean($request, $form) (Action) | $form->username |
| Errors | 驗證錯誤訊息 | $this->saveErrors($request, $actionErrors) | $errors->getItemString('Logon_username_reqd') |
| Value (ValueObject) | 業務資料(商務物件) | $this->saveValueObject($request, $valueObject) | $data->salesNorth |
重要: 若物件未先建立並儲存,模板中取用時將為 NULL。詳細文件請參考:ActionObjects 指南
ActionDispatcher 自動將配置好的 ViewResourcesConfig 實例作為 viewConfig 變數暴露給模板。若未配置,將使用預設類別實例。
<view-resources
appTitle="會員系統"
copyright="Copyright 2024 MyApp Inc."
processTags="true"
compileAll="true"
className="AppViewConfig">
<set-property property="siteName" value="MyApp" />
</view-resources>
<?php
class AppViewConfig extends ViewResourcesConfig {
private $siteName;
public function getSiteName() { return $this->siteName; }
public function setSiteName($v) { $this->siteName = $v; }
}
?>
<?php
class LoginAction extends Action {
public function execute() {
$form = new LoginForm();
$form->username = $_POST['username'] ?? '';
$form->rememberMe = isset($_POST['remember']);
// 儲存 FormBean
$this->saveFormBean($this->getRequest(), $form);
// 驗證失敗時儲存 Errors
if ($_POST && !$form->validate()) {
$this->saveErrors($this->getRequest(), $form->getErrors());
}
// 成功時儲存 ValueObject
if ($form->isValid()) {
$userData = UserService::login($form->username, $form->password);
$this->saveValueObject($this->getRequest(), $userData);
}
return $this->findForward('login');
}
}
?>
<@ include 'header.ssp' @>
<h1><@ =viewConfig.getSiteName() @> - 會員登入</h1>
<form method="post" action="">
<div class="field">
<label>帳號:</label>
<input type="text" name="username" value="<@ =$form->username @>" />
<@ if ($errors->hasErrors('username')) { @>
<span class="error"><@ =$errors->getItemString('username') @></span>
<@ } @>
</div>
<div class="field">
<label>密碼:</label>
<input type="password" name="password" />
<@ if ($errors->hasErrors('password')) { @>
<span class="error"><@ =$errors->getItemString('password') @></span>
<@ } @>
</div>
<div class="field">
<label><input type="checkbox" name="remember" <@ =$form->rememberMe ? 'checked' : '' @> /> 記住我</label>
</div>
<button type="submit">登入</button>
</form>
<@ if (isset($data)) { @>
<div class="success">
歡迎回來,<@ =$data->fullName @>!
最後登入:<@ =$data->lastLogin @>
</div>
<@ } @>
<@ include 'footer.ssp' @>
若需在模板中使用更豐富的標籤邏輯(如迴圈、條件判斷、自訂標籤),可配置替代的 TagActionDispatcher:
<!-- 在 .phpmvc-config.xml 中 -->
<controller className="TagActionDispatcher" />
這將啟用擴展標籤語法:
<@ foreach $products as $product @>
<div class="product">
<h3><@ =$product->name @></h3>
<span class="price"><@ =$product->price @></span>
</div>
<@ endforeach @>
<@ if $user->isAdmin @>
<a href="/admin">管理後台</a>
<@ endif @>
compileAll="false"、processTags="true",啟用模板快取compileAll="true" 確保修改即時生效PHP.MVC 模板標籤系統透過包含指令、宣告、表達式三大標籤,配合 ViewResourcesConfig 全域配置與 ActionDispatcher 資料暴露機制,提供了強大且彈性的視圖層解決方案。善用配置驅動與 ActionObjects 模式,能構建清晰分離、易於維護的 MVC 應用。