2014-02-14 52 views
4

我建立與VHS Menu ViewHelper導航。以下是整個代碼。 雖然我的問題可能非常基礎。在TYPO3液,如何從一個foreach循環內訪問變量?

裏面一個範圍,我怎麼訪問存在範圍以外的變量 - 或者我該如何將它傳遞到該範圍?

編輯:我已經更新了我的代碼,不使用變量名破折號以及分配不同的名字到v:與作爲=「menuLevel0」 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> 
+0

我剛剛注意到它只是不適用於主要部分的第一項。 – Urs

+0

,它與page.menu.directory一起工作,請參閱https://github.com/FluidTYPO3/vhs/issues/479 – Urs

+0

您似乎對如何從父作用域訪問變量有一個誤解。你實際上不需要使用''{menuLevel0.iterLevel0.cycle}''。 ''{iterLevel0.cycle}''就夠了。 – Cedric

回答

0

你試過沒有使用相同的varibale名在這兩個你foreach循環的迭代器?

+0

我試過了,似乎沒有區別。實際上,在第二部分中,傳入的變量已經有了不同的名稱(parent-iter vs. iter) – Urs

1

儘量不要用「 - 」表示在變量名!使用CamelCase代替:

<f:render section="layer2" arguments="{uid: curPage.uid, parentIter: iter.cycle}" /> 
2

在流體中,變量的範圍和範圍都與您使用的塊有關。

當您使用我們的v:page.menu ViewHelpers,你需要一點進一步瞭解作用域:

  1. 使用了嵌套作用域變量不同的名稱:{levelOneIterator}{levelTwoIterator}是對這種行爲
  2. 作爲很好的例子經驗法則:使用lowerCamelCased變量名稱。它防止流體解析你的var-name錯誤。

之所以你的代碼是不工作:

您分配一個{iter}變量。因此流體不會分析破折號的變量名稱,因爲它首先檢測到非抽象的標識符。破折號在流體中有特殊的意義,你可以在那裏遇到種族的競爭條件。

藉此遠一點:

``` {FOO杆} //回聲 「baz」 的 {FOO杆} //回聲 「冰」,爲棒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」)命名變量也一樣。

+0

再次感謝Cedric。我已經更新了我的問題。我快到那裏了。但是我仍然沒有看到如何訪問父範圍(或類似於全局變量的東西),或者將所需的變量從父範圍傳遞到子範圍以在其中使用。這一定是可能的,不是嗎? – Urs

+0

我也嘗試過''和子範圍'{menuLevel0iter}' - 當然範圍並不是全局的 – Urs

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>