PHP - Smarty 模板 - 如何创建与上下文无关的模板

Posted

技术标签:

【中文标题】PHP - Smarty 模板 - 如何创建与上下文无关的模板【英文标题】:PHP - Smarty templates - How to create context independant templates 【发布时间】:2013-04-24 19:31:24 【问题描述】:

我已经开始学习 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”,所以很明显它会失败。由于两个手风琴不一定有相同的条目,我不得不将这些条目分配给两个不同的变量。

请问我该怎么做才能使这项工作协同工作?

感谢您的帮助:)

【问题讨论】:

【参考方案1】:

当您include 一个模板来自另一个模板时,您可以“传入”变量以在该模板中使用(有点像函数参数)。因此,如果您有页面布局的整体模板,例如呈现为$smarty-&gt;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

【讨论】:

谢谢,我想这就是我想要的!我回家的时候试试。非常感谢您的帮助!【参考方案2】:

不确定我是否理解正确,但是如果您想多次使用具有相同模板样式的数据,而不分配新变量并显示到新模板,您可以仅使用此 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;

?> 

如果仍然不是你的情况,我会尝试寻找其他解决方案

【讨论】:

感谢您的帮助,但我不明白您的建议。我的问题是我的手风琴模板将始终从变量“条目”中获取所需的数据。如果我有一个手风琴并将数据放在“条目”中,那很好,但如果我有多个手风琴,我应该把数据放在哪里?如果我把它放在“条目”中,第 N+1 个手风琴的数据将删除第 N 个的数据。如果我将每个数据放在不同的变量中,模板将不知道在哪里检索它。 嗯,在 php 中合并数组不是一个解决方案吗?我正在用我找到的示例编辑答案 不,我不需要合并或连接数组。我希望我的 Accordion 模板完全独立,这意味着我希望它从同一个地方检索它需要的数据,而不管数据是如何存储的,这样我就可以在应用程序内部的多个地方重用它,甚至在多个应用程序中,甚至无需修改它。问题是,例如,如果我想在同一页面上添加两个手风琴,并具有两组单独的条目,那么这些手风琴中的每一个都必须从不同的地方检索它们的数据。抱歉,我不知道如何更好地解释它。 这可能是我的问题,因为英语不是我的母语,有时听不懂。在您的情况下,您可以拥有一个包含所有数据的数组,但不要全部循环。不知道 foreach,但 for 循环得到了 startendstep。您可以将它们用作变量,并且只有在包含手风琴时才能预定义它们。 我想我明白你的意思了:将手风琴的所有条目集放入一个数组中,并且每个手风琴只使用其中的一部分。但问题还是一样:我在哪里存储开始和结束索引?它只会转移问题。 :(

以上是关于PHP - Smarty 模板 - 如何创建与上下文无关的模板的主要内容,如果未能解决你的问题,请参考以下文章

PHP 随笔---Smarty模板引擎技术基础+MiniSmarty 01-02

smarty 模板怎样使用php标签

PHP模板引擎smarty详细介绍

smarty模板内容

用php的Smarty模板的后台程序,如何做文件导出(导成excel文件)???

smarty模板基础2