TAL - wie kann ich einen Variablenwert ändern?

  • Hallo.

    Ich habe 2 Variablen mittels tal:define definiert, beide vom Typ integer. Beide werden mittels tal:condition="var1 != var2" verglichen, anschließen möchte ich, falls der Verlgeich zu einem wahren Ergebnis führt, den Wert von var2 in den Wert von var1 ändern. Das habe ich mit tal:attributes="var2 var1" versucht, leider hat das nicht geklappt.
    Das Ganze sieht also ungefähr so aus:

    <{tag} tal:condition="var1 != var2" tal:content="var1" tal:attributes="var2 var1" />

    Kann mir bitte jemand weiterhelfen wie ich das am besten anstelle?

  • Hallo.

    Ich habe 2 Variablen mittels tal:define definiert, beide vom Typ integer. Beide werden mittels tal:condition="var1 != var2" verglichen, anschließen möchte ich, falls der Verlgeich zu einem wahren Ergebnis führt, den Wert von var2 in den Wert von var1 ändern. Das habe ich mit tal:attributes="var2 var1" versucht, leider hat das nicht geklappt.
    Das Ganze sieht also ungefähr so aus:

    <{tag} tal:condition="var1 != var2" tal:content="var1" tal:attributes="var2 var1" />

    Kann mir bitte jemand weiterhelfen wie ich das am besten anstelle?

    tal:attributes ändert keine Variablen sondern dient zum Setzen von HTML/XML Attributen des jeweiligen Tags.

    Generell gehört eine solch komplexere Logik ausgelagert in ein PythonScript oder einen Browserview.

  • Ok.

    Nun, ich weiß leider nicht wie ich das jetzt richtig realisieren soll.

    <td tal:define="publication_year related_object/getPublicationYear">
    <em tal:define="show_year python:here/getYearState(publication_year)" />
    <em tal:condition="python:show_year == 1" tal:content="publication_year" />
    </td>

    So habe ich es mir gedacht. Das Ganze soll dem Zweck dienen, dass verschiedene Dokumente nach Jahreszahlen geordnet werden sollen, d.h. sobald ein Dokument eine Jahreszahl hat die noch nicht bei der Auflistung dran war, soll ein neuer Absatz erstellt werden, wobei die neue Jahreszahl fett abgebildet wird und darunter die Dokumente erscheinen. Das wollte ich so machen, dass ich eine temporäre Variable benutze die die Jahreszahl des voriges Dokumentes enthält und mit der Jahreszahl des aktuellen Dokumentes vergleiche und falls diese nicht übereinstimmen, soll ein neuer Absatz erstellt werden. Nun habe ich die .py Datei des Content-Types dessen Attribute in diesem Template ausgelesen werden sollen, um ein weiteres IntegerFeld erweitert, dass die temporäre Variable darstellen soll. Eine Funktion, die ich noch nicht geschrieben habe (getYearState) soll dann das Jahr des aktuellen Docs mit dem im Feld gespeicherten Jahr vergleichen und eine 1 ausgeben falls beide nicht übereinstimmen, wobei die zurückgegebene 1 oder 0 in show_year gespeichert werden soll.

    Nun mein Problem. Wie realisiere ich das nun mit der Funktion und ist es überhaupt so möglich wie ich mir das mit dem weiteren Feld im Content-Type gedacht habe?
    Ich weiß leider nicht genau wie ich nun die Funktion bzw. das Skript im ZMI hinzufügen soll (externe Methode oder direkt ein Skript?) und v.a. weiß ich nicht wie ich denn das Feld der jeweiligen Content-Type-Instanz in diesem Skript bzw. in dieser Funktion ändern kann.

    Hilfe wäre super :)

    Viele Grüße

  • Es macht keinen Sinn eine solche Logik in ZPT zu packen. Du schreibst ein Script oder Browerview (The Definitive Guide to Plone/Professional Plone development sind gute Bücher), in der die Daten, die ausgegeben werden sollen zusammengesucht und vorbereitetet werden. Das ZPT ruft dann nur das entsprechende Skript auf und bekommt eine "vorverdaute" Datenstruktur, die man einfach ohne spezielle Krücken (siehe Dein Code) rendern kann.

  • Ich hab es nun soweit hinbekommen wie du beschrieben hast, denke ich. Das ZPT definiert nun eine Jahresvariable deren Wert durch den Rückgabewert des Scripts bestimmt wird, der ist entweder eine Jahreszahl oder 'None'. Funktioniert alles prima. Jetzt gibt es aber ein Problem was ich leider nicht bedacht habe. Ich speichere ja die Jahreszahlen der aktuellen Dokumente die durch die Schleife laufen, immer in einem Integer-Feld, welches ich nachträglich in der Klassendatei des entsprechenden ContentTypes definiert habe. Das funktioniert auch alles super, nur gibt es nun das Problem, dass man das Template nur als eingeloggter Benutzer ansehen kann. Als Gast bekommt man nun immer die Aufforderung sich einzuloggen. Ich brauche also nun eine Lösung ohne auf das Integer-Feld des ContentTypes zurückgreifen zu müssen. Gibt es denn eine Möglichkeit eine Variable zu definieren, die auch ausserhalb des Skripts existiert und deren Wert ich durch das Skript dynamisch ändern kann? Ich bin mir nicht sicher ob es funktioniert wenn ich die Variable aus einer Datei vom Dateisystem hole und dort wieder reinschreibe.