6

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

例子:

父模板:

{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}

我尝试{$smarty.block.parent}在块 a、b 和 c 中使用:

{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 的内容非常复杂,我想避免从父级复制和粘贴整个内容。

4

7 回答 7

4

虽然这是一篇旧文章,但这可能对未来很重要。
我解决此问题的最佳尝试如下:

{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}
于 2017-02-13T12:03:51.483 回答
1

我偶然发现了这个非常古老的问题。我有一个类似的问题,在不访问父主题且不复制整个 {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"}.

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

也可以使用capture而不是 afunction但我认为{call name="block__header"}它比 {$block__header} 更具可读性。

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

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

于 2018-02-28T12:33:37.270 回答
1

有一个解决方案仍然不是最佳的,但它是迄今为止我发现的最干净的方法。

父.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}

假设我们要移动aouter块的底部,我们的子模板应该如下所示:

孩子.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}

在此示例中,块aget 被覆盖,并且由于内容被捕获,因此块中将没有实际输出aa因此被“删除”。最后,我们将捕获的内容附加ac-block。现在的内容a在块的底部outer

于 2019-01-23T08:29:27.740 回答
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}
于 2015-07-15T12:00:22.170 回答
0

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

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

于 2015-07-16T08:12:15.660 回答
0

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

于 2015-10-23T00:51:09.543 回答
0

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

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

于 2016-07-13T13:20:38.160 回答