【问题标题】:PHP Latte - multiple block with same namePHP Latte - 具有相同名称的多个块
【发布时间】:2021-07-03 14:41:10
【问题描述】:

我是 latte 模板引擎的新手,并且从几天开始就一直在摆弄它。我发现了很多不错且有用的东西,可以让我的项目更轻松、更干净。但是有一件事我没有找到或想念如何处理它。

假设我的网站有这个基本的布局模板:

<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 块?
  • 因为取决于 css,side-blocks 可以出现在左侧和/或右侧。 html5 允许多个备用部分。
  • 当然,但布局中只有一个边。如果你想要多个,你需要以某种方式区分它们(例如通过添加一个类),此时你可以使用不同命名的块。
  • 那是我的问题......我怎么能做到这一点,但不使用其他分配方法而不是其他块。 (为了更清楚,我编辑了第一篇文章)
  • 好吧,我仍然质疑这样做的好处,而不是使用不同名称的不同块。我发布了一个 hack 的答案,可以实现你所说的你想要的,但听起来仍然像 XY problem

标签: templates block nette latte


【解决方案1】:

好吧,你可以这样做,滥用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} 这样的块,但我不建议这样做,因为它只会增加毫无意义的复杂性。

要么,大多数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-child CSS 选择器匹配它们。但这很脆弱,因为您现在需要将顺序与 CSS 中定义的顺序相匹配。


只有当你有一个页面层次结构时,这个问题才开始变得有趣,其中页面继承自父层中的页面。不过还是用template inheritance比较好。

【讨论】:

  • 您的答案的第一部分似乎是我正在寻找的。非常感谢。你能向我解释一下“毫无意义的复杂性”是什么意思吗?乍一看,我看不出有什么大问题。
  • 第二部分也是我已经想到的一个不错的解决方案。我只是为边定义了一组名称,并将它们视为普通块。但后来我听到我的客户问:“我仍然需要一个名为 X、Y 和 Z 的区域”。或者,这可以简单地通过给他一个可编辑的名字列表来完成。
  • 主要的复杂性是需要手动增加计数器。此外,它可能比仅仅拥有一个静态块列表效率低(但可能不会太多,必须测量)。
  • 可编辑的姓名列表会很好,因为您可以使用&lt;aside n:foreach="$asides as $asideName" n:class="$asideName" n:ifset="$asideName"&gt;{include $asideName}&lt;/aside&gt;,这可能是最简单的解决方案。
  • 另外,您可以定义custom aside 标签,使用block macro 作为起点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
相关资源
最近更新 更多