Smarty模板:如何更改子模板中块的顺序?

时间:2015-07-14 17:20:07

标签: php templates smarty shopware

我想在使用父块的内容时更改子模板中父块的顺序。

示例:

父模板:

{block outer}
    {block a} ... some long content ...{/block}
    {block b} ... some long content ...{/block}
    {block c} ... some long content ...{/block}
{/block}

子模板:

{extends file="parent:parent.tpl"}
{block outer}
    {block c} reuse content of parent block "c" {/block}
    {block b} reuse content of parent block "b" {/block}
    {block a} reuse content of parent block "a" {/block}
{/block}

我尝试在块a,b和c:

中使用{$smarty.block.parent}
{extends file="parent:parent.tpl"}
{block outer}
    {block c} {$smarty.block.parent} {/block}
    {block b} {$smarty.block.parent} {/block}
    {block a} {$smarty.block.parent} {/block}
{/block}

在这种情况下,{$smarty.block.parent}包含父块“外部”的内容。

是否可以在子模板中呈现内部块a,b和c的内容?

场景:块a,b和c的内容非常复杂,我想避免从父节点复制和粘贴整个内容。

7 个答案:

答案 0 :(得分:3)

虽然这是一个旧帖子,但这对未来可能很重要 我解决这个问题的最佳尝试如下:

{extends file="parent:parent.tpl"}

{block a}
    {capture a}
        {$smarty.block.parent}
    {/capture}
{/block}

{block c}
    {capture c}
        {$smarty.block.parent}
    {/capture}
{/block}

{block b}
    {$smarty.capture.c}
    {$smarty.block.parent}
    {$smarty.capture.a}
{/block}

答案 1 :(得分:0)

您是否尝试过添加父块​​名称?

{extends file="parent:parent.tpl"}
{block outer}
    {block c} {$smarty.block.parent.c} {/block}
    {block b} {$smarty.block.parent.b} {/block}
    {block a} {$smarty.block.parent.a} {/block}
{/block}

答案 2 :(得分:0)

您可以将块定义为单独的tpl文件,并以任何顺序包含它们。或者你可以从php脚本中将块作为数组传递并以任何顺序使用。

在模板继承块中,只需定义可以更改的位置。

答案 3 :(得分:0)

您可以尝试capture块的输出,然后更改它们的顺序。试一试,这是smarty documentation for capture

答案 4 :(得分:0)

相当古老的主题,但我有完全相同的问题,不知道如何解决它。我也尝试过使用smarty.block.parent,结果相同。

您是否已找到解决该问题的模式?

答案 5 :(得分:0)

我弄乱了这个非常古老的问题。我有一个类似的问题,改变{block}的顺序而不访问父主题而不复制整个{block}。

我找到了一点解决方法。

示例: 您的父主题文件:frontend/index/index.tpl带有块

{block name="mainblock"}
   {block name="header"}headercontent{/block}
   {block name="nav"}navcontent{/block}
   {block name="footer"}footercontent{/block}
{/block}

扩展文件

{extends file="parent:frontend/index/index.tpl"}

扩展块

{block name="header"}
    {* define a function with a similar name as the block *}
    {function name="block__header"}
        {* define a new block, so you can extend your own block *}
        {block name="my_header"}
            {*call parent block to inherit the content *}
            {$smarty.block.parent}
        {/block}
    {/function}
{/block}

移动块

{block name="footer" prepend}
    {call name="block__header"}
{/block}

注意:如果您稍后延长{block name="header"},您的扩展内容将显示在原始位置所在的原始位置。要扩展它,请使用{block name="my_header"}

在Shopware中,您可以在protected $injectBeforePlugins = false;中使用Theme.php,而不是覆盖插件内容。

也可以使用capture代替function,但我认为{call name="block__header"}比{$ block__header}更具可读性。

我在编辑器中将该函数定义为片段,因此我不必再次输入所有这些内容。

再次:抱歉回答这么老的问题,但我认为这对其他人来说很有用。

答案 6 :(得分:0)

有一种解决方案仍然不是最佳解决方案,但这是我到目前为止发现的最干净的方法。

parent.tpl

{block name="outer"}
  {block name="a"} ... some long content ...{/block}
  {block name="b"} ... some long content ...{/block}
  {block name="c"} ... some long content ...{/block}
{/block}

假设我们要将a移动到outer块的底部,我们的子模板应如下所示:

child.tpl

{extends file="parent:parent.tpl"}

{block name="a"}
  {capture name="a"}
    {$smarty.block.parent}
  {/capture}
{/block}

{block name="c" append}
  {$smarty.capture.a}
{/block}

在此示例中,块a的内容被覆盖,由于捕获了内容,因此块a中将没有实际输出,a被“删除”。最后,我们将捕获的a内容附加到c块中。现在a的内容位于outer块的底部。