Smarty模板两次显示功能结果

时间:2018-07-18 12:40:44

标签: php smarty

我有一个聪明的项目:

请参见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函数。

但浏览器显示两次结果:

enter image description here


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';

1 个答案:

答案 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中的新块内容再次调用该函数实现。