Vanilla 1.1.2 Forum von Lussumo. Weitere Informationen: Dokumentation, Community.

    • CommentAuthortonisch
    • CommentTime24.11.2011 bearbeitet
     permalink
    Moin zusammen!
    Ich würd mir grad gern per Wayfinder (revo, wayfinder 2.3.3) einer Liste ausgeben lassen. Dabei soll jedem zweiten Element eine Klasse angehängt werden. Wie mach ich das denn am dümmsten? Gibts ne Variable, in der der Iterator vom Wayfinder gespeichert wird?
    •  
      CommentAuthorsam
    • CommentTime24.11.2011 bearbeitet
     permalink
    Wenn ich mich nicht täusche, gibt's keinen Iterator im Wayfinder. Konnte jedenfalls im Quellcode nichts entsprechendes finden.

    Hier ein kleines Workaround, mit dem Du zum gewünschten Ergebnis kommen solltest:

    Vorgehensweise:
    Du erzeugst eine Liste mit den IDs aller Resourcen, die im Menü angezeigt werden sollen, speicherst sie in einen Platzhalter und nutzt diesen um die Positionen der Resourcen im Menü zu ermitteln.

    Snippets:
    toPlaceholder<?php
    $ph_name = isset($options) ? $options : $modx->getOption('ph_name', $scriptProperties, '');
    $ph_value = isset($input) ? $input : $modx->getOption('ph_value', $scriptProperties, '');

    $modx->setPlaceholder($ph_name, $ph_value);
    return;

    array_search<?php
    return array_search($input, explode(",", $options));


    Liste der IDs erzeugen:[[toPlaceholder? &ph_name=`menu_IDs` &ph_value=`[[Wayfinder? &rowTpl=`@CODE [[+wf.docid]],[[+wf.wrapper]]` &outerTpl=`@CODE [[+wf.wrapper]]` ...weitere Parameter]]`]]Dieser Aufruf erfolgt vor dem eigentlichen WF-Aufruf. Als weitere Parameter sollten alle Parameter eingefügt werden, die auch für den eigentlichen WF-Aufruf genutzt werden und die Filterung der Menüausgabe beeinflussen, damit die Liste der IDs mit dem Menü übereinstimmt.

    Aufruf in den Wayfinder-Templates:
    Fortlaufende Nummer:[[+wf.docid:array_search=`[[+menu_IDs]]`]]
    Gerade oder ungerade:[[+wf.docid:array_search=`[[+menu_IDs]]`:mod:is=`0`:then=`ungerade`:else=`gerade`]]


    Nachtrag:
    Wenn es sich um nur eine Menüebene handelt, kannst Du auf das toPlaceholder-Snippet verzichten und die ID-Liste mit getResources erzeugen. Z.B. so für die oberste Menüebene:[[getResources? &parents=`0` &depth=`0` &tpl=`@INLINE [[+id]]` &sortby=`{"menuindex":"ASC"}` &toPlaceholder=`menu_IDs` &limit=`0` &outputSeparator=`,`]]
    •  
      CommentAuthorMarc
    • CommentTime24.11.2011
     permalink
    Wenn ich mich nicht täusche, gibt's keinen Iterator im Wayfinder.


    Ist relativ unnötig, da der Menüindex eigentlich sauber sein sollte (im Gegensatz zu Evo). Von daher sollte ein [[+menuindex:mod:is=`0`:then=`menuclass`:else=`menuclass_alt`]] auch funktionieren.
    •  
      CommentAuthorsam
    • CommentTime25.11.2011
     permalink
    Ist relativ unnötig, da der Menüindex eigentlich sauber sein sollte
    Es werden jedoch auch versteckte, unveröffentlichte und gelöschte (Papierkorb) Resourcen im Menüindex mitgezählt und man kann ihn auch für jede Resource manuell setzen.
    Somit wird das Ergebnis verfälscht.
    •  
      CommentAuthorMarc
    • CommentTime25.11.2011
     permalink
    Jupp, da hast Du recht.
    •  
      CommentAuthorsam
    • CommentTime25.11.2011 bearbeitet
     permalink
    Hier noch eine Variante, mit der die Menüebenen berücksichtigt werden und die Iteration bei den Kind-Resourcen von 0 zu zählen beginnt, also nicht (wie oben) alle Ebenen in einer Reihe durchgezählt werden.

    Hier kann auf die Snippets „toPlaceholder“ und „array_search“ (siehe oben) verzichtet werden.

    Snippets:
    wf.setCounters<?php
    /*
    [[wf.setCounters? &name=`myMenu` &list=`[[Wayfinder?
        &rowTpl=`@CODE "[[+id]]":[[+parent]],[[+wf.wrapper]]`
        &outerTpl=`@CODE [[+wf.wrapper]]`
    ]]
    */
    $name = $modx->getOption('name', $scriptProperties, 'default');
    $list = $modx->getOption('list', $scriptProperties, '');
    $list = json_decode("{".trim($list, ",\n")."}", true);
    if (!is_array($list) || !count($list)) return;
    $parent = array();
    foreach ($list as $id => $pos) {
        $parent[$pos][] = $id;
    }
    $list = array();
    foreach ($parent as $children) {
        foreach ($children as $pos => $id) {
            $list[$id] = $pos;
        }
    }
    $GLOBALS["wf_counter_".$name] = $list;
    return;

    wf.getCounter<?php
    $name = isset($options) ? $options : 'default';
    return $GLOBALS["wf_counter_".$name][$input];


    Liste der IDs erzeugen:[[wf.setCounters?
    &name=`menu01`
    &list=`[[Wayfinder?
        &rowTpl=`@CODE "[[+wf.docid]]":[[+parent]],[[+wf.wrapper]]`
        &outerTpl=`@CODE [[+wf.wrapper]]`
        ...weitere Wayfinder-Parameter
    ]]`]]

    Aufruf in den Wayfinder-Templates:
    Fortlaufende Nummer:[[+wf.docid:wf.getCounter=`menu01`]]
    Gerade oder ungerade:[[+wf.docid:wf.getCounter=`menu01`:mod:is=`0`:then=`ungerade`:else=`gerade`]]
    •  
      CommentAuthorsam
    • CommentTime26.11.2011
     permalink
    Als Alternative geht auch ein Hack in der Datei
    core/components/wayfinder/wayfinder.class.php

    Dort suchst Du die Zeilen $docInfo['level'] = $level;
    $docInfo['first'] = $firstItem;
    (Zeile Nr. 225)
    und fügst danach (oder davor, das ist egal) diese Zeile ein:$docInfo['counter'] = $counter;
    Danach steht Dir in den Wayfinder-Templates der Platzhalter [[+counter]] zur Verfügung.

    Diese Methode hat nur den Nachteil, dass nach einem Update des Wayfinder-Pakets diese Änderung wieder futsch ist und neu gemacht werden muss.
    • CommentAuthortonisch
    • CommentTime07.12.2011
     permalink
    So, sorry dass ich mich erst jetzt melde.
    Herzlichen Dank für Eure gesammelten Beiträge. Ich hab mich mal für Marcs Methode entschieden. Falls Du mal Hilfe in oxid brauchst, melde dich ;)
    • CommentAuthorSuperheld
    • CommentTime25.06.2012
     permalink
    Hallo!

    Sams zweite Methode funktioniert nur bei fortlaufenden IDs. Sind aber die IDs durcheinander weil nachträglich sortiert wurde, funktioniert der Ablauf nicht mehr:

    ID, Snippet-Zähler

    57, gerade
    58, ungerade
    60, ungerade
    59, gerade
    61, gerade
    62, ungerade

    Kann man irgendwie die Sortierung im Menü noch berücksichtigen?
    • CommentAuthorSuperheld
    • CommentTime25.06.2012
     permalink
    Nachtrag: An den IDs liegt es offenbar nicht. Ich hab hier ein fortlaufenden Menü, bei dem beinahe alle Einträge "gerade" sind.
    •  
      CommentAuthorsam
    • CommentTime25.06.2012
     permalink
    Sams zweite Methode funktioniert nur bei fortlaufenden IDs. Sind aber die IDs durcheinander weil nachträglich sortiert wurde, funktioniert der Ablauf nicht mehr
    Dann funktioniert bei Dir vermutlich das wf.getCounter-Snippet nicht. Überprüfe bitte, ob Du es korrekt angelegt hast (Name und Inhalt) und ins Wayfinder-Template-Chunk eingebunden hast.
    Zusätzlich kannst Du auch [[+wf.docid:wf.getCounter=`menu01`]] einbinden. Wenn damit die IDs zurückgegeben werden, wird das Snippet nicht ausgeführt.

    Wenn Du den Fehler nicht findest, poste bitte den Inhalt Deines Wayfinder-Template-Chunks.
    • CommentAuthorSuperheld
    • CommentTime25.06.2012
     permalink
    Mache ich sofort. Kann es sein, dass das Snippet nur bestimmt, ob die ID gerade oder ungerade ist?
    • CommentAuthorSuperheld
    • CommentTime25.06.2012
     permalink
    Ich habs, Wayfinder-Template war das Stichwort :-)
    •  
      CommentAuthorsam
    • CommentTime25.06.2012
     permalink
    Kann es sein, dass das Snippet nur bestimmt, ob die ID gerade oder ungerade ist?
    Nein.

    Funktionsweise:
    Das Snippet wf.setCounters erstellt ein Array mit den IDs der von Wayfinder ermittelten Ressourcen und deren Positionen und legt es in einer globalen Variable ab. Der Parameter &name bestimmt einen Teil des Namens dieser globalen Variablen und ist nur notwendig, wenn Positionen der Menüs mehrerer Wayfinder-Aufrufe ermittelt werden sollen. Die Positionen werden dann mit dem wf.getCounter-Modifier ermittelt. Falls der &name-Parameter des wf.setCounters-Snippet-Aufrufs gesetzt ist, müssen dieser und der Parameter des wf.getCounter-Modifiers identisch sein.
    Ob die Position gerade oder ungerade ist, wird mit dem mod-Modifier geprüft.