Montag, 10. September 2007

Web-Formulare mit Zope 3

Wir bei gocept bereiten uns gerade auf einen Sprint vor. In diesem Sprint wollen wir die Probleme und Erfahrungen der letzten Projekte aufarbeiten, die sich um Web-Formulare drehen.

zope.formlib ist momentan das Standardpaket mit dem wir arbeiten und bietet eine prinzipiell solide Grundlage. Vor einer Weile ist z3c.form erschienen, was einige Probleme der formlib zu beseitigen scheint. In der Vorbereitung zum Sprint evaluieren wir z3c.form als Grundlage unserer weiteren Bemühungen; wir wolle auf jeden Fall ein existierendes Projekt weiterentwickeln und nicht noch eine Baustelle aufreißen. Neben Code werden wir als Ergebnis auch die Dokumentation gängiger Patterns anstreben.

Hier eine Liste der Probleme die uns momentan umtreiben:
  1. Interface-Invariants validieren nur gegen Felder, die der Benutzer gerade bearbeitet hat
    Der Kontext und Werte von Feldern die im Formular nicht enthalten waren stehen nicht zur Verfügung.

  2. Werte nach der Validierung aber vorm Schreiben auf Attribute zu verarbeiten ist nicht möglich (z.B. um Passwörter zu codieren)
    • Im gleichen Zusammenhang: Validatoren scheinen etwas merkwürdig zu sein da sie die Daten modifizieren können (sollen).
    • Properties können helfen, sind aber schwierig
    • Evt. müsste man Feldern einen Mutator mitgeben
    • Noch eine Option: getrennte Interfaces mit Adapter bereitstellen um solche Werte ins Schema einfliessen zu lassen und auf dem Adapter eine Property definieren

  3. Constraint-Validierungen haben ein komisches Interface
    • True oder Exception
    • Fehlermeldung steht auf der Exception
    • Einige Constraints melden nur "Value too long" ohne dem Benutzer ausreichend Information zu geben
      • Problem liegt in zope.app.form.interfaces.IWidgetInputError und der Implementierung in der zugehörigen Klasse.
      • Diese Implementierung hält nicht was sie verspricht und das Interface widerspricht der Benutzung in den Tests bzw. im View.
      • Aufgabe: WidgetInputError sauber machen, so dass über die doc()-Methode eine i18n-MessageID zurückgeliefert wird.

  4. Layout-Engine
    • Eine getrennte Komponente um Formulare im Stil unseres Produktes "Jucon" zu layouten/generieren

  5. Widget-Definitionen
    • Interfaces der Widgets aus zope.app.form sind nur intern und via Subclassing gemacht
    • Wie verhält sich z3c.form in dieser Hinsicht?
    • Anscheinend sind alle Widgets neu definiert.

  6. Formulare mit ergänzenden Inhalten sind unsauber/unflexibel
    • Z.B. beim Einbinden von Suchergebnissen
    • Hier können Content-Provider oder Viewlets helfen.
    • Viewlets sind aber aufwändig zu deklarieren.

  7. Abhängig definierte Felder
    • Das typische Master-Slave-Szenario: Wert in Feld A auswählen so dass Feld B mit davon abhängigen Optionen gefüllt wird, natürlich via JavaScript
    • z3c.form und z3c.formjs scheint dafür noch keine fertige Lösung zu haben