![]() ![]() |
Sie sind hier: FAQ > Zope FAQ > PythonScripte > Inhalt eines Folders zur�ckgeben Inhalt eines Folders zur�ckgebenFrage:
Wie kann ich den Inhalt eines bestimmten Folders zur�ckgeben (z.B. f�r ein Selection Feld)?
Antwort:F�r bestimmte Anwendungen muss man eine Liste von Objekten, die sich innerhalb eines Folder befinden, erstellen. Eine Anwendung ist zum Beispiel der Property Typ Selection, der einen Python Script als Argument erwartet, welcher eine List zur�ck gibt. Ein anderer Fall ist ein Page Template, welches zum Beispiel alle Bilder in einem Folder auflistet. In diesen Beispielen wird von der Standardzuordnung ausgegangen: ##bind container=container ##bind context=context ##bind namespace= ##bind script=script ##bind subpath=traverse_subpath ##parameters= ##title= Einfachster FallScript gibt alle Objekte zur�ck, die sich in seinem Kontext befinden. Kontext ist der "Ort", von der der Script aufgerufen wird: return [ ob for ob in context.objectValues() ] Script gibt die ID der Objekte zur�ck, die sich in dem selben Folder befinden, in dem auch der Script befindet, nur er selber wird nicht zur�ck gegeben: return [ ob.getId() for ob in container.objectValues() if ob != script ] Komplexere BeispieleScript gibt ein Dictionary mit Id, Titel, Icon und Objekt im Kontext zur�ck, aber nur wenn es sich um ein DTML Dokumente, DTML Methoden oder Page Templates handelt und das Objekt nicht "index_html" hei�t: return [ {'id' : ob.getId(), 'title' : ob.title_or_id(), 'icon' : ob.icon, 'object' : ob} for ob in context.objectValues(['DTML Document', 'DTML Method', 'Page Template']) if ob.getId() != 'index_html' ] (Hinweis: Effektiver w�re es, wenn man nur das Objekt zur�ck geben w�rde und Id, Icon und Titel an der Stelle erfragt, an der man diese Variable braucht. Das Beispiel hier zeigt nur die M�glichkeiten, die es gibt.) Objekt nur dann in die Liste einf�gen, wenn es ein bestimmtes Property besitzt: return [ ob for ob in context.objectValues() if ob.hasProperty('PropertyName') ] Nur dann eine Liste von Objekten zur�ck geben, wenn dieser Folder eine index_html besitzt: if hasattr(container.aq_explicit, 'index_html'): return [ ob for ob in context.objectValues() if ob.hasProperty('PropertyName') ] else: return [] (Hinweis: aq_explicit schaltet die Akquisition - vereinfacht gesagt - aus. Ansonsten w�rde Zope vielleicht in tieferen Ebenen nach einer index_html suchen. Wenn man sich nicht sicher ist, sollte man die Akquisition immer manuel mit den entsprechenden Methoden kontrollieren. "return []" kann man sich sparen, wenn man nicht zwingend eine Liste als R�ckgabewert erwartet) K�nigsbeispielPython Script: ##parameters=meta = ['Folder', 'Page Template', 'PropertyObject', 'PropertyFolder', 'Photo', 'PhotoFolder',] # Falls meta leer ist (Script z.B: mit ("") aufgerufen), dann alle Objekte zur�ck geben if meta: objects = context.objectValues(meta) else: objects = context.objectValues() # Erstelle eine Liste mit allen Objekten, die entweder kein Property "published" haben oder deren Property "published" True ist ob = [ ob for ob in objects if not (hasattr(ob.aq_explicit, 'published') and not ob.published) ] # Sortiere aufgesteigend (asc) und ohne Ber�cksichtigung der Gro�/Kleinschreibung (nocase) nach Titel # oder nach der Id, falls der Titel leer ist (title_or_id) ob = sequence.sort(ob, (('title_or_id', 'nocase', 'asc'),)) # folder enth�lt alle Objekte, die sich wie ein Folder verhalten # item enth�lt alle Objekte, die sich nicht wie ein Folder verhalten und nicht index_html hei�en return { 'folder' : filter(lambda x: x.isPrincipiaFolderish, ob), 'item' : filter(lambda x: not x.isPrincipiaFolderish and x.getId()!= 'index_html', ob), } Page Template (Ausschnitt):
Rubriken: PythonScripts FAQ angelegt von: Tiran, Letzte �nderung: 05.06.2003 21:58 Uhr |