我是新的拿铁模板引擎,并摆弄了一些日子以来。我发现了许多好的和有用的东西,让我的项目变得更容易和更干净。但有一件事我没有发现,也没有错过如何处理它的想法。
让我们假设我的网站有这样一个基本的布局模板:
<header><h1>{$title}</h1></header>
<nav n:inner-foreach="$navigation as $link">
<a href="{$link->url}" n:class="$link->active ? active" n:attr="data-icon: $link->icon">{$link->name}</a>
</nav>
<aside>{include aside}</aside>
<aside>{include aside}</aside>
<aside>{include aside}</aside>
<content>{include content}<content>
<footer>{include footer}</footer>
内容在每个站点的另一个模板中处理。每一个看起来都是这样的:
{layout 'layout.tpl'}
{$navigation[3]->active=true}
{$title="this page title"}
{block content}
<p>here comes the content</p>
{/block}
{block aside}
<p>here is f.e. a sidebar</p>
{/block}
{block aside}
<p>this is some adverticement</p>
{/block}
现在我的问题是:如何在我的模板中使用一个或多个被定义为"block“的"aside”块。最好的解决方案应该是这样的:“阻塞aside[]”,然后我在主模板中以某种方式使用一个循环来处理它。有没有什么有用的方法呢?我不想在像导航这样的变量中使用它,因为内容是在模板中定义的。
想法和问候Makka的thx
发布于 2021-07-04 20:25:58
嗯,你可以这样做,滥用dynamic block names
{var $maxAside = 10}
{for $i = 0; $i < $maxAside; $i++}
{ifset aside-$i}
{include "aside-$i"}
{else}
{breakIf true}
{/ifset}
{/for}并定义像{block "aside-{++$i}"}…{/block}这样的块,但我不建议这样做,因为它只会增加毫无意义的复杂性。
或者,大多数aside都是相同的,然后您可以只对它们使用单个aside块:
{block aside}
<section>
<p>here is f.e. a sidebar</p>
</section>
<section>
<p>this is some adverticement</p>
</section>
{/block}或者,您可能希望以某种方式区分它们(例如,以不同的方式设置它们的样式),然后为它们分配类,这样您就可以使用不同的块:
<aside class="sidebar" n:ifset="sidebar">{include sidebar}</aside>
<aside class="advertisement" n:ifset="advertisement">{include advertisement}</aside>除非您使用:nth-child CSS选择器匹配它们。但这是脆弱的,因为您现在需要将顺序与CSS中定义的顺序相匹配。
只有当你有一个页面层次结构,其中页面继承自父层中的页面时,这个问题才开始变得有趣。但是,使用template inheritance仍然更好。
https://stackoverflow.com/questions/68237232
复制相似问题