奇妙的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插个数组变量来保存数据,$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 函数实现
3 标签调用
****************************************************************************************************
smarty块函数. 以插件扩展Smarty,官方函数参考和说明
****************************************************************************************************
块函数的形式是:{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() 就可以知道整个层次结构了。
评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=2667
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;
}
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}
供应商名称:{$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;
}
}
}
{
// 只在结束标签时输出
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]

这篇日志没有评论。
此日志不可发表评论。