[FLUID] Zähler/Counter in for-Schleife

  • Typo3Cuckoo Typo3Cuck...
    Sternenflotten-Admiral
    0 x
    184 Beiträge
    0 Hilfreiche Beiträge
    18. 05. 2011, 17:34

    Hi,

    gibt es eine Möglichkeit in einer for-Schleife in Fluid einen Zähler/Counter ausgeben zu lassen?

    1. <f:for each="{objects}" as="obj">
    2. <div class="content">[COUNTER] - {obj.title}</div>
    3. </f:for>

    Gewünschte Ausgabe wäre dann in etwa so:

    1 - Erstes Objekt
    2 - Zweites Objekt
    3 - Drittes Objekt
    etc.

    [COUNTER]müsste dann automatisch pro Schleifendurchlauf hochzählen.

    Danke schon mal :)


  • 1
  • xandio xandio
    Padawan
    0 x
    40 Beiträge
    0 Hilfreiche Beiträge
    18. 05. 2011, 20:01

    Hallo!

    Einen Zähler kannst Du folgendermaßen ausgeben lassen:

    1. <f:for each="{objects}" as="obj" iteration="objIterator">
    2. <div class="content">{objIterator.cycle} - {obj.title}
    3. </div>
    4. </f:for>

    Viele Grüße,
    Xandi

  • Typo3Cuckoo Typo3Cuck...
    Sternenflotten-Admiral
    0 x
    184 Beiträge
    0 Hilfreiche Beiträge
    19. 05. 2011, 10:12

    Hi :)

    Danke für deine Antwort. Wenn ich das einbaue erhalte ich im Frontend folgende Fehlermeldung

    [b]Tx_Fluid_Core_Parser_Exception: Argument "iteration" was not registered.[/b]

    Kann es sein, dass meine fluid Version das nicht unterstützt (Version 1.0.2)?
    Ist die neueste Version von fluid abwärtskompatibel oder darf ich dann alle HTML Templates überarbeiten?

    Danke schon mal :)

  • xandio xandio
    Padawan
    0 x
    40 Beiträge
    0 Hilfreiche Beiträge
    19. 05. 2011, 10:48

    Hallo!

    Ja, das liegt an Deiner Fluid-Version.

    Ich weiß nicht genau, wie es mit der Kompatibilität aussieht, aber einen Versuch ist es sicher wert.

    Viele Grüße,
    Xandi

  • Typo3Cuckoo Typo3Cuck...
    Sternenflotten-Admiral
    0 x
    184 Beiträge
    0 Hilfreiche Beiträge
    19. 05. 2011, 11:23

    Hmm ok, sehr riskant hehe ;)

    Wo kann ich die neueste Version herunterladen?

  • xandio xandio
    Padawan
    0 x
    40 Beiträge
    0 Hilfreiche Beiträge
    19. 05. 2011, 11:48

    Ich würde den Extension Manager verwenden. "Retrieve/Update" und danach "Check for extension updates" aufrufen.

    Übrigens: ein Auszug aus dem ChangeLog von Fluid:

    -------------
    Changes for 1.3.0 Alpha 1
    =========================
    included in TYPO3 4.5.0 Alpha 1.

    [...]

    * The <f:for>-ViewHelper has now Iteration Information available, if you want that:
    <f:for each="{objects}" as="object" iteration="iteration">
    {iteration.index} is a counter which starts at 0
    {iteration.cycle} is a counter which starts at 1
    -------------

  • Typo3Cuckoo Typo3Cuck...
    Sternenflotten-Admiral
    0 x
    184 Beiträge
    0 Hilfreiche Beiträge
    19. 05. 2011, 11:59

    Ich hab mittlerweile die Version 1.2.1 (BETA) installiert und es funktioniert irgendwie nicht, Also, meine Extension generiert keine Ausgabe mehr. Ich denke ich bleibe erst Mal bei der alten 1.0.2 Version und programmiere einen ViewHelper für den Zähler (geht das überhaupt?).

    Kann ich irgendwo einsehen wie diese "iteration" Funktion implentiert wurde?

    Mal sehen wie weit ich komme hehe ;)

    Nochmals Danke! :)

  • xandio xandio
    Padawan
    0 x
    40 Beiträge
    0 Hilfreiche Beiträge
    19. 05. 2011, 12:15

    Die render-Methode des ForViewHelpers von Fluid 1.3 müsstest Du Dir anschauen. Falls Du auf 1.3 nicht updaten kannst, dann eben aus einem TYPO3 4.5 extrahieren. Danach den 1.0er-ForViewHelper erweitern und render() überschreiben. Aber sonderlich ratsam ist das nicht. ;-)

  • Typo3Cuckoo Typo3Cuck...
    Sternenflotten-Admiral
    0 x
    184 Beiträge
    0 Hilfreiche Beiträge
    19. 05. 2011, 12:32

    Ok, das werde ich mir mal anschauen! Wieso ist das nicht ratsam? Kann ich nicht parallel zum existierenden ForViewHelper meinen eigenen im eigenem Namespace machen?

    Das Problem ist halt, es wurden schon einige Extensions mit Extbase 1.0.2 und Fluid 1.0.2 entwickelt. Fluid 1.3 kann ich nur installieren, wenn ich auch Extbase update und ich hab keine Ahnung was passiert wenn ich das mache (hier heruntergeladen -> http://sourceforge.net/projects/typo3xdev/files/T3X/coreprojects/mvc/).

  • Typo3Cuckoo Typo3Cuck...
    Sternenflotten-Admiral
    0 x
    184 Beiträge
    0 Hilfreiche Beiträge
    19. 05. 2011, 13:05

    Es funktioniert! Das is ja mal richtig cool! :D

    Das hab ich gemacht (Fluid Version 1.0.2 voraussgesetzt)

    Den Ordner "my_extension/Classes/ViewHelpers" anlegen
    Im Verzeichnis "ViewHelpers" die Datei "ForViewHelper.php" anlegen
    Den Inhalt aus dem Fluid ViewHelper "ForViewHelper.php" kopieren und "iteration"-Funktionalität aus dem ViewHelper aus Fluid 1.3 übernehmen

    1. <?php
    2.  
    3. /* *
    4.  * This script belongs to the FLOW3 package "Fluid". *
    5.  * *
    6.  * It is free software; you can redistribute it and/or modify it under *
    7.  * the terms of the GNU Lesser General Public License as published by the *
    8.  * Free Software Foundation, either version 3 of the License, or (at your *
    9.  * option) any later version. *
    10.  * *
    11.  * This script is distributed in the hope that it will be useful, but *
    12.  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- *
    13.  * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser *
    14.  * General Public License for more details. *
    15.  * *
    16.  * You should have received a copy of the GNU Lesser General Public *
    17.  * License along with the script. *
    18.  * If not, see http://www.gnu.org/licenses/lgpl.html *
    19.  * *
    20.  * The TYPO3 project - inspiring people to share! *
    21.  * */
    22.  
    23. /**
    24.  * Loop view helper which can be used to interate over array.
    25.  * Implements what a basic foreach()-PHP-method does.
    26.  *
    27.  * = Examples =
    28.  *
    29.  * <code title="Simple Loop">
    30.  * <f:for each="{0:1, 1:2, 2:3, 3:4}" as="foo">{foo}</f:for>
    31.  * </code>
    32.  * <output>
    33.  * 1234
    34.  * </output>
    35.  *
    36.  * <code title="Output array key">
    37.  * <ul>
    38.  * <f:for each="{fruit1: 'apple', fruit2: 'pear', fruit3: 'banana', fruit4: 'cherry'}" as="fruit" key="label">
    39.  * <li>{label}: {fruit}</li>
    40.  * </f:for>
    41.  * </ul>
    42.  * </code>
    43.  * <output>
    44.  * <ul>
    45.  * <li>fruit1: apple</li>
    46.  * <li>fruit2: pear</li>
    47.  * <li>fruit3: banana</li>
    48.  * <li>fruit4: cherry</li>
    49.  * </ul>
    50.  * </output>
    51.  *
    52.  * @version $Id: ForViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
    53.  * @package Fluid
    54.  * @subpackage ViewHelpers
    55.  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
    56.  * @api
    57.  * @scope prototype
    58.  */
    59. class Tx_MyExtension_ViewHelpers_ForViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
    60.  
    61. /**
    62.   * Iterates through elements of $each and renders child nodes
    63.   *
    64.   * @param array $each The array or SplObjectStorage to iterated over
    65.   * @param string $as The name of the iteration variable
    66.   * @param string $key The name of the variable to store the current array key
    67.   * @param boolean $reverse If enabled, the iterator will start with the last element and proceed reversely
    68.   * @param string $iteration The name of the variable to store iteration information (index, cycle, isFirst, isLast, isEven, isOdd)
    69.   * @return string Rendered string
    70.   * @author Sebastian Kurfürst <sebastian@typo3.org>
    71.   * @author Bastian Waidelich <bastian@typo3.org>
    72.   * @author Robert Lemke <robert@typo3.org>
    73.   * @api
    74.   */
    75. public function render($each, $as, $key = '', $reverse = FALSE, $iteration = NULL) {
    76. $output = '';
    77. if ($each === NULL) {
    78. return '';
    79. }
    80. if (is_object($each)) {
    81. if (!$each instanceof Traversable) {
    82. throw new Tx_Fluid_Core_ViewHelper_Exception('ForViewHelper only supports arrays and objects implementing Traversable interface' , 1248728393);
    83. }
    84. $each = $this->convertToArray($each);
    85. }
    86.  
    87. if ($reverse === TRUE) {
    88. $each = array_reverse($each);
    89. }
    90.  
    91. $iterationData = array(
    92. 'index' => 0,
    93. 'cycle' => 1,
    94. 'total' => count($each)
    95. );
    96.  
    97. $output = '';
    98. foreach ($each as $keyValue => $singleElement) {
    99. $this->templateVariableContainer->add($as, $singleElement);
    100. if ($key !== '') {
    101. $this->templateVariableContainer->add($key, $keyValue);
    102. }
    103. if ($iteration !== NULL) {
    104. $iterationData['isFirst'] = $iterationData['cycle'] === 1;
    105. $iterationData['isLast'] = $iterationData['cycle'] === $iterationData['total'];
    106. $iterationData['isEven'] = $iterationData['cycle'] % 2 === 0;
    107. $iterationData['isOdd'] = !$iterationData['isEven'];
    108. $this->templateVariableContainer->add($iteration, $iterationData);
    109. $iterationData['index'] ++;
    110. $iterationData['cycle'] ++;
    111. }
    112. $output .= $this->renderChildren();
    113. $this->templateVariableContainer->remove($as);
    114. if ($key !== '') {
    115. $this->templateVariableContainer->remove($key);
    116. }
    117. if ($iteration !== NULL) {
    118. $this->templateVariableContainer->remove($iteration);
    119. }
    120. }
    121. return $output;
    122. }
    123.  
    124. /**
    125.   * Turns the given object into an array.
    126.   * The object has to implement the Traversable interface
    127.   *
    128.   * @param Traversable $object The object to be turned into an array. If the object implements Iterator the key will be preserved.
    129.   * @return array The resulting array
    130.   * @author Bastian Waidelich <bastian@typo3.org>
    131.   */
    132. protected function convertToArray(Traversable $object) {
    133. $array = array();
    134. foreach ($object as $keyValue => $singleElement) {
    135. $array[$keyValue] = $singleElement;
    136. }
    137. return $array;
    138. }
    139. }
    140.  
    141. ?>

    Im View (z.B: list.html) ganz oben folgende Zeile für den neuen Namespace einfügen

    1. {namespace myext=Tx_MyExtension_ViewHelpers}

    Dann kann man im View den eigenen ViewHelper wie folgt nutzen

    1. <myext:for each="{objects}" as="obj" iteration="objIteration">
    2. <p>{objIteration.cycle}</p>
    3. </myext:for>

    :)

  • 1