0

我已经开始学习 Smarty 模板引擎,希望它能让我用 PHP 内置模板做我很难做的事情,但我遇到了类似的问题。

假设我想创建可重用的 HTML 代码片段,例如手风琴菜单。我的模板看起来像:

手风琴.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”将始终从变量“entries”中检索数据,但这里我使用“leftMenuEntries”和“rightMenuEntries”,所以显然它会失败。由于两个手风琴不一定有相同的条目,我被迫将这些条目分配给两个不同的变量。

请问我该怎么做才能使这项工作一起工作?

谢谢你的帮助 :)

4

2 回答 2

2

当您{include}从另一个模板中获取一个模板时,您可以“传入”变量以在该模板中使用(有点像函数参数)。因此,如果您有一个页面布局的整体模板,呈现为 eg $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}
于 2013-04-24T20:53:09.463 回答
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;
}
?> 

如果仍然不是您的情况,我将尝试找到另一种解决方案

于 2013-04-24T20:03:41.610 回答