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]:
Enter empty_styles
Wenn die Skin-Anpassungen sehr umfangreich sind oder es sich um eine performance-kritische Anwendung handelt empfehle ich, den Skin vollständig neu aufzusetzen und Enter empty_styles mit True anzugeben.
Enter skinbase

In Plone 4 kann hier zwischen folgenden beiden Skins gewählt werden:

Sunburst Theme

Ein neuer Skin aus dem plonetheme.sunburst-Egg.

Sunburst ist der Standard-Skin für neu erstellte Plone-4-Sites.

Plone Classic Theme
Der aus Plone 3 bekannte Plone Default-Skin. Er ist nun im plonetheme.classic-Egg zu finden.
Plone Default
Der Plone Default-Skin ist in Plone 4 nur noch ein minimalistischer Skin, der ideal geeignet ist für die nachgelagerte Gestaltung einer Plone-Site mit XDV oder Deliverance.

In Plone 3 besteht üblicherweise die Wahl zwischen zwei Skins:

Plone Default
Der Standard-Skin.
NuPlone
Ein modernerer Skin für Plone 3.

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 start, sollte auch vs.theme in Zope Management Interface → Control_Panel → Products erscheinen.

Note

Beim Aufruf von ./bin/instance restart würde der sys.path nicht erneut eingelesen werden und ggf. stünde dann vs.theme nicht der Instanz zur Verfügung.

Plone 3.3

Ab Plone 3.3 können Sie stattdessen auch z3c.autoinclude verwenden. Dieses Paket erstellt automatisch zwei neue ZCML-Anweisungen: includeDependencies und includePlugins. Wir verwenden nun includePlugins in unserem Theme- Produkt um automatisch einen zcml-Slug generieren zu lassen. Hierzu tragen wir in der Datei vs.theme/vs/theme/setup.py folgendes ein, sofern dies nicht bereits durch das plone3_theme-Template geschehen ist:

setup(name='vs.theme',
    …
    entry_points="""
    # -*- entry_points -*-
    [z3c.autoinclude.plugin]
    target = plone
    """,
    …
    )

Installieren 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.