Plone3-Theme-Package
Erstellen des Eggs
$ cd src $ paster create -t plone3_theme Enter namespace_package (Namespace package (like plonetheme)) ['plonetheme']: vs Enter package (The package contained namespace package (like example)) ['example']: theme Enter skinname (The skin selection to be added to 'portal_skins' (like 'My Theme')) ['']: vs.theme Enter skinbase (Name of the skin selection from which the new one will be copied) ['Plone Default']: Enter empty_styles (Override default public stylesheets with empty ones?) [True]: False Enter include_doc (Include in-line documentation in generated code?) [False]: Enter zope2product (Are you creating a Zope 2 Product?) [True]: ... Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]:
Anmerkung: Nur wenn die Skin-Anpassungen sehr umfangreich sind oder es sich um eine performance-kritische Anwendung handelt kann es sich empfehlen, den Skin vollständig neu aufzusetzen und empty_styles mit True anzugeben.
Verzeichnisübersicht des vs.theme-Produkts
Der Dateibaum befindet sich in src/vs.theme/vs/theme/. Darin:
- configure.zcml
- schließt zwei weitere Konfigurationsdateien ein: profiles.zcml und skins.zcml.
- profiles.zcml
- registriert das Generic-Setup-Profil und weitere Importschritte mit dem Handler vs.theme.setuphandlers.setupVarious.
- skins.zcml
registriert die folgenden Verzeichnisse im Skins Tool:
- vs_theme_custom_images
- vs_theme_custom_templates
- vs_theme_styles
- skins/
- hier liegen die Verzeichnisse, die als Layer in vs.theme eingebunden werden.
- profiles/default
- Profile für die css- und javascript-Registries, skins und viewlets sowie weiterer Importschritte.
- setuphandlers.py
- enthält zunächst mit setupVarious nur eine Dummy-Methode, die jedoch bei Bedarf genutzt werden kann.
- browser/
enthält die Zope3 browser views
- interfaces.py
- definiert mit IThemeSpecific ein Marker-Interface.
- stylesheets/
- kann CSS-Dateien für die Browser Views enthalten.
- images/
- ist in configure.zcml als resourceDirectory registriert.
Ändern der buildout.cfg-Datei
[buildout]
...
eggs =
elementtree
vs.policy
vs.theme
develop =
src/vs.policy
src/vs.theme
...
[instance]
zcml =
vs.policy
Anschließend wird das Buildout-Projekt neu erstellt mit:
./bin/buildout -No
Registrieren von vs.theme
Statt eines weiteren zcml-slugs für vs.theme werden wir vs.policy so ändern, dass es vs.theme mitregistriert. Hierzu wird in src/vs.policy/vs/policy/configure.zcml folgende Zeile eingefügt:
<include package="vs.theme" />
Starten wir nun die Zope-Instanz erneut mit ./bin/instance restart, sollte auch vs.theme in Zope Management Interface → Control_Panel → Products erscheinen.
Installation von vs.theme
Plone 3.0
Damit vs.theme auch beim Installieren von vs.policy in einer Plone-Site mitinstalliert wird, wird in src/vs.policy/vs/policy/setuphandlers.py folgendermaßen geändert:
from Products.CMFCore.utils import getToolByName
PRODUCT_DEPENDENCIES = ('vs.theme',)
class Generator:
def installProducts(self, portal):
qi = getToolByName(portal, 'portal_quickinstaller')
for product in PRODUCT_DEPENDENCIES:
if qi.isProductInstalled(product):
qi.reinstallProducts([product])
else:
qi.installProduct(product, locked=0)
…
def setupVarious(context):
…
gen.installProducts(site)
Durch die Variable PRODUCT_DEPENDENCIES ist das Skript flexibel genug, um gegebenenfalls auch noch weitere Produkte mit vs.policy installieren zu können.
Plone 3.1
Ab Plone 3.1 können Abhängigkeiten in src/vs.policy/vs/policy/profiles/default/metadata.xml angegeben werden:
<?xml version="1.0"?>
<metadata>
<version>1.0</version>
<dependencies>
<dependency>profile-vs.theme:default</dependency>
</dependencies>
</metadata>
Test für das vs.policy-Produkt
Zunächst wird die Datei src/vs.policy/vs/policy/tests/base.py nach ztc.installPackage('vs.policy') um folgende Zeile ergänzt:
ztc.installPackage('vs.theme')
Damit wird das Paket vs.theme in der Zope-Instanz installiert.
Anschließend wird in src/vs.policy/vs/policy/tests/test_setup.py in der Klasse TestSetup folgender Test hinzugefügt:
def test_theme_installed(self):
skins = getToolByName(self.portal, 'portal_skins')
layer = skins.getSkinPath('vs.theme')
self.failUnless('vs_theme_custom_templates' in layer)
self.assertEquals('vs.theme', skins.getDefaultSkin())
Hiermit wird getestet,ob vs_theme_custom_templates als Layer im Plone Skins Tool verfügbar ist und vs.theme der Standard-Skin ist.

