首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

PHP.MVC 模板標籤系統深度解析

     編輯:VC 教學

PHP.MVC 模板標籤系統概覽

PHP.MVC 框架的模板標籤系統(PhpMVC_Tags)提供三類標籤,讓視圖層具備動態內容生成、模組化佈局與配置驅動的能力。本文詳細解析各類標籤語法、配置機制與 ActionDispatcher 整合方式。

三大核心標籤類型

1. 包含指令

將內容模組化,支援頁眉、頁腳、側邊欄等可重用片段。被包含頁面可為 HTML 或其他標籤模板。

<@ include 'pageHeader.ssp' @>
<@ include 'pageFooter.ssp' @>
  • 路徑相對於模板根目錄
  • 支援巢狀包含
  • 編譯階段解析,效能優於運行時 include

2. 宣告標籤

在模板中宣告頁面級變數,甚至跨包含頁面共享。

<@ salesAreaID = "Central District" @>
<@ pageTitle = "產品列表" @>
<@ user = $session.user @>  {* 也可引用物件 *}
  • 作用域:當前模板及其後包含的子模板
  • 可覆蓋外層同名變數
  • 支援任意 PHP 表達式賦值

3. 表達式標籤

在模板中執行表達式並輸出結果,支援變數輸出、方法呼叫、屬性存取。

<@ =salesAreaID @>                          {* 輸出變數 *}
<@ =viewConfig.getAreaManager() @>          {* 呼叫方法 *}
<@ =$product.price * $product.quantity @>   {* 運算表達式 *}
<@ =date('Y-m-d H:i:s') @>                  {* PHP 內建函式 *}

語法提醒: 表達式標籤以 = 開頭,類似 JSP 的 <%= %> 或 ASP.NET 的 <%: %>。

ViewResourcesConfig 全域配置

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>

關鍵屬性說明

屬性類型預設值說明
processTagsbooleanfalse是否處理標籤頁面。開發階段建議 true,生產可設 false 提升效能
compileAllbooleanfalsetrue=編譯所有模板;false=僅編譯修改過的模板(增量編譯)
classNamestringViewResourcesConfig自訂配置類名稱,需繼承 ViewResourcesConfig
appTitle, copyright...string-自訂全域屬性,可在模板中透過 viewConfig.getAppTitle() 存取

自訂 ViewResourcesConfig 範例

<?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:連結控制器與視圖

ActionDispatcher(beta 0.4.0+ 預設 Dispatcher)負責將四類核心物件暴露給視圖模板:

三種標準 ActionObjects

物件類型用途在控制器中儲存在模板中取用
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 指南

ViewResourcesConfig 暴露機制

ActionDispatcher 自動將配置好的 ViewResourcesConfig 實例作為 viewConfig 變數暴露給模板。若未配置,將使用預設類別實例。

完整範例:登入頁面模板

配置檔 (.phpmvc-config.xml)

<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:標籤增強分發器

若需在模板中使用更豐富的標籤邏輯(如迴圈、條件判斷、自訂標籤),可配置替代的 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 類別,省去運行時解析
  • 避免濫用: 複雜邏輯應移至控制器或 ViewHelper,模板僅負責呈現

結語

PHP.MVC 模板標籤系統透過包含指令、宣告、表達式三大標籤,配合 ViewResourcesConfig 全域配置與 ActionDispatcher 資料暴露機制,提供了強大且彈性的視圖層解決方案。善用配置驅動與 ActionObjects 模式,能構建清晰分離、易於維護的 MVC 應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved