0

我有一个 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>inside Outer Template

我能够找到创建模块来执行类似操作的人,但我不知道如何从模板中设置必要的变量以使其适用于我的情况。我正在使用 Smarty 3。

4

3 回答 3

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}

旁注:

我了解希望在 HEAD 中使用包含样式表的 W3 兼容,但将它们包含在正文中不会破坏您的 html,即使在 IE7 中也是如此......

于 2013-01-08T17:47:06.640 回答
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 添加到你的 head 部分。

于 2013-01-09T12:49:40.023 回答
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 文件。

于 2013-01-08T17:53:17.773 回答