我有一个聪明的项目:
请参见test.php
:
<?php
require($_SERVER['DOCUMENT_ROOT'] . '/smartyHeader.php');
function test1($args){
$str="test1";
return $str;
}
$smarty->registerPlugin('block' ,'hsp', 'test1');
$smarty->display('php/test.tpl');
其test.tpl
:
<html>
<head>
<title> Ho </title>
</head>
<body>
{hsp times="1"}{/hsp}
</body>
</html>
您看到我只调用一次hsp
函数。
但浏览器显示两次结果:
edit-01
smartyHeader.php
只是创建聪明的实例:
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/libs/Smarty.class.php');
$smarty = new Smarty();
$smarty->caching = true;
$smarty->cache_lifetime = 120;
$smarty->template_dir = $_SERVER['DOCUMENT_ROOT'].'/templates';
$smarty->compile_dir = $_SERVER['DOCUMENT_ROOT'].'/templates_c';
答案 0 :(得分:0)
尝试使用此功能
function test1($params, $content)
{
if( $content !== null )
{
$str="test1";
return $str;
}
}
或
function test1($params, $content, &$smarty, &$repeat)
{
if( $repeat === false )
{
$str="test1";
return $str;
}
}
您的自定义函数被smarty调用了两次,一次是在代码块的开头,另一次是在代码块的结束标记,您可以测试$content === null
(必须明确为null)还是$repeat === false
https://www.smarty.net/docsv2/en/plugins.block.functions.tpl
默认情况下,Smarty会两次调用您的函数实现:一次用于开始标记,一次用于结束标记。 (有关如何更改此设置,请参见下面的$ repeat。)
$ content变量的值取决于是否为开始或结束标记调用了函数。如果是开始标记,则为NULL,如果是结束标记,则为模板块的内容。请注意,模板块已经由Smarty处理过,因此您将收到的只是模板输出,而不是模板源。
和
参数$ repeat通过引用传递给函数实现,并提供了控制该块显示多少次的可能性。默认情况下,在第一次调用块函数(开始标记)时,$ repeat为TRUE,而在随后对块函数的所有调用(块的结束标记)中为FALSE。每次函数实现以$ repeat为TRUE返回时,将评估{func} ... {/ func}之间的内容,并使用参数$ content中的新块内容再次调用该函数实现。