Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Smarty模板:如何更改子模板中块的顺序?_Php_Templates_Smarty_Shopware - Fatal编程技术网

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

Php Smarty模板:如何更改子模板中块的顺序?,php,templates,smarty,shopware,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 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}
子模板:

{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}
包含父块“outer”的内容

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


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

是否尝试添加父块名称

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

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


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

您可以尝试捕获块的输出,然后更改块的顺序。试试看,这是一个非常古老的话题,但我有完全相同的问题,不知道如何解决它。我还尝试使用smarty.block.parent获得相同的结果


你已经找到解决这个问题的模式了吗?

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

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

我在这个老问题上难倒了。我有一个类似的问题,改变{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"}
    {* 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=falseTheme.php
中,可以覆盖插件内容

也可以使用
捕获
而不是
函数
,但我认为
{call name=“block\uu header”}
比{$block\uu header}更具可读性

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


再次:很抱歉回答了这么一个老问题,但我认为它对其他人可能有用。

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

母公司.第三方物流

{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}
{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
移动到
outer
块的底部,我们的子模板应该如下所示:

child.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}
{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
get被覆盖,由于内容被捕获,因此块
a
中没有实际输出,
a
被“删除”。最后,我们将捕获的
a
内容附加到
c
块。
a
的内容现在位于
外部
块的底部。

您不能将每个子块都设置为子模板,然后按ABC顺序执行一个模板,按CBAI顺序执行另一个模板。我不确定是否理解您的建议。:)无论如何,我无法修改父模板,因为它是ShopWare的一部分。这给了我语法错误:$smarty.block无效。这种情况下会出现奇怪的错误消息。感谢您的建议,但正如我在上一篇评论中提到的,我无法修改父模板,因为它是ShopWare的一部分。也许用这个模板结构是不可能的。遗憾的是没有。我最终复制了那些大模板部分。这个答案应该被标记为正确的答案!