Beiträge von Torty

    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

    Zitat von Dr. Evil

    Hab alles so vorgefunden, wie du es beschrieben hast. Leider kommt beim Aufrufen der Plone-Seite jetzt eine Fehlermeldung. Kann aber nicht sagen, warum.. Da steht eine lange Liste mit irgendwelchen Meldungen/Pfadangaben und darunter folgendes:

    Woran kann das liegen?


    Ok, dann gib nochmal den Screen von dem Fehler der dir ausgegeben wird.
    Das muss doch zu ergründen sein, was da nicht passt. ;)

    Torty

    Zitat von Seawolf-371

    muss jetzt nur mal schauen wie es geht das ich dann nur den ertsen Ordner abwärts schaue.


    Du meinst also dass er nur 1 Level tiefer geht und nicht alle News aus den Unterorndern mit ausgibt?

    Schau dir dazu mal die Optionen an die du mit der Catalog-Anfrage mitgeben kannst. Speziell die zum ExtentedPathIndex.

    Torty

    Ein Problemchen kann es auch noch geben.
    Nach dem Install existiert unter portal_skins/Properties ein weiter Skin mit Namen Simpleskin und dieser ist auch als Default-Skin ausgewählt. Hier kann es nun sein, dass in dem Layerfeld keine Einträge ala SimpleSkin_ecmascripts usw. existieren.
    In diesem Fall schaut in dem Layerfeld darüber und kopiert die 3-4 SimpleSkin_-Einträge in das SimpleSkin-Layerfeld.

    Bei Gelegenheit muss ich mir dieses Problem mal vornehmen.

    Torty

    Ok - es ist geschafft.

    Ich habe also ein Mini-Script geschrieben, welches ab dem aktuellen Ordner nach News schaut.
    Um das Script zu nutzen macht folgendes:
    * unter portal_skins/custom ein neues PageTemplate mit der ID my_news_portlet erstellen
    * Inhalt löschen und durch untenstehenden Code ersetzen
    * speichern
    * in den Properties eurer Plonesite (also im Plonesite Root) im Feld right_slots den Macroaufruf

    Zitat

    here/portlet_news/macros/portlet


    ersetzen durch

    Zitat

    here/my_portlet_news/macros/portlet


    * speichern

    Das Verhalten des neuen Portlet ist dabei wie folgt:
    Struktur:


    Das Script sucht nach allen veröffentlichten News ab dem aktuellen Pfad abwärts. Daraus ergibt sich nun folgende Portlet-Ausgabe in Abhängigkeit zum aktuellen Pfad:

    Code
    Pfad      -->  Anzeige
    --------------------------------
    /             "Item 1" bis "Item 5"
    /news1        "Item 1"
    /ordner-1     "Item 2" + "Item 3"
    /ordner-2     "Item 4" + "Item 5"
    /ordner-3     ---


    Das sollte doch das sein was du gern möchtest - oder?

    Der Code des Mini-Script my_portlet_news lautet:

    Torty

    Oh man - das hat echt länger gedauert als erwartet...

    Ok anbei also das SimpleSkin-ZIP.
    Ihr müsste es in euer Products-Verzeichnis entpacken und den Zope-Server neu starten. Danach legt am besten eine neue leere Plonesite an.
    Dann findet ihr unter portal_quickinstaller das Produkt SimpleSkin. Installiert das und geht auf die Startseite der neuen Plonesite. Die Schrift müsste nun deutlich größer als normal sein. Das nur als Hinweis.

    Wechselt hier nun ins ZMI - setzt dafür an die URL oben ans Ende /manage.
    Legt nun ein neues PageTemplate an und vergebt dafür die ID index_html und klickt auf Edit. Ladet den Inhalt der Datei frontpage.pt aus dem SimpleSkin-Verz. /ZMI hoch und klickt auf speichern.

    Geht nun wieder zurück auf die normale Plonesite und ihr seht dass nun die neue index_html ausgegeben wird.

    Ich hab nun ehrlich gesagt keine Lust alle Details hier reinzutippern und überlasse es euch den SimpleSkin zu erforschen. Wenn ihr Fragen habt dann postet sie natürlich wieder hier oder besser macht einen SimpleSkin-Thread auf. :)

    Ok - ich bin raus

    PS: Lasst den Zope-Server im Debug-Mode laufen!!!

    Torty

    Hehe - ja so gings uns (fast) allen.

    Und ich meine *nicht* dass du die Orignalfiles ändern sollst. Aber das wird dir mit der Lektüre zu den Skins schon klar.

    Ich kann mal einen very simple Skin hier als ZIP posten, dann habt ihr eine Grundlage für eigene Skins. Das braucht jedoch etwas Zeit und ich schau mal ob ich die in den nächsten Tagen finde.

    Stay tuned.

    Torty

    Nein das klappt nicht, aber du bringst mich da auf eine Idee, die ich auch übersehen hatte.
    Die Methode get() erwartet 2 Parameter:
    1.) Name des Key/Attribut des Objektes auf das es angewendet wird
    2.) einen Defailt-Wert, falls der Key nicht gefunden wird

    In deinem Fall sieht also die kürzeste Möglichkeit so aus:
    1.) eigenes Script ermittelt die News aus dem news-Folder im aktuellen Context
    2.) diese Liste an Brains wird in REQUEST als Key 'news' gespeichert

    Dadurch findet die get-Methode im Portlet deine News-Liste und verwendet nicht die Catalog-Anfrage wie oben gesehen.

    Ich weiß das klingt etwas kompliziert, aber damit kann das Standard-News-Portlet verwendet werden und ich denke das ist auch so vorgesehen.

    Ich hab zur Sekunde wenig Zeit, aber ich probiere das heute noch aus, denn das interessiert mich auch sehr.

    stay tuned

    Torty

    1.) Da du den Skin/Template nun sowieso neu erstellst und dein altes nur als Vorlage nimmst, so schmeiße auch gleich die Frames über board. Gerade in Bezug auf Barrierefreiheit sind Frames Müll + Gift.

    2.) Ja - es kann durchaus sein, dass du mehr als 1 Template/Macro an deine Bedürfnisse anpassen musst. Befasse dich hier mal mit dem Thema: "Erstellung eines Skin im Filesystem". (also nicht in /custom)

    Die Templates sind dabei (rein vom Namen her) die selben die auch Plone verwendet. Also als Haupttemplate käme das main_template.pt zum Einsatz und für den Header ist dann das header.pt zuständig usw.

    Lies dich erstmal ein und dann diskutieren wir weiter ... :)

    Torty

    Wie meinst du das mit den Auflösungen? Willst du 3 fixe Layouts erzeugen?
    Diesen Aufwand würde ich nicht treiben. Baue ein flexibles oder auch liquides Layout und der User hat die Freiheit in der Auflösung zu sehen wie er es möchte.

    Torty

    Also die News für das Portlet werden durch die Klasse NewsPortlet gesucht. Siehe dazu Plone2.5.2/CMFPlone/browser/portlet/news.py
    Dort findest du die Methode


    Wie man hier sehen kann werden alle veröffentlichten News die in der aktuellen Plonesite gefunden werden ausgegeben.

    Somit kommst du nicht umhin den Code für das News-Portlet selbst zu schreiben. Eine mögliche Variante wäre die, dass dein neues Portlet im aktuellen Ordner nach einem Folder mit der ID 'news' sucht und diesen ausgibt.

    Ich sehe also nur ein eigenes Portlet als gangbare Variante.

    Torty

    Also deine Methode sieht ok aus.

    Ich habe bei mir z.B. in einem ATImage-Clone eine Methode die ein PIL-Image ausgiebt, welches vorher durch myImage.getvalue() in _thumb abgelegt wurde.


    und im entsprechenden Template gebe ich es in Etwa so aus

    Code
    ...
      [img][/img]
    ...


    Einige Sachen sind noch Produkt-bezogen. Im Grunde sollte dir das aber weiterhelfen.

    Torty