首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

編寫 Smarty 插件在模板中直接載入資料的完整指南

     編輯:PHP 綜合知識

背景問題

傳統 Smarty 開發模式:PHP 端讀取資料庫資料,assign 給模板變數,模板再用 foreach 輸出。當資料模組眾多時,PHP 端控制器程式碼冗長難維護。

解決方案:自定義函數插件

建立 function.load_data.php 放入 Smarty plugins 目錄,實現模板內直接查詢資料並賦值。

插件完整程式碼

<?php
/**
 * Smarty {load_data} function plugin
 * @package Smarty
 * @subpackage plugins
 */
function smarty_function_load_data($params, &$smarty)
{
    // 參數預設與檢查
    $class = (!isset($params['class']) || empty($params['class'])) ? 'cls_crud' : trim($params['class']);
    (!isset($params['table']) || empty($params['table'])) && exit('`table` is empty!');

    // 實例化資料存取類別
    $db = $class::factory(array('table' => $params['table']));

    // 若指定 assign 參數,將查詢結果賦值給模板變數
    if (!empty($params['assign'])) {
        $smarty->assign($params['assign'], $db->get_block_list(array($params['where']), $params['limit']));
    }
}
?>

模板使用範例

{load_data assign="list" table="test" where="`id`<100" limit=10}
{foreach from=$list item=rec}
    ... 輸出 $rec ...
{/foreach}

進階優勢

  1. 維護性提升:資料查詢邏輯從控制器移至模板,模組化明確。
  2. 統一格式化與過濾:插件內可統一處理資料庫查詢的欄位過濾、資料清洗、快取策略等。
  3. 靈活擴充:支援自訂 class 擴充不同資料來源(如 API、快取層)。

注意事項

  • 插件僅適用於「讀取並賦值」場景,複雜業務邏輯仍建議在控制器處理。
  • 生產環境務必加入 SQL 注入防護(如參數綁定)與權限控管。
  • 避免在迴圈中重複呼叫導致 N+1 查詢問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved