我有一个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。
答案 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)
示例:
$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文件。