奇妙的smarty快函数smarty_block_name,以插件扩展Smarty之一

[ 2020-05-09 13:49:11 | 作者: admin ]
字号: | |
本文内容实属不理解块函数原理,详细分析还请看本人另外一篇blog,smarty_block_name解惑篇 http://blog.xg98.com/article.asp?id=2669

p.s.本人非常讨厌任何模板语法,能不用就不用。关于smarty的plugin扩展,官方文档惜字如金,实在看的不明不白 https://www.smarty.net/docs/zh_CN/plugins.block.functions.tpl
当block中涉及变量,如果直接赋予字符串没有问题,如果给予一个变量常常就不对头了。

结果正确:
   $smarty->assign("title", "这是标题");

结果错误:
$smarty->assign("title", $item[title]);

百度了很多文档是在$smarty插个数组变量来保存数据,$smarty->blocksdata[$dataindex] ,我测试居然不允许自定义变量,估计版本兼容问题。
如下面这个文章:
使用smarty block功能自定义模板标签 https://blog.csdn.net/sudoers/article/details/5982987

另外如果涉及block循环多次访问的,需要定义index,iteration,first,last ,可以参考
使用smarty block功能自定义数据库查询模板标签 http://www.html580.com/6558

后来找到可以使用 $GLOBALS全局变量来存储数据和赋值给block,亲测有效,做个记录,高手在民间!!
如下面这个文章:
Smarty自定义block标签 转自:https://my.oschina.net/csensix/blog/847739
工作原因,需要用到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;
}

3 标签调用
         {vendor as="vendor"}
         供应商名称:{$vendor.name}
         供应商地址:{$vendor.address}
         {/vendor}




****************************************************************************************************
smarty块函数. 以插件扩展Smarty,官方函数参考和说明
****************************************************************************************************
function smarty_block_translate($params, $content, Smarty_Internal_Template $template, &$repeat)
{
         // 只在结束标签时输出
         if(!$repeat){
                if (isset($content)) {
                     $lang = $params['lang'];
      // 翻译$content的内容
                     return $translation;
                }
         }
}


  块函数的形式是:{func} .. {/func}。 换句话说,它们用标签圈起一个块,然后对这个块的内容进行操作。 块函数优先于同名的自定义函数, 这样,你不能同时有自定义函数{func}和块函数{func}..{/func}。

        默认你的函数将被Smarty调用两次,在开始标签位置调用和在结束标签位置调用。 (参考下面如何通过$repeat来改变这种情况)

        从Smarty 3.1开始,开始标签的返回值将会被显示。

        块函数只有在开始标签时才有 属性。 模板中传递给块函数的属性都包含在$params参数数组中。 在处理结束标签时,这些属性也是可用的。

        $content的值,取决于函数在执行开始标签还是结束标签。 当在开始标签时,它会是null; 当在结束标签时,它会是模板块里面全部的内容。 注意模板块已经是被Smarty处理过的,所以你得到的内容是模板块的输出内容,而不是模板块的源代码。

        $repeat是一个引用值,能控制块可以被显示多少次。 当块函数被第一次调用时(开始标签),$repeat默认是true; 随后的调用(结束标签)都是false。 每次当块函数返回时将$repeat设成true, {func}...{/func}间的内容会被再次计算, 计算结果保存$content参数内, 在并且函数将被再次执行。

如果使用了嵌套的块函数, 可以通过$smarty->_tag_stack变量来找到父块的函数。 只要对其用一下var_dump() 就可以知道整个层次结构了。
[最后修改由 admin, 于 2020-05-14 21:29:52]
评论Feed 评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=2667

这篇日志没有评论。

此日志不可发表评论。