[英]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.