2013-04-24 62 views
0

我已經開始學習Smarty模板引擎,希望它能夠幫我做PHP內置模板的困難時間,但我遇到過類似的問題。PHP-Smarty模板 - 如何創建上下文無關模板

我們假設我想創建可重用的HTML代碼片段,例如手風琴菜單。我的模板看起來像:

Accordion.tpl:

<div class="Accordion"> 

    {foreach from=$entries item=entry} 

    <div class="AccordionEntry"> 
     <div class="AccordionTab"> 
      {$entry.tab} 
     </div> 
     <div class="AccordionContent"> 
      {$entry.content} 
     </div> 
    </div> 

    {/foreach} 

</div> 

此模板將檢索控制器部分分配變量 「條目」:

$smarty = new Smarty(); 

$smarty->assign('entries', [ 
    ['tab' => 'tab_00', 'content' => 'content_00'], 
    ['tab' => 'tab_01', 'content' => 'content_01'], 
    ['tab' => 'tab_02', 'content' => 'content_02'] 
]); 

$smarty->display('Accordion.tpl'); 

這將正常工作。 但是,如果我想在多個地方重複使用此手風琴模板,該怎麼辦? 數據可分配是這樣的:

$smarty->assign('leftMenuEntries', [ 
    ['tab' => 'tab_00', 'content' => 'content_00'], 
    ['tab' => 'tab_01', 'content' => 'content_01'], 
    ['tab' => 'tab_02', 'content' => 'content_02'] 
]); 

$smarty->assign('rightMenuEntries', [ 
    ['tab' => 'tab_00', 'content' => 'content_00'], 
    ['tab' => 'tab_01', 'content' => 'content_01'], 
    ['tab' => 'tab_02', 'content' => 'content_02'] 
]); 

這裏是我的問題:模板「Accordion.tpl」永遠檢索變量「項」數據,但在這裏我用「leftMenuEntries」和「我rightMenuEntries「,所以顯然會失敗。由於兩個手風琴不一定具有相同的條目,我不得不將這些條目分配給兩個不同的變量。

我能做些什麼來使這項工作在一起嗎?

感謝您的幫助:)

回答

2

當您從另一個模板中獲得一個模板時,您可以「傳入」用於該模板的變量(有點像函數參數)。因此,如果您有一個頁面佈局的整體模板,例如呈現爲$smarty->display('Homepage.tpl'),你可以有多個手風琴,就像這樣:

{* pull entries out of $entries, as nothing else specified *} 
{include file=Accordion.tpl} 

{* pull entries out of $leftMenuEntries, which will be named as $entries inside the included file *} 
{include file=Accordion.tpl entries=$leftMenuEntries} 

{* the same, but this time we "pass in" $rightMenuEntries *} 
{include file=Accordion.tpl entries=$rightMenuEntries} 
+0

謝謝我認爲這就是我一直在尋找的!我會在我回家時嘗試它。非常感謝您的幫助! – Virus721 2013-04-25 07:02:23

1

不知道如果我理解正確的,但如果你想用相同的模板風格多次使用數據,不分配新的變量,並顯示新的模板,你都不可能僅使用此div創建Accordion.tpl,並將其包含在您想要數據的每個模板中。

{include file='Accordion.tpl'} 

在它上面將檢索具有相同名稱的變量,如果它分配給主模板,無以Accordion.tpl

但是,如果問題的核心是在的情況下覆蓋陣列中,我發現,在PHP.net array_merge主題:

<?php 
// you have two arrays: 

array1 = array (['0'] =>"blahblupp", 
         ['1'] => "bluppblah"); 

array2 = array (['0'] =>"tirili", 
         ['1'] => "tralala"); 

// and want following as a result: 

result = array (['0'] =>"blahblupp", 
         ['1'] => "bluppblah", 
         ['2'] =>"tirili", 
         ['3'] => "tralala"); 

// following function does the addition: 

function array_add($array1, $array2) 
{ 
    $result = $array1; 
    $h = sizeof($array1); 
    for ($i = 0; $i < sizeof($array2); $i++) 
    { 
     $result[$h] = $array2[$i]; 
     $h++; 
    } 

    return $result; 
} 
?> 

如果它仍然不是你的情況,我會嘗試尋找另一種解決方案

+0

感謝您的幫助,但我不明白您的建議。我的問題是,我的手風琴模板將始終從變量「條目」中獲取所需的數據。如果我有一個手風琴,並將數據放在「條目」中,那很好,但是如果我有多重手風琴,我應該在哪裏放置數據?如果我把它放在「條目」中,第N + 1號手風琴的數據將刪除第N條數據。如果我把每個數據放在一個不同的變量中,模板將不知道從哪裏獲取它。 – Virus721 2013-04-24 20:15:13

+0

嗯,不合並數組內的PHP解決方案?我正在編輯與我發現的例子的答案 – 2013-04-24 20:20:58

+0

Nah我不需要合併或連接數組。我希望我的Accordion模板完全獨立,這意味着我希望它從同一個地方檢索它需要的數據,而不管數據如何存儲,以便我可以在應用程序內的多個地方重複使用它,甚至在多個應用程序中甚至不需要修改它。問題是,如果我想在同一頁面上添加兩個手風琴,並且有兩組獨立的條目,那麼這些手風琴中的每一個都必須從不同的地方檢索它們的數據。對不起,我不知道如何更好地解釋它。 – Virus721 2013-04-24 20:38:33