Ok, prinzipiell verhält sich das so:
entspricht in TAL dem
<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:
<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
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
<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