====================== Konfigurationsformular ====================== Um die Datenbankeinstellungen konfigurierbar zu machen, erstellen wir eine spezielle Website-Konfigurationsseite. Wir werden hierzu ``zope.formlib`` und folgendes Interface verwenden:: class IDatabaseSettings(Interface): """Database connection settings. """ drivername = schema.ASCIILine(title=_(u"Driver name"), description=_(u"The database driver name"), default='mysql', required=True) hostname = schema.ASCIILine(title=_(u"Host name"), description=_(u"The database host name"), default='localhost', required=True) port = schema.Int(title=_(u"Port number"), description=_(u"The database port number. Leave blank to use the default."), required=False) username = schema.ASCIILine(title=_(u"User name"), description=_(u"The database user name"), required=True) password = schema.Password(title=_(u"Password"), description=_(u"The database password"), required=False) database = schema.ASCIILine(title=_(u"Database name"), description=_(u"The name of the database on this server"), required=True) Für das Formular selbst nutzen wir dann die Infrastruktur von ``plone.app.controlpanel`` in ``vs.registration/vs/registration/browser/dbsettings.py`` verwendet:: from zope.component import getUtility from zope.formlib import form from plone.app.controlpanel.form import ControlPanelForm from collective.lead.interfaces import IDatabase from vs.registration.interfaces import IDatabaseSettings from vs.registration import RegistrationMessageFactory as _ def reservations_database_settings(context): return getUtility(IDatabaseSettings) class ReservationsDatabaseControlPanel(ControlPanelForm): form_fields = form.FormFields(IDatabaseSettings) form_name = _(u"Reservations Database settings") label = _(u"Reservations Database settings") description = _(u"Please enter the appropriate connection settings for the database") def _on_save(self, data): db = getUtility(IDatabase, name='vs.reservations') db.invalidate() ``reservations_database_settings`` Der Adapter bindet die Werte aus dem Konfigurationsformular an ``context``, also an Plone Site Root. ``ReservationsDatabaseControlPanel`` Die Klasse definiert den View für das Formular, das ``zope.formlib`` aus dem ``IDatabaseSettings``-Interface generiert. ``_on_save`` Funktion, die von der Basisklasse aufgerufen wird sobald auf *Speichern* geklickt wird. Dabei leert die ``invalidate``-Methode alle internen Caches, sodass die neuen Einstellungen wirksam werden. Anschließend werden in ``vs.registration/vs/registration/browser/configure.zcml`` Icon, View und Adapter registriert:: Damit das Konfigurationsformular auf der Plone-Konfigurationsseite angezeigt wird, wird die Datei ``vs.registration/vs/registration/profiles/default/controlpanel.xml`` mit folgendem Inhalt erstellt:: Manage portal Nun wird noch das Icon in ``vs.registration/vs/registration/profiles/default/actionicons.xml`` registriert:: Beachten Sie bitte, dass das ``action_id``-Attribut in beiden Profilen gleich ist. Und so sieht das Plone-Konfigurationsformular aus: .. figure:: reservations-database-controlpanel.png :alt: reservations-database-controlpanel