Smarty 模板:如何更改子模板中块的顺序?
Posted
技术标签:
【中文标题】Smarty 模板:如何更改子模板中块的顺序?【英文标题】:Smarty templates: How to change the order of blocks in child template? 【发布时间】: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 的一部分。 【参考方案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
块的底部。
【讨论】:
以上是关于Smarty 模板:如何更改子模板中块的顺序?的主要内容,如果未能解决你的问题,请参考以下文章