Smarty模板引擎 - 动态添加块

时间:2014-12-12 14:31:44

标签: php smarty

[抱歉我的英语不好]

我正在尝试让我的php动态添加到我的模板中以调用母版块。下面是我目前显示的模板代码和母版页。

------------------- default.tpl ---------------------- ---

<!-- default.tpl -->
<!doctype html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8" />
    <title>Project</title>
</head>
<body>
    <div class="container">
        {block name="content"}{/block}
    </div>
    {block name="javascript"}{/block}
</body>

------------------- index.tpl ---------------------- ---

{extends file="default.tpl"}
{block name="content"}
    Hello World 
{/block}

------------------- index.php ---------------------- ---

$this->smarty->extends('default.tpl'); //I don't know if is possible do something like this

$this->smarty->blocks('javascript',array('//cdn.jquery.com')); //I don't know if is possible do something like this too

$this->smarty->display('index');

2 个答案:

答案 0 :(得分:1)

Smarty几乎按照你描述的方式工作,但语法略有不同。这就是你需要写它的方式:

default.tpl (片段)

<body>
<div class="container">
    {$text}
</div>
{foreach from=$javascript item=script}
    <script src="{$script}"></script>
{/foreach}
</body>

<强>在index.tpl

{capture name=content}
    Hello world
{/capture}
{include file='default.tpl' text=$smarty.capture.content}

<强>的index.php

$this->smarty->assign('javascript', array('//cdn.jquery.com'));
$this->smarty->display('index.tpl');

这就是Smarty的工作方式。有关详细信息,请阅读documentation。基本用法在第3-13节中解释。

更新:此解决方案提供了Smarty 2的处理方式。此外,链接转到Smarty 2的文档。我不知道Smarty 3中实现的所有新功能。但是,这里介绍的方式也适用于Smarty 3(我使用Smarty 3)自2010年以来,但从未感觉到需要Smarty 2中没有的功能。)

答案 1 :(得分:1)

两个模板文件都很好看。问题出在PHP文件中:

$this->smarty->extends('default.tpl'); //I don't know if is possible do something like this

没有名为extends()的方法。在模板中使用模板函数{extend}

$this->smarty->blocks('javascript',array('//cdn.jquery.com')); //I don't know if is possible do something like this too

没有名为block()blocks()的方法。您可以使用与index.tpl相同的方式在子模板(content)中定义块的内容,也可以将数据分配给模板变量并将其显示在模板中。标量变量可以使用语法{$variable}显示,而数组可以使用{foreach}内置函数进行迭代。

$this->smarty->display('index');

这也不起作用,因为模板的名称是'index.tpl',而不只是'index'。 Smarty不会自行附加终止。它只是尝试使用您提供的名称查找文件。

我通过添加

找到了脚本无法正常工作的所有原因
error_reporting(E_ALL);
ini_set('display_errors', '1');

在您的脚本之上。 不要阻止PHP在开发计算机上显示错误。在生产服务器上执行此操作