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

    • CommentAuthorHatori
    • CommentTime24.07.2010 bearbeitet
     permalink
    Moin,

    wie ich eine TV mit Mehrfachauswahlliste erstelle, hab ich rausgefunden, war ja nicht so schwer. Nun hab ich aber keinen Bock, diese Dinger von Hand immer wieder anzufassen, denn die wachsen mit jeder neuen Ressource eines bestimmten Ordners.
    Um ein konkretes Beispiel zu bringen:
    Ich habe diverse Musikstile, für jeden ein Dokument. Nun will ich ja Interpreten diese Stile zuordnen.
    Die Experten werden jetzt lachen, aber das einzige, was mir eingefallen ist, war getRessource zu benutzen, war möglicherweise 'ne doofe Idee, erschien mir aber erstmal logisch ... ok, geht nicht, weiß ich jetzt auch ;)
    Geht das überhaupt, eine TV dynamisch zu erstellen? Wenn ja, bitte ein paar Stichpunkte für einen Lösungsansatz. Bitte nix fertiges, sowas muss ich alleine rauskriegen, sonst weiß ich es beim nächsten Mal wieder nicht. Ich muss nur wissen, wonach ich suchen muss ;)

    Ciao Hatori
    • CommentAuthorBruno
    • CommentTime24.07.2010 bearbeitet
     permalink
    Dafür gibt es die Bindings @SELECT bzw. @EVAL
    Die kannst Du in den Engabeoptionswerten einsetzen um die Auswahloptionen dynamisch generieren zu lassen.

    Könntest also mit @EVAL return $modx->runSnippet('getResources',array('parents'=>'999','tpl'=>'myOptionsItem'));

    auch getResources dazu bringen Dir die entsprechenden Optionen generieren zu lassen.
    In Evo hat man dafür aber eher @SELECT verwendent mit der passenden mysql-anweisung. Wird in Revo wohl auch noch funktionieren.

    findest Du hier im Forum genügend Beispiele.
    • CommentAuthorHatori
    • CommentTime25.07.2010
     permalink
    Moin,

    das hört sich interessant an, wobei ich @SELECT schon im Auge hatte, mir nur noch nicht klar ist, wie ich die Ergebnisse dann so formatiere, wie ich sie brauch. Mit @EVAL sieht das einfacher aus, aber eval() in PHP ist ja pöse und hier hab ich auch einige Warnungen dazu gelesen.
    Ich werde beides probieren, danke erstmal.

    Ciao Hatori
    • CommentAuthorHatori
    • CommentTime27.07.2010 bearbeitet
     permalink
    Moin,

    ein Stück weiter bin ich dann schon mal :smile:
    Das hier geht nicht:
    @EVAL return $modx->runSnippet('getResources',array('parents'=>'15','tpl'=>'auswahlListe','tplLast'=>'auswahlListeLast','sortby'=>'pagetitle','sortdir'=>'ASC'));

    Macht aber nichts, denn das hier ist mir eh lieber:
    @SELECT pagetitle from site_content WHERE parent='15'

    Das gibt mir die Liste für die Mehrfachauswahl und im Document gibt es dann auch die korrekten Einträge.
    Was mir jetzt noch Kopfzerbrechen macht: Wie formatiere ich das auf der Seite? Im Moment hab ich für "Ausgabetyp" Zeichenkette und nichts eingestellt, das gibt zwischen den Worten ||, also zwei Pipes. Ich hätte da gern ein Komma und ein Leerzeichen. Wenn ich "Liste mit Trennzeichen" einstelle und als Trenner das Komma, krieg ich zwar das Komma, ein dazu geschriebenes Leerzeichen wird aber entsorgt. Das macht den Inhalt zwar nicht falsch, sieht aber besch...eiden aus.
    Zudem möchte ich die Ergebnisse ja sowieso mit einem Link unterlegen (da kommt dann halt die ID noch mit ins select), irgendwie müsste das Ding also in einen Chunk ... ich weiß da gerade echt nicht weiter :sad:

    Ciao Hatori
    • CommentAuthorBruno
    • CommentTime27.07.2010
     permalink
    das kannst Du mit nem output-filter(früher phx) lösen.
    snippet erstellen, welches dir im output die pipes (pipes2comma) durch die gewünschten zeichen ersetzt.

    und so aufrufen:

    [[*myTV:pipes2comma]]
    • CommentAuthorHatori
    • CommentTime28.07.2010
     permalink
    Moin,

    in normalem PHP ist mir das klar, aber wie sag ich ihm hier, welches der dritte Parameter ist?
    $search = "||";
    $replace = ", "
    $tv = str_replace($search, $replace, UNDwasKOMMThierHIN);
    return $tv;

    Kann nicht gehen, ist schon klar, aber wie erklär ich ihm das?

    Ciao Hatori
    • CommentAuthorBruno
    • CommentTime28.07.2010 bearbeitet
     permalink
    hier findest Du die übergebenen parameter

    demnach:

    <?php
    $search = "||";
    $replace = ", ";
    return str_replace($search, $replace, $input);
    • CommentAuthorHatori
    • CommentTime28.07.2010 bearbeitet
     permalink
    Perfekt, funktioniert :)
    Genau, solche Sachen, wie der Link zur richtigen Seite in der Doku, sowas ist mir immer willkommen. Ist ja nicht so, dass ich nicht lesen kann (oder will), nur wenn man als Anfänger vor was Neuem sitzt, weiß man eben oft nicht, wonach man überhaupt suchen soll. Ging mir ewig so mit PHP, da gibts aber glücklicherweise eine feine Mailing-Liste, wo man das dann auch so gesagt bekommt.
    Danke erstmal, Bruno, dann werd ich mich mal beimachen und gucken, wie ich das nun auch noch als Link gestrickt kriege ;)

    Ciao Hatori
    • CommentAuthorHatori
    • CommentTime29.07.2010 bearbeitet
     permalink
    Man, man, ist das kompliziert :surprise:
    In PHP würde ich jetzt einfach die Elemente des Arrays $input zählen und per while-Schleife meine Links bauen.
    Aber $input ist ja gar kein Array, zumindest wird mir mit count($input) nur 1 angezeigt. Zudem habe ich jetzt in den SELECT die ID mit reingetan und komme so an den pagetitle scheinbar gar nicht mehr ran, die Ausgabe zeigt mir zumindest nur noch die IDs aber nicht die pagetitles. Also würde explode($input) wohl auch nicht weiterhelfen. Wenn ich mir $input anzeigen lasse, bestätigt mir das diese Vermutung, sieht z.B. so aus:
    Input = 20||18||27

    Irgendwie weiß ich grad nicht weiter ... neuerliche Denkanstöße wären sehr willkommen. Das einzige, was mir jetzt einfällt:
    - $input exploden
    - neue SELECTs mit den IDs, die hab ich ja
    - Links zusammenbauen
    - alles wieder zu $input imploden
    Gehts auch einfacher?

    Ciao Hatori
    •  
      CommentAuthorMarc
    • CommentTime29.07.2010 bearbeitet
     permalink
    Bin in Revo ja noch sehr unbefleckt, deshalb mal nur schematisch gedacht:

    In Deiner TV stehen die IDs durch Komma (oder wie auch immer) getrennt drin. du willst Links mit Seitentitel als Linktext. Okay.

    Also Snippet erstellen "meineLinks" sowie Deine TV "links" mit der Mehrfachauswahl.

    Aufruf mit
    <ul>
    [[meineLinks? &links=`[[*links]]`]]
    </ul>


    Im Snippet dann:

    1. explode von $links -> $docArray
    2. foreach $docArray as $doc
    3. $docData = $modx->getDocument($doc);
    4. $output = $modx->parseChunk('meinLinksChunk',array('titel' => '$docData['pagetitle'],'id'=>'$docData['id']));
    5. end foreach

    Da wir ja alle hier lernen, der Output eben schön per Chunk "meinLinkschunk":

    <li><a href="[[~[[+id]]]]">[[+titel]]</a></li>

    So in der Art halt ;) Schau Dir die Docs an von Revo. Es ist alles so einfach mittlerweile. Du kommst an alle Daten wunderbar einfach ran. Siehe auch hier den Artikel vom Peter:

    http://www.peterkroener.de/programmieren-fuer-modx-revolution/
    • CommentAuthorBruno
    • CommentTime29.07.2010 bearbeitet
     permalink
    getResources kennt leider den parameter &documents (noch) nicht. Du könntest aber einfach mal Ditto probieren. Mußt ja nicht das Rad neu erfinden.

    Ginge dann so:

    als Ausgabetyp der tv nimmst Du delimeted als delimiter das komma.

    dann der Ditto-Aufruf:

    [[!Ditto? &documents=`[[*myTV]]`&tpl=`myLinkChunk`]]

    und Marcs chunk

    <li><a href="[[~[[+id]]]]">[[+titel]]</a></li>

    falls Ditto nicht richtig mitspielt, mit bloX ginge das natürlich auch.
    • CommentAuthorHatori
    • CommentTime29.07.2010 bearbeitet
     permalink
    @Bruno
    Ja nee, Ditto soll ja ganz verschwinden, also kann ich es auch gleich irgendwie richtig machen ;)

    @Marc
    Irgendwas hab ich noch nicht verstanden. Ich hab ein Snippet (snStil2Link) mit folgendem Inhalt:
    $id = $modx->resourceIdentifier;
    $doc = $modx->getObject('modResource', $id);
    $tvStilId = $doc->getTVValue('tvDynStilartenMusik');
    $tvIdArray = explode('||', $tvStilId);
    foreach($tvIdArray as $id2) {
    $docs = $modx->getObject('modDocument', $id2);
    $output[] = array('id' => $docs->get('id'), 'titel' => $docs->get('pagetitle'));
    };

    Und einen Chunk (stil2link):
    <a href="[[~[[+id]]]]">[[+titel]]</a>
    Wenn ich mir das per print_r($output) anzeigen lasse, gibt es das hier:
    Array ( [0] => Array ( [id] => 20 [titel] => Country ) [1] => Array ( [id] => 18 [titel] => Gospelmusik ) [2] => Array ( [id] => 27 [titel] => Heavy Metal ) )
    Soweit so gut, aber jetzt hakts. Wenn ich die letzte Zeile oben im Snippet, so schreibe, wie von Marc vorgeschlagen,
    $output[] = $modx->parseChunk('stil2link', array('id' => $docs->get('id'), 'titel' => $docs->get('pagetitle')));
    kommt sowas raus:
    Array ( [0] => Country [1] => Gospelmusik [2] => Heavy Metal )
    Wobei das im Seitensource dann allerdings so aussieht:
    Array
    (
    [0] => <a href="">Country</a>
    [1] => <a href="">Gospelmusik</a>
    [2] => <a href="">Heavy Metal</a>
    )

    Wie man sieht, werden die pagetitle geschrieben, aber nicht die id. Irgendwie komm ich mit dem Aufruf des Snippets nicht klar, das blick ich nicht, was Marc oben geschrieben hat. Und ohne die eckigen Klammern hinter $output krieg ich eh nur den letzten Datensatz, ist ja auch klar, überschreibt ja die vorherigen immer wieder.
    Rufe ich das Ding ohne das print_r auf, indem ich [[snStil2Link]] in die Seite schreibe, passiert gar nichts.
    Es klappt ja fast, aber eben nur fast :( Sieht jemand den Fehler?

    Ciao Hatori
    • CommentAuthorHatori
    • CommentTime29.07.2010 bearbeitet
     permalink
    Unsauber, aber so gehts:
    $id = $modx->resourceIdentifier;
    $doc = $modx->getObject('modResource', $id);
    $tvStilId = $doc->getTVValue('tvDynStilartenMusik');
    $tvIdArray = explode('||', $tvStilId);
    foreach($tvIdArray as $id2) {
    $docs = $modx->getObject('modDocument', $id2);
    $docsId = $docs->get('id');
    $docsTitle = $docs->get('pagetitle');
    $link = '<a href="[[~'.$docsId.']]" title="'.$docsTitle.'">'.$docsTitle.'</a>, ';
    echo $link;
    };

    Sieht im Source dann so aus:
    Interpret (<a href="index.php?id=20" title="Country">Country</a>, <a href="index.php?id=18" title="Gospelmusik">Gospelmusik</a>, <a href="index.php?id=27" title="Heavy Metal">Heavy Metal</a>, )
    Genau das will ich haben, mal abgesehen vom letzten Komma, aber was solls, man kann (erstmal) nicht alles haben :wink:
    Wäre trotzdem dankbar für eine "ordentliche" Lösung, alleine schon deswegen, weil ich das später in umgekehrter Richtung auch noch brauch. Hier wird bei Interpreten in Klammern deren bevorzugte Stilrichtungen angezeigt mit Link auf die Beschreibung des Stils.
    Bei den Stilen (bzw. Genres) sollen dann später die Interpreten auftauchen, die eben den jeweiligen Stil bevorzugen.

    Ciao Hatori
    •  
      CommentAuthorMarc
    • CommentTime29.07.2010 bearbeitet
     permalink
    $id = $modx->resourceIdentifier; // unnötig
    $doc = $modx->getObject('modResource', $id); // unnötig
    $tvStilId = $doc->getTVValue('tvDynStilartenMusik'); // unnötig


    Aufruf des Snippets (wie oben beschrieben gleich mit &Stile=`[[*tvDynStilartenMusik]]`
    dann ist die TV schon im Snippet vorhanden:


    $tvIdArray = explode($Stile);
    foreach($tvIdArray as $id2) {
    $docs = $modx->getObject('modDocument', $id2);
    $output .= $modx->parseChunk('stil2link',array('titel' => '$docs['pagetitle'],'id'=>'$docData['id']));
    };
    return $output;


    Wichtig: Der Output ist kein Array, sondern sammelt nur die Ausgabe.
    • CommentAuthorHatori
    • CommentTime29.07.2010 bearbeitet
     permalink

    $tvIdArray = explode('||', $Stile);
    foreach($tvIdArray as $id2) {
    $docs = $modx->getObject('modDocument', $id2);
    $output .= $modx->parseChunk('stil2link',array('titel' => $docs['pagetitle'],'id' => $docs['id']));
    };
    echo $output;


    Gibt dann das hier:
    Fatal error: Function name must be a string in D:\xampp\xampplite\htdocs\modxrevo\core\cache\elements\modsnippet\24.include.cache.php on line 15
    :sad:

    Ciao Hatori
    • CommentAuthorBruno
    • CommentTime29.07.2010 bearbeitet
     permalink
    geht das?

    <?php

    //[[getDelimResources? &tpl=`mychunk` &pipelist=`[[*listTV]]` &delimiter=`, `]]

    $delimiter = $modx->getOption('delimiter',$scriptProperties,',');
    $tpl = $modx->getOption('tpl',$scriptProperties,'');
    $pipelist = $modx->getOption('pipelist',$scriptProperties,'');

    if ($tpl == '' || $pipelist == ''){return;}

    $tvIdArray = explode('||', $pipelist);
    foreach($tvIdArray as $docid) {
    $resource = $modx->getObject('modDocument', $docid);
    $output[] = $modx->getChunk($tpl,$resource->toArray());
    };
    return implode($delimiter,$output);

    ?>
    • CommentAuthorHatori
    • CommentTime30.07.2010
     permalink
    Moin,

    nein, geht auch nicht, $output[] bleibt einfach mal leer. Hab versucht, ein wenig damit zu spielen, ändert aber nichts. Das einzige bisher, was genau das tut, was ich will, ist mein unsauberes von weiter oben.
    Na egal erstmal, damit beschäftige ich mich später nochmal, erstmal muss die Seite Online und funktionieren, für den Feinschliff hab ich später noch Zeit ;)
    Danke erstmal. Ich markier das erstmal als "erledigt", hol ich dann irgendwann wieder vor ;)

    Ciao Hatori
    • CommentAuthorBruno
    • CommentTime31.07.2010
     permalink
    sehr komisch, bei mir funktionierts