【问题标题】:Smarty templates: How to change the order of blocks in child template?Smarty 模板:如何更改子模板中块的顺序?
【发布时间】:2015-10-03 11:35:51
【问题描述】:

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

例子:

父模板:

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

【问题讨论】:

  • 你不能把每个子块都设置为子模板,然后用顺序ABC做一个模板,用CBA做另一个模板
  • 我不确定我是否理解您的建议。 :) 无论如何,我无法修改父模板,因为它是 ShopWare 的一部分。

标签: php templates smarty shopware


【解决方案1】:

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

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

【讨论】:

  • 这给了我语法错误:$smarty.block 无效。在这种情况下出现奇怪的错误消息。
【解决方案2】:

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

在模板继承块中定义你可以改变的地方。

【讨论】:

  • 感谢您的建议,但正如我在之前的评论中提到的,我无法修改父模板,因为它是 ShopWare 的一部分。也许这种模板结构是不可能的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 遗憾的是没有。我最终复制了那些大模板部分。
    【解决方案5】:

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

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

    【讨论】:

    • 此答案应标记为正确答案!
    【解决方案6】:

    我偶然发现了这个非常古老的问题。我有一个类似的问题,在不访问父主题且不复制整个 {block} 的情况下更改 {block} 的顺序。

    我找到了一些解决方法。

    示例: 你的父主题文件:frontend/index/index.tpl with blocks

    {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 中,您可以在 Theme.php 中使用 protected $injectBeforePlugins = false;,而不是覆盖插件内容。

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

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

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

    【讨论】:

      【解决方案7】:

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

      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 块的底部。

      【讨论】:

        猜你喜欢
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        相关资源
        最近更新 更多