我正在使用VHS Menu ViewHelper构建导航。以下是整个代码。 我的问题可能是非常基本的流畅。
在范围内,如何访问存在于该范围之外的变量 - 或者如何将其传递到该范围?
编辑:我已经更新了我的代码,不在变量名中使用短划线,也为v:page.menu指定了不同的名称,其中as =“menuLevel0”。
完整代码:
{namespace v=Tx_Vhs_ViewHelpers}
<ul id="nav" class="grid-full classic">
<v:page.menu as="menuLevel0" expandAll="1" useShortcutData="1" levels="4" classHasSubpages="parent" classFirst="first" classLast="last">
<f:for each="{menuLevel0}" as="itemLevel0" iteration="iterLevel0">
<li class="{itemLevel0.class} level0 nav-{iterLevel0.cycle} level-top">
<a href='{itemLevel0.link}' class='level-top'><span>
<f:if condition="{itemLevel0.nav_title}"><f:then>{itemLevel0.nav_title}</f:then><f:else>{itemLevel0.title}</f:else></f:if>
nav-{iterLevel0.cycle}</span>
</a>
<f:if condition="{itemLevel0.hasSubPages}">
<f:then>
<v:page.menu as="menuLevel1" expandAll="1" classHasSubpages="parent" classFirst="first" classLast="last">
<ul class="level0">
<f:for each="{menuLevel1}" as="itemLevel1" iteration="iterLevel1">
<li class="{itemLevel1.class} level1 nav-{iterLevel0.cycle}-{iterLevel1.cycle}">
<a href='{itemLevel1.link}' class='level-top'><span>
<f:if condition="{itemLevel1.nav_title}"><f:then>{itemLevel1.nav_title}</f:then><f:else>{itemLevel1.title}</f:else></f:if>
nav-{menuLevel0.iterLevel0.cycle}-{iterLevel1.cycle}
</span></a>
</li>
</f:for>
</ul>
</v:page.menu>
</f:then>
</f:if>
</li>
</f:for>
</v:page.menu>
</ul>
答案 0 :(得分:2)
在流体中,变量是并且应该作用于您正在使用的块。
在使用我们的v:page.menu
ViewHelpers时,您需要进一步了解范围:
{levelOneIterator}
和{levelTwoIterator}
是此类行为的好例子您的代码无效的原因:
您指定了{iter}
变量。因此,流体不会解析破折号的变量名称,因为它首先检测到未经过破坏的标识符。破折号在流体中具有特殊意义,你可以在那里遇到各种各样的竞争条件。
更进一步:
``` {foo-bar} // echos“baz” {foo-bar} // echos“bing”,因为首先读取bar vaiable,而“foo-”不是当前范围内的变量
```
<强>更新强>
从父作用域访问变量不需要为var-call添加前缀。在子for循环中,只需调用var。
即可访问父迭代
<f:for each="{iterable}" as="iterableItem iteration="iteratorRoot">
{iteratorRoot.index} <!-- Echoes the current, zero-indexed iteration -->
<f:for each="{iterableItem}" as="subItem" iteration="iterationChild">
<!-- STILL echoes the current, zero-indexed iteration -->
{iteratorRoot.index}
<!-- Echoes the current, zero-indexed sub iteration -->
{iterationChild.index}
</f:for>
</f:for>
只要为迭代器指定不同的名称,就可以通过其原始名称在任何范围内访问它们。名称变量的别名(as =“name”)也是如此。
答案 1 :(得分:1)
尽量不要在变量名中使用“ - ”!请改用CamelCase:
<f:render section="layer2" arguments="{uid: curPage.uid, parentIter: iter.cycle}" />
答案 2 :(得分:1)
在控制器
中public function listAction() {
$events = $this->eventsRepository->getEventsList();
$this->view->assign('eventsList', $events);
}
在“查看文件”中,您可以像这样访问。
<f:for each="{eventsList}" as="events">
<tr>
<td> {events.event_id} </td>
<td> <f:link.external uri="{events.event_link}" target="_blank">{events.event_link}</f:link.external></td>
<td><f:format.date format="d-m-Y">{events.event_date}</f:format.date></td>
</tr>
</f:for>
答案 3 :(得分:0)
您是否尝试过不在两个foreach循环中为迭代器使用相同的变量名?