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:

<browser:resource
    name="dbsettings_icon.gif"
    image="dbsettings_icon.gif"
    />

<browser:page
    name="reservations-database-controlpanel"
    for="Products.CMFPlone.interfaces.IPloneSiteRoot"
    class=".dbsettings.ReservationsDatabaseControlPanel"
    permission="cmf.ManagePortal"
    />

<adapter
    for="Products.CMFPlone.interfaces.IPloneSiteRoot"
    provides="vs.registration.interfaces.IDatabaseSettings"
    factory=".dbsettings.reservations_database_settings"
    />

Damit das Konfigurationsformular auf der Plone-Konfigurationsseite angezeigt wird, wird die Datei vs.registration/vs/registration/profiles/default/controlpanel.xml mit folgendem Inhalt erstellt:

<?xml version="1.0"?>
<object name="portal_controlpanel" meta_type="Plone Control Panel Tool">
    <configlet title="Reservations Database" action_id="ReservationsDatabase"
               appId="ReservationsDatabase" category="Products" condition_expr=""
               url_expr="string:${portal_url}/@@reservations-database-controlpanel"
               visible="True">
        <permission>Manage portal</permission>
    </configlet>
</object>

Nun wird noch das Icon in vs.registration/vs/registration/profiles/default/actionicons.xml registriert:

<?xml version="1.0"?>
<action-icons>
    <action-icon category="controlpanel"
                 action_id="ReservationsDatabase"
                 title="Reservations Database"
                 priority="0" icon_expr="++resource++dbsettings_icon.gif"/>
</action-icons>

Beachten Sie bitte, dass das action_id-Attribut in beiden Profilen gleich ist. Und so sieht das Plone-Konfigurationsformular aus:

reservations-database-controlpanel