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: