Neue Herausforderung: "Nachricht hinzufügen" Formular anpassen

  • Hallo,

    gleich noch eine neue Herausforderung meinereiner ....

    ich versuche verzweifelt bei "Nachricht/Termin erstellen" das "description" Feld anzupassen.
    Ich möchte hierbei keine freie Textwahl zulassen sondern ein PullDown Menü mit vorgegebenen Einträgen einfügen.

    Nachdem ich nun herausgefunden, dass es das Formular (news_item/edit) nicht gibt
    (es wird wohl immer erst beim Aufruf generiert), stell ich mich auch wieder etwas bescheiden an,
    um eine Lösung zu finden.
    Ich hab das Produkt PloneFormGen installiert und hoffte dort nun die Lösung zu finden, aber genau dieses
    Feld ist damit nicht editierbar.

    Gibts da eine Lösung um mit überschaubaren Aufwand das hinzubekommen?

    Hier noch die Versionsübersicht:
    Plone 3.3.5
    CMF 2.1.2
    Zope (unreleased version, python 2.4.4, win32)

    Vielen Dank euch wiedermal
    Das Müllerchen

    "Man kann die Realität ignorieren, aber man kann nicht die Konsequenzen der ignorierten Realität ignorieren"
    - Ayn Rand, 1905-1982 -

  • Hallo,

    Products.schemaextender ist hier der richtige Ansatz. Da du ein Feld eines AT-Contenttypes verändern möchtest. AT generiert die Felder immer zur Laufzeit, PFG ist eine gute Erweiterung, kann aber leider nicht die AT-Felder überschreiben wie der SchemaExtender

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller

  • Hallo,

    entschuldige, natürlich archetypes.schemaextender,

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller

  • Hallo Pumukel

    hab heut endlich die Zeit gehabt das archetypes.schemaextender zu installieren, leider werd ich da schon mit Fehlermeldungen abgewürgt. Da ich noch kein rechter Freak in Plone bin, hab ich auch ein README zu einer korrekten Installation vermisst. Ich habs in der buildout.cfg unter:

    Code
    eggs =
            archetypes.schemaextender  >= 2.1

    installiert.

    Das Buildout läuft außer einer Warnmeldung durch. Nachdem ich den PloneController neu gestartet habe, zeigt meine Seite ... taataa ... TraversalError.


    Folgende Augabe lieferte bin\buildout

    Hier noch ein Auszug aus der Plone Seite:


    kannst du mit diesen Fehlermeldungen was anfangen? Ich stochere hier ziemlich im Nebel, will aber auf dieses Feature nicht verzichten. Vielen Dank noch mal für deine Zeit.

    Grüße Müllerchen

    "Man kann die Realität ignorieren, aber man kann nicht die Konsequenzen der ignorierten Realität ignorieren"
    - Ayn Rand, 1905-1982 -

  • Hallo

    Hab das ganze jetzt doch noch hinbekommen. Das Problem war bei mir, dass die Version 2.1.1 immer den Traversal Error erzeugt. Ich hab jetzt mit der 2.1er Version probiert, dass hat dann ohne Fehler funktioniert.

    Ich hab dann auch später mitbekommen, dass das archetypes.extender nicht in der Plonekonfiguration unter Zusatzprodukte als installierbares Produkt angezeigt wird. Ich habs dort vergeblich gesucht und die Installation des extenders mehrfach wiederholt. Bis ich dann mal dahintergestiegen bin und die Anleitung so nach und nach verstanden hab.

    Vielleicht bin ich auch nur einer der wenigen, der da so ziemlich an den Basics kratzt, aber ich würde das hier noch mal kurz “für dummies” wie ich einer bin, wiederholen. Ich hoffe nicht, das ich das Niveau hier dermaßen drücke ;)

    1. archtypes.extender installieren, dazu in der buildout.cfg unter

    Code
    [buildout]
    
    
    eggs =
           archtype.extender = 2.1 #da 2.1.1 den Fehler hervorrief
    
    
    zcml =
           archtype.extender


    eintragen und buildout starten. Archtype.extender ist nun installiert. Wichtig zu wissen, es gibt keine grafische Oberfläche für archetype.extender .... alles funktioniert über folgende zwei Dateien, welche angepasst werden müssen. Diese sind zu finden unter:

    Code
    C:\Programme\Plone\buildout-cache\eggs\archetypes.schemaextender-2.1-py2.4.egg\archetypes\schemaextender


    folgende Dateien werden angepasst

    Code
    extender.py 
    configure.zcml

    soweit sogut, ich habe das simple example aus der archetype Doku ausprobiert und es funktionierte tatsächlich. Dieses Boolean Feld war aber nur bei einer neu zu erstellenden Nachricht vorhanden. Bei nem Termin hat es das BooleanFeld nicht angezeigt.

    Mit folgendem Code wird für das Beispiel das Feld erzeugt:

    Python
    from Products.Archetypes.public import BooleanField
         from archetypes.schemaextender.field import ExtensionField
    
    
         class MyBooleanField(ExtensionField, BooleanField):
             """A trivial field."""

    der darauffolgende Code erzeugt lt. Anleitung den Adapter:

    schließlich löst der folgende Code in der configure.zcml die Registrierung aus:

    Code
    <configure xmlns="http://namespaces.zope.org/zope"
                   xmlns:five="http://namespaces.zope.org/five">
    
    
            <include package="archetypes.schemaextender" />
            <adapter factory=".extender.PageExtender" />
        </configure>

    Ich weiß nun nicht recht wie ich mich verständlich ausdrücken soll, aber aus dem Code kann ich nicht rauslesen, warum nur in ner neuen Nachricht das Feld drin ist, nicht aber in einem neuen zu erstellenden Termin. Hab leider grad nicht sehr viel Zeit für mein PloneProjekt aber würds gern verstehen. Gibts da vielleicht auch ne Doku für Dummies dazu?

    P.S. Bitte verbessert mich, falls ich hier falsche Sachen poste ... :)

    Danke euch im Voraus.
    Das Müllerchen

    "Man kann die Realität ignorieren, aber man kann nicht die Konsequenzen der ignorierten Realität ignorieren"
    - Ayn Rand, 1905-1982 -

  • Hallo,

    der SchemaExtender ist eine der komplexeren Modifikationsmechanismen in Plone. Daher ist es nicht verwunderlich das jemand an der Dokumentation und der Umsetzung Probleme bekommen kann. Prinzipiell wird von den meisten Entwicklern Kenntnisse mit Archetypes vorausgesetzt wenn man mit dem SchemaExtender arbeitet, was es wirklich extrem vereinfacht, da dann viele Fragen sehr logisch sind.

    Erstmal zu der Grundsätzlichen Frage warum nur neue Nachrichten das Feld haben:
    1. Auch normale Seiten / Dokumente haben das Feld.
    2. der Codeabschnitt

    Code
    class PageExtender(object):         
        adapts(IATDocument)         
        implements(ISchemaExtender)

    bestimmt für welche Überklasse von Content-Objekten diese anpassungen gelten, würdest du hier IATEvent stehen haben würde es für alle Termine gelten.

    Da du hier ohne umfängliche Archetypes-Kentnisse angefangen hast, ist dein Ergebnis eigentlich sehr gut, leider hast du trotzdem einige Sachen gemacht die man nie machen sollte:
    - Editieren in einem Quell-Egg,
    - Direktes binden der Version vom SchemaExtender,
    - Arbeiten ohne eigenes Development-Egg/Produkt.

    Es gibt drei Empfehlungen:
    1. Kauf dir das Buch "Professional Plone 4 Development" von Martin Aspeli,
    2. Besuche eine der DZUG/Plone User Gruppen in deiner Nähe (zu finden auf plone.de)
    3. Komm zur Deutschsprachigen Plone Konferenz München 2012 vom 22.02.-24.02. und den folgenden Sprints am Wochenende 25./26.02. (konferenz.plone.de)
    Alle drei möglichkeiten werden dir bei deinem Projekt und der Entwicklung von Plone Portalen helfen.

    Viele Grüße
    Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller

  • Hallo Pumukel

    ich danke dir für die Antwort. Ich seh schon, dass ich ohne weiterführende Kenntnisse nicht so recht weiterkomme. Ich werd mir jetzt erst mal das Buch besorgen, welches du vorschlägst. Leider auf Englisch, aber wird schon irgendwie gehen.

    Ich werd nun erstma in mich gehen und weiterlernen. Falls ich nicht weiterkomme, kann ich ja zur Not den Thread noch mal hochholen :)

    Danke und Grüße
    Müllerchen

    "Man kann die Realität ignorieren, aber man kann nicht die Konsequenzen der ignorierten Realität ignorieren"
    - Ayn Rand, 1905-1982 -

  • Hallo

    ich hoffe ich falle nich in Ungnade, dass ich nen alten Thread wieder hochhole, es passt halt immer noch hier dazu ...


    Inzwischen sehe ich einiges klarer, Archtypes sind (hoffentlich) verstanden auch der Schema.Extender ist mir nicht
    mehr so fremd. Doch es bleiben Unklarheiten und ich hoffe, dass Ihr mir noch ein bisschen weiterhelfen könnt ...

    Bei mir ging es um das Abändern des "Description" Feldes in einem Edit-Formular, anstatt dessen wollte ich gern ein Pulldown
    Menü mit vorgegebenen Einträgen einfügen.
    http://www.plone-entwicklerhandbuch.de/plone-entwickl…archetypes.html

    Ich habe das ganze nun im Schema.Extender mit einem LinesField gelöst. Zusammen mit dem MultiSelectionWidget bekomme
    ich das gewünschte Ergebnis. Zumindest das Feld erscheint. Mit "vokabulary" kann ich dann die Einträge definieren,
    welche in dem Menu erscheinen sollen.



    Auch gibts da ne wunderbare Doku dazu, leider funktioniert das bei mir alles gar nicht, d.h. Es
    sind in dem Menu keine Einträge sichtbar. Ich möchte aber kein dictonary, sondern ne einfache Liste reicht aus.
    http://collective-docs.readthedocs.org/en/latest/forms/vocabularies.html

    Weiter kann ich mit dem Schema.Extender zwar Felder erzeugen, aber irgendwie immer nur zusätzlich anhängen. Es muss ja dann
    doch irgend n Script geben, in welcher die Infos für das Zusammenstellen des Formulars sind. Ich wäre zwar schon mal froh, wenn es zusätzlich funktioniert,
    aber schlussendlich will ich ja das Description Feld ersetzen.

    Danke für eure Hilfe
    Müllerchen

    "Man kann die Realität ignorieren, aber man kann nicht die Konsequenzen der ignorierten Realität ignorieren"
    - Ayn Rand, 1905-1982 -

  • Hallo,

    da es heute schon spät ist keine lange Antwort.

    das mit dem vocabulary ist ein Übertragungsfehler bei dir, das Vocabulary muss im Field nicht im widget definiert sein.

    Das mit dem SchemaExtender und einem Feld zu überschreiben geht nicht so ohne weiteres, der Trick ist entweder das ursprüngliche Feld zu holen und zu überschreiben, dazu muss du dir das Schema der zu veränderenden Klasse nehmen und dann das Feld manipulieren.

    Einfacher:

    IATDocument.schema()['description'].widget.visible = {"edit": "invisible", "view": "invisible"}
    und dein neues Feld an die Stelle schieben.

    schema.moveField('newfield', before = 'description')
    Ich hoffe es hilft weiter, nur nicht verzagen, irgendwann wird es was.

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller