使用Smarty从内部模板向外部模板添加内容

时间:2013-01-08 17:43:43

标签: smarty smarty3

我有一个Smarty模板结构相当复杂的网站。对于这个问题,假设我有一个外部模板,其中包含(带有{include})一个或多个可选的内部模板,具体取决于显示的数据:

Outer Template (with <html>, <head>, and <body> tags)
    - Inner Template A (various content)
    - Inner Template B (more content)

有时,其中一个内部模板需要引用其他CSS文件。我希望在我的<head>标签中包含这些内容,以提高效率并避免FOUC。是否可以设置Inner Template A中的某个变量,该变量会在<link>内将<head>标记添加到Outer Template

我找到了创建a module to do something similar的人,但我不知道如何从模板中设置必要的变量以使其适用于我的情况。我正在使用Smarty 3。

3 个答案:

答案 0 :(得分:1)

创意1:

围绕用于显示模板A或B的样式表中的相同逻辑包装。

创意2:

模板1(顶级):

<link rel="stylesheet" type="text/css" href="whatevs1">
{block name="childStyles"}
{/block}

模板2(子模板):

{block name="childStyles"}
<link rel="stylesheet" type="text/css" href="whatevs2">
{/block}

附注:

我理解想要符合W3标准,使用HEAD样式表中的包含,但在体内包含它们不会破坏你的HTML,即使在IE7中......

答案 1 :(得分:1)

前段时间我有类似的问题。我的解决方案可能很脏但也许它可以帮助你。

$css = '<link rel="stylesheet" type="text/css" href="/css/file.css">';
$smarty->registerFilter('output',create_function('$output','return preg_replace(\'/(<\/head>)/i\',\''.$css.'$1\',$output,1);'));

如果你将它包装在一个函数中,你可以从任何地方简单地将css添加到你的头部。

答案 2 :(得分:0)

几年前我遇到了类似的障碍。由于smarty模板几乎一直充满了php代码,我的解决方案就是在php中为此目的声明一个特殊的变量/数组,然后在头模板/外模板中循环遍历数组。

示例:

$your_special_css = array('css1.css', 'css2.css');

代码中的其他地方......

$your_special_css[] = 'css3.css';

...然后将其提供给模板:

$your_smarty_template->assign('your_css', $your_special_css);

然后您的外部模板将如下所示:

<head>
 ...
{foreach $your_css as $css}
    <link rel="stylesheet" type="text/css" href="/css/{$css}">
{/foreach}
...
</head>

同样适用于jscript文件。