1

我是拿铁模板引擎的新手,几天以来一直在摆弄它。我发现了很多好用的东西,可以让我的项目更轻松、更干净。但是有一件事我没有找到或错过如何处理它的想法。

让我们想象一下我的网站有这个基本的布局模板:

<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放在一边[]”,然后我在主模板中以某种方式通过循环处理它。有没有有用的方法来做到这一点?我不想将它与导航等变量一起使用,因为内容是在模板中定义的。

谢谢你的想法和问候马卡

4

1 回答 1

0

好吧,你可以这样做,滥用动态块名称

{var $maxAside = 10}
{for $i = 0; $i < $maxAside; $i++}
  {ifset aside-$i}
    {include "aside-$i"}
  {else}
    {breakIf true}
  {/ifset}
{/for}

并定义类似的块,{block "aside-{++$i}"}…{/block}但我不推荐这样做,因为它只会增加毫无意义的复杂性。

或者,大多数asides 将是相同的,然后您可以只为它们使用一个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-childCSS 选择器匹配它们。但这很脆弱,因为您现在需要将顺序与 CSS 中定义的顺序相匹配。


当你有一个页面层次结构时,这个问题才开始变得有趣,其中页面从父层中的页面继承。但是使用模板继承仍然更好。

于 2021-07-04T12:25:58.387 回答