• Hallo,

    beschäftige mich gerade mit tal/tales und komme mit der "repeat"-Anweisung nicht weiter.

    Es ist kompliziert, mein Problem zu erklären. In der repeat-Anweisung weist man ja einer "Variable" (hier zeile) ein Item aus einem Objekt zu. Woher weiß ich, was ich der Variable zeile zuweisen kann, z.B. tal:repeat="zeile context/portal_actions" und was das dann bewirkt. Kann man das im ZMI herausfinden? Wenn ja, wie und wo? Hoffentlich habe ich mich einigermaßen verständlich ausgedrückt. Wäre nett, wenn mir da jemand weiterhelfen könnte!

    Gruß,
    Dr. Evil

  • Ok, prinzipiell verhält sich das so:

    Code
    for item in xyz:
        do_something_with(item)


    entspricht in TAL dem

    Code
    <tal:loop repeat="item xyz">
        <i tal:define="dummy python: do_something_with(item); ... />
    </tal:loop>

    Dabei ist zu beachten:
    * xyz muss iterierbar sein
    * item stell dann jeweils 1 Element dieser "Liste" dar

    Was ist nun iterrierbar? Prinzipiell alles was sich als Liste verstehen lässt. Also ganz grob wären dies Dictionary, Tuple, List, Iterator, String.
    Damit sind dies hier alles mögliche Werte für xyz:
    * {'a': 1,'b': 2, ...}
    * (1, 3, 7, 11)
    * ['a', 'b', 'c', ...]
    * range(1, 20)
    * rangex(1,100, 5)
    * 'abcdefgh'

    In Plone sind alle Sachen Objekte und werden auch also solche zurückgegeben. Es gibt aber auch Rückgabewerte die direkt z.B. Tuple sind.
    Du kannst dies relativ einfach überprüfen:
    * benutze den SimpleSkin und editiere die SimpleSkin_macros.pt
    * scroll ganz runter zum Debug-Macro
    * editiere dort das <tal:quick wie folgt:

    Code
    <tal:quick condition="python: True">
      <div tal:define="data python: portal.portal_properties.site_properties;"
           tal:content="data">
      </div>
    </tal:quick>


    * speicher es und ruf die Seite neu auf
    * ganz unten siehst du nun eine Ausgabe wie diese: <SimpleItemWithProperties at site_properties>
    * solche Zope/Plone-eigenen Objekte werden dir allenthalben begegnen
    * um zu wissen was das nun kann kannst du a) im Netz suchen b) in Büchern lesen c) in Foren nachfragen d) dir das Objekt mit dir(item) genauer anschauen oder e) im Code schauen

    Am schnellsten sind Methode d) wozu du jedoch die angehängte externe Methode brauchst und e) wozu du einen guten Editor brauchst (wie PSPad) der auch über viele Verzeichnisse hinweg nach einem Wort (hier wäre dies z.B. "SimpleItemWithProperties") suchen kann.
    Beide Varianten sind interessant, aber auch fehleranfällig. Deshalb wäre für dich im Moment wohl eher a) und b) die richtige Wahl.
    Ich glaub ich kann das auch nicht so auf die Schnelle alles zusammenfassen. :-/

    Um also mal bei unserem tal:quick zu bleiben:
    * über die Suche im Code gelangt man nun dazu dass es eine Methode propertyItems() gibt.
    * diese bauen wir nun so in tal:quick ein "portal.portal_properties.site_properties.propertyItems();"
    * speichern und Seite neu laden
    * nun sehen wir alle Properties von site_properties als Tuple-Liste
    * ein beherztes "dict(portal.portal_properties.site_properties.propertyItems());" gibt uns diese als Dictonary zurück

    Abschließend würde unser Bsp. nun so aussehen

    Code
    data = dict(portal.portal_properties.site_properties.propertyItems())
    for prop in data:
        print '%s : %s) % (prop, str(data[prop]))


    und in TAL dann entsprechend so

    Code
    <tal:quick condition="python: True">
      <div tal:define="data dict(portal.portal_properties.site_properties.propertyItems());">
        <tal:loop repeat="prop data"
                  content="python: '%s : %s' % (prop, str(data[prop]))" />
      </div>
    </tal:quick>

    Das sollte nur mal ein Bsp. dafür sein, was man von Plone als Rückgabewerte erhalten kann.
    Ich hoffe es war nicht zu verwirrent ;)

    Und mach dir keine Sorgen darüber, dass du Probleme hast die nötigen Informationen zu den Objekten zu finden. Das ist eines der Mankos von CMF/Plone. Es gibt jede Menge Anleitungen, ToDos usw. aber nichts was "am Stück" die dinge darstellt. Damit findet man sich ab und nach einiger Zeit findet man dann auch stets recht schnell was man sucht.
    Notfalls fragt man in einem Forum oder auf der DZUG-ML nach :)

    Torty

    "Carpe Diem" powered by positiv Feelings

  • Die Erklärung ist wirklich gut verständlich. Ich hab dann gleich zum Testen ein paar dictionaries erstellt und in eine repeat-Schleife eingebaut. Hat super funktioniert. Allerdings muss ich da noch mehr rumspielen, um vertrauter zu werden. Danke!