4

我正在使用VHS Menu ViewHelper构建导航。下面是整个代码。我的问题可能是非常基本的流体。

在范围内,如何访问存在于该范围之外的变量 - 或者如何将其传递到该范围?

编辑:我已经更新了我的代码,在变量名中不使用破折号,并使用 as="menuLevel0" 为 v:page.menu 分配了不同的名称。


完整代码:

{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>
4

4 回答 4

2

在流体中,变量是并且应该被限制在您正在使用的块中。

当您使用我们的v:page.menuViewHelpers 时,您需要进一步了解范围:

  1. 在嵌套范围内为变量使用不同的名称:{levelOneIterator}并且{levelTwoIterator}是此类行为的好例子
  2. 根据经验:使用 lowerCamelCased 变量名。它可以防止流体解析错误的变量名称。

您的代码不起作用的原因:

您分配一个{iter}变量。因此,fluid 不会解析破折号变量名称,因为它首先检测到未破折号的标识符。破折号在流体中具有特殊含义,您可以在那里遇到某种竞争条件。

更进一步:

``` {foo-bar} // 回显“baz” {foo-bar} // 回显“bing”,因为首先读取 bar 变量,并且“foo-”不是当前范围内的变量

```

更新:

从父范围访问变量不需要为您的 var 调用添加前缀。在子 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") 命名变量也是如此。

于 2014-02-23T01:40:19.510 回答
1

尽量不要在变量名中使用“-”!改用 CamelCase:

<f:render section="layer2" arguments="{uid: curPage.uid, parentIter: iter.cycle}" />
于 2014-02-20T01:00:10.097 回答
1

In Controller

public function listAction() {
    $events = $this->eventsRepository->getEventsList();
    $this->view->assign('eventsList', $events);
}

In View File you can access like this.

<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>
于 2015-06-18T06:09:48.113 回答
0

您是否尝试过不在两个 foreach 循环中为迭代器使用相同的变量名称?

于 2014-02-15T13:16:25.467 回答