We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 28436
    • 242 Posts
    Hallo Leute,

    ich frage mich, ob es möglich ist, per Ditto nach einem bestimmten Durchlauf Dinge einzubauen.

    zur Verdeutlichung:

    Es gibt Container, die zur Darstellung von Spalten formartiert werden.
    <div class="s4">
        <div class="sInnen">
            
            <div class="vstBild">[*Bild*]</div>
            <p class="vstBildUnterschrift">[*BildUnterschrift*]<p> 
            <p class="vstBildText">[*Text*]<p>
        
        </div>
    </div>
    


    Die innnenliegenden Container sind so formatiert, daß sie halt Links und Rechts Abstand einhalten.
    div.sInnen{ margin:0 15px; }

    Hier würde ich gerne beim ersten und letzten Container pro "Zeile" die Klassenzuweisung um "slinks" bzw. "srechts" erweitern.
    Also so:
    <div class="sInnen slinks"> | <div class="sInnen srechts">

    div.slinks{ margin-left:0px; }
    div.srechts{ margin-right:0px; }
    


    Wie man sieht dient das um die erste und letzte Spalte direkt an den aussenkanten der Seite zu nullen.

    Nach jedem vierten Durchlauf sollten nun noch ein Trenner eingefügt werden
    <div class="clearboth"></div>


    Tja, so sollte das sein.

    Wer smarty kennt, kann es sich so vorstellen als wenn man einen Section-Durchlauf per section.iteration manipuliert.

    mmh... Bin nicht gerade ein Genie im klar darstellen von Dingen, gerne beantworte ich Fragen und bin für jeden Hinweis dankbar.

    machts gut, Stefan
      • 17883
      • 1,039 Posts
      Erstes und letztes Template gesondert formatieren:

      tplFirst User defined chunk to format the first document
      tplLast User defined chunk to format the last document

      Zum Thema Trenner schau Dir mal phx an, ich denke damit kannst Du sowas bauen (ist ähnlich Smarty). In ditto musst Du nur angeben &phx=`1`dann solltest Deine Templates dementsprechend formatieren können.
        • 28436
        • 242 Posts
        Danke für die schnelle Antwort, Du Tier.
        Ich habs noch nicht versucht, allerdings stelle ich mir vor, daß die Angelegenheit mit dem first und last template höchsten gut ist, wenn ich genau vier Einträge habe. Allerdings sind es z.B. im einen Fall 12 Einträge, die dann halt über drei Zeilen verteilt sind. Das last Tpl würde dann ja den 12ten Eintrag treffen und nicht den vierten, achten und 12ten. Vielleicht auch über pHx, keine Ahnung.

        Gut, weil ichs noch nicht versucht habe, kann ichs nicht genau sagen. Werde feedback geben wenn ich definitiv im Dilemma sitze.

        ciao, Stefan
          • 17883
          • 1,039 Posts
          Okay, jetzt habe ichs kapiert laugh

          First und Last greift dann natürlich nicht. Schau Dir phx mal an, ich selbst habe damit auch noch nicht viel gemacht. Aber ich denke dass man es hinkriegen sollte, gibt nen Haufen conditional Möglichkeiten.
            • 28436
            • 242 Posts
            Okay, jetzt habe ichs kapiert
            Schlauerle smiley

            Werd mein bestes geben und falls ich eine Lösung dafür finde, hier reinstellen.

            Danke für die Anteilnahme. Sonnigen Tag noch
            Stefan
              • 28436
              • 242 Posts
              Servus,

              Weil mich die Zeit drückt und es scheinbar nicht so ohne weiteres möglich ist den Durchlauf raus zu finden. Habe ich mich mit einer Template Variablen rausgerissen, die ich halt für jeden, in diesem Fall vierten, Eintrag gesetzt werden muß. Das wird Probleme geben, das seh ich jetzt schon.... gib ihm(dem Bearbeiter) irgendeine Wahl und er wird es zerstören... Das trennen der Zeilen bzw. auflösen der floats übernimmt ein PHx tag
              [+formatAusrichtung:is=`sRechts`:then=`<div class="clearboth vertikalAbstand"></div>`+]


              Den letztendlichen Tipp hab ich hier gefunden.
              http://modxcms.com/forums/index.php/topic,14478.0.html

              Wenn ich hoffentlich am WE etwas Zeit übrig habe, werde ich versuchen Ditto zu manipulieren um mir die Nummer des Durchlaufs selbst irgendwie raus zu holen. Falls ich hier was erreiche, werde ich es wieder hier posten, den der Wunsch eine Smarty-section zu imitieren ist weiterhin vorhanden.

              Danke für die Anteilnahme.

              ciao, Stefan
                • 28436
                • 242 Posts
                Servus,

                weil ich fast schon geknickt war, hab ich mir selbst geholfen, war so schwer dann auch nicht. Allerdings gibt es sicher schönere Lösungen, vielleicht mit den math Bedingungen aus phx. Wer weiß, habs leider nicht schnell gefunden und deshalb nicht weiter verfolgt.


                1. Nummer des aktuellen Durchlaufes aus Ditto in einen Platzhalter extrahieren

                Dafür muß das Ditto Snippet dran glauben. Ab Zeile ~933 beginnt die Scheife in der die Einträge verarbeitet werden. Hier wird der neue Platzhalter erstellt und gefüllt.
                $resource[$x]['iteration'] = $x;

                Also sieht der Fetzen dann so aus:
                for ($x=$start;$x<$stop;$x++) {
                    
                    $template = $ditto->template->determine($templates,$x,0,$stop,$resource[$x]["id"]);
                    // choose the template to use and set the code of that template to the template variable
                
                    /** 
                     * erstelle und fülle einen neuen Platzhalter 
                     * mit der Nummer des aktuellen Durchlaufes.
                     */
                    $resource[$x]['iteration'] = $x;
                
                    $renderedOutput = $ditto->render($resource[$x], $template, $removeChunk, $dateSource, $dateFormat, $placeholders,$phx);
                    
                    // render the output using the correct template, in the correct format and language
                    $modx->setPlaceholder($dittoID."item[".abs($start-$x)."]",$renderedOutput);
                
                    /*
                        Placeholder: item[x]
                        Content:
                        Individual items rendered output
                    */
                    $output .= $renderedOutput;
                    // send the rendered output to the buffer
                }
                


                Tja, ob das nötig, unnötig, falsch oder richtig ist, ob vielleicht die Nummer der aktuellen Iteration schon woanderst herkommt oder nicht kann ich nicht sagen... un wenn schon...

                Damit steht nun der Platzhalter "[+iteration+] " im Template zur Verfügung.

                Sehr gut, jetzt brauchts noch die Moduloberechung mit deren Ergebnis man was mit PHx anstellen kann.

                2. PHx Snippet( phx:modulo ) erstellen.

                <?php
                /**
                 * [+iteration:modulo=`n($options)`:is=`1`:then=`juhu`+] 
                 */
                if ( ( (int)$output + 1 ) % (int)$options === 0 )
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
                ?>
                


                Sieht vielleicht schei**e aus, kann ja noch(also niemals) um Parameterüberprüfung erweitert werden.

                3. Benutzung im Template

                Für n-ten Durchlauf

                [+iteration:modulo=`n`:is=`1`:then=`n-te Interation`+]


                z.B. [+ iteration:modulo=`4`:is=`1`:then=`<div class="clearboth"></div>` +]

                Wenn als Parameter 2 übergeben wird, hat man schon sowas wie eine Imitation der "cycle" Methode von Smarty
                [+iteration:modulo=`2`:is=`1`:then=`cycle_1`:else=`cycle_2`+]

                Beispiel:
                <div style="float:[+iteration:modulo=`2`:is=`0`:then=`left`:else=`right`+]"> links oder rechts? </div>



                Konkretes Beispiel anhand meiner Anforderung für einen vierspalter
                <div class="s4">
                    <div class="s4Innen [+iteration:modulo=`4`:is=`1`:then=`sRechts`+]">
                    [*content*]
                    </div>
                </div>
                [+iteration:modulo=`4`:is=`1`:then=`<div class="clearboth vertikalAbstand20"></div>`+]
                



                Soweit funktioniert das bei mir. Wenn jemand Bock drauf hat und eine gescheidigere Lösung findet(ist die überhaupt gesucht?), wäre es nett die hier zu posten.

                Danke

                ciao, Stefan
                  • 17883
                  • 1,039 Posts
                  Cool Stefan, sieht vernünftig aus. Könntest Du das vielleicht in die Wishlist von Ditto posten/tracken (samt Lösung)? Vor allem der Durchlaufparameter kann ja noch für andere Sachen missbraucht werden...
                    • 28436
                    • 242 Posts
                    Morsche,

                    Ich bin mir nicht sicher, was ich damit tun soll, ich habs ja gleich übertreiben müssen und hab noch zwei zusätzliche Beiträge zur Frage abgesetzt und hier http://modxcms.com/forums/index.php/topic,14478.0.html auch nochmal die Lösung reingehackt. Dort hat ja sicher auch der Ditto Guru die Meldung gelesen. Nerven möchte ich ja nun auch nicht. Ausserdem ist es ja so trivial, das der Guru das sicher auch gemerkt hat.

                    ciao, Stefan