2013-01-08 110 views
0

我有一個網站,其結構相當複雜,可以使用Smarty模板。對於這個問題,假設我有一個外模板,其包括(與{include}),其任選地包括一個或多個內模板,這取決於正在顯示的數據:使用Smarty將內容添加到內部模板的外部模板

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

有時,這些內模板之一需要引用額外的CSS文件。我寧願在我的<head>標籤中使用這些標籤,以提高效率並避免FOUC。是否可以設置Inner Template A中的某個變量,在Outer Template內將相應的<link>標記添加到<head>

我能找到創建a module to do something similar的人,但我不知道如何從模板中設置必要的變量以使其適用於我的情況。我使用Smarty的3

回答

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添加到你的頭部。

+0

有趣的想法!謝謝。 – Brad

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兼容包括在頭,但包括他們的樣式表在身體內不會打破你的HTML,即使在IE7 ...

+0

想法1就是我現在要做的。我們在樣式表中有樣式表,而且確實有效。但是,當JavaScript處於''時,很容易出現FOUC問題。我會研究'{block}'。謝謝! – Brad

+0

@Brad Javascript confilcts可以使用onload declorations來解決。 –

+0

我知道。這是一個相當複雜的混亂。直到我有足夠的時間來解決這個問題,這就是我正在嘗試做的事情。我有13,000個模板來爭吵,還有一堆JavaScript來重構。另外,我正在查看'{block}',它似乎只適用於繼承模板。我的模板只是使用'{include}'。 – Brad

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文件。

+0

感謝您的想法。不幸的是,我不認爲這會適用於我的情況。只有內部模板具有它所需要的CSS文件的名稱,並且如果我要從該內部模板設置變量,我相信外部模板已經被處理。 – Brad