Smarty自定义block标签
博客专区 > csensix 的博客 > 博客详情
Smarty自定义block标签
csensix 发表于9个月前
Smarty自定义block标签
  • 发表于 9个月前
  • 阅读 45
  • 收藏 0
  • 点赞 0
  • 评论 0

工作原因,需要用到smarty模板引擎。使用中发现有一个不太方便的地方,就是模板里的所有动态数据都要通过相应的php文件传递过来,每次调整都需要修改多个地方。而且,对于变化较多的前端数据要求,后端人员不太容易把所有数据形式都提前准备好,只能不断修改,这样就造成很高的后期维护成本。

后来就想看看smarty能不能实现一些自定义标签,通过传递不同参数,直接调取相关数据。这样一来,只要后端人员编写好调用方法,前端只需要使用相应标签即可,无需改动程序。具体实现方法如下:

1 在plugins目录下新建文件,比如 block.vendor.php

2 函数实现

// $smarty 变量的地址引用很关键,否则标签读取不到相关数据,$smarty是你实例化Smarty类时定义的变量名,可能会与此不一致
function smarty_block_vendor($params, $content, &$smarty, &$repeat)
{
    global $db;
    extract($params);
    if (! isset ( $as ))
        $as = 'v'; // 返回的变量数组名,
    
    $dataindex = md5 ( __FUNCTION__ . md5 ( serialize ( $params ) ) );
    $dataindex = substr ( $dataindex, 0, 16 );

    $results = array();
    
    // $GLOBALS['__SMARTY_PROD'][$dataindex] 全局变量用于存储数据,可多次执行,循环输出
    if (!$GLOBALS['__SMARTY_PROD'][$dataindex]) {
        $results = $db->get_results("SELECT * FROM vendor", ARRAY_A);
        
        $GLOBALS['__SMARTY_PROD'][$dataindex] = $results;
    }
    if (!is_array($GLOBALS['__SMARTY_PROD'][$dataindex])) {
        $repeat = false;
        return '';
    }
    
    if (list($key, $item) = each($GLOBALS['__SMARTY_PROD'][$dataindex])) {
        $smarty->assign($as, $item);
        $repeat = true;
    } else {
        $repeat = false;
    }
       
    echo $content;
}

>至于为何这样写,可参考 smarty 手册的 块函数

###3 标签调用

{vendor as="vendor"}
供应商名称:{$vendor.name}
供应商地址:{$vendor.address}
{/vendor}
共有 人打赏支持
粉丝 3
博文 26
码字总数 9357
×
csensix
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: