簡體   English   中英

PHP-Smarty模板-如何創建上下文獨立模板

[英]PHP - Smarty templates - How to create context independant templates

我已經開始學習Smarty模板引擎,希望它可以讓我做我很難用PHP內置模板做的事情,但是我遇到了類似的問題。

假設我想創建可重用的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>

該模板將檢索在控制器部分中分配的變量“ entries”:

$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”,因此顯然它將失敗。 由於這兩個手風琴不一定具有相同的條目,所以我被迫將這些條目分配給兩個不同的變量。

請問我該怎么做才能使其一起工作?

謝謝你的幫助 :)

當您從另一個模板中{include}一個模板時,可以“傳入”在該模板中使用的變量(有點像函數參數)。 因此,如果您有一個頁面布局的整體模板,例如$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}

不知道我是否理解正確,但是如果您想多次使用具有相同模板樣式的數據,而又不分配新變量並將其顯示到新模板,則可以僅使用此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;
}
?> 

如果仍然不是您的情況,我將嘗試尋找其他解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM