使用outputbuffer划分Smarty tpl,没有结构损坏

时间:2014-05-11 02:38:31

标签: php smarty3

我希望对每个fetch ed tpl进行分隔,以便之后使用JavaScript识别它 这是我的代码:

if( ! function_exists('ate_output')){
    function ate_output($tpl_output, &$smarty){
        $tpl = $smarty->template_resource;
        $open = "<div class='ate-div' dta-tpl='$tpl'>";
        $close = "</div>";
        $tpl_output = $open . $tpl_output . $close;
        return $tpl_output;
    }
}

...

$smarty->registerFilter('output','ate_output');

是否有更好的方法来划分tpl,而不会有破坏原始布局的风险?

3 个答案:

答案 0 :(得分:2)

由于div是一个块元素,因此布局可能会中断,如果布局中断,您可以尝试.ate-div{display:inline;}

答案 1 :(得分:1)

在这种情况下,您可以做的最好的事情是使用一些内联标记作为评论中已经提到过的人。它不应该破坏你的布局,但我认为你应该选择你不使用或几乎不在这个网站上使用的标签。否则它可能需要CSS中的一些样式,并且布局会被破坏。

所以你可能会使用一些标签:b,font,big,small,u假设你没有在你的布局中使用它们,并将它们设置为不影响CSS中的布局。

例如,你可以在CSS中使用b标签:

b {font-weight: normal;}

或者您可以简单地为元素添加样式,以便打开时可以设置:

$open = "<b class='ate-div' dta-tpl='$tpl' style='font-weight: normal;'>";

答案 2 :(得分:1)

您可以使用将document.write tpl_output的标记。这将为您提供在客户端javascript中使用的tpl名称和输出。

if( ! function_exists('ate_output')){
    function ate_output($tpl_output, &$smarty){
        $tpl = json_encode($smarty->template_resource);
        $tpl_output = json_encode($tpl_output);
        return <<<EOT
<script type="text/javascript">
var tpl = {$tpl}; // use this however you'd like
var tpl_output = {$tpl_output};
document.write(tpl_output); // gross, but it works
</script>
EOT;
    }
}