The z3c.jbot
(or "Just a bunch of templates") package allows easy
customization of existing templates and images. It works on Zope 2 and
Zope 3.
The Chameleon rendering engine is supported.
Use of this package adds a small (2-3 ms per request on Plone) to the total application response time.
To override a particular file, first determine its canonical filename. It's defined as the path relative to the package within which the file is located; directory separators are replaced with dots.
Example:
Suppose you want to override: /plone/app/layout/viewlets/logo.pt
You would use the filename: plone.app.layout.viewlets.logo.pt
Simply drop the file in a directory and register that directory for use with jbot using a ZCML-directive:
<include package="z3c.jbot" file="meta.zcml" /> <browser:jbot directory="<path>" layer="<layer>" />
Any template that is defined as a class-attribute can be overriden using jbot, e.g. those used in views, viewlets and portlets. The template overrides may be registered for any request layer or only a specific layer.
Any skin-object (e.g. images, templates) on the file system (directory views) can be overridden.
If plone.resource is installed, it's possible to use jbot to override filesystem resources.
Imagine this situation:
- You have a
base
package with a page templateoriginal.pt
. - Someone else overrides this in a project specific package by creating a file
base.original.pt
. - Now for some reason you rename the template to
new.pt
. - The template override in the project no longer works and the other person starts asking questions or complaining.
To solve this problem, you can register that a template path is deprecated.
First add a dictionary to the base
package, let's say in a file utils.py
:
deprecated_templates = { "base.original.pt": "base.new.pt", }
In your configure.zcml
you add:
<configure xmlns="http://namespaces.zope.org/zope" xmlns:zcml="http://namespaces.zope.org/zcml" > ... <configure zcml:condition="have jbot-deprecations"> <include package="z3c.jbot" file="meta.zcml" /> <browser:jbotDeprecated dictionary=".utils.deprecated_templates" /> </configure> </configure>
The result is:
- The old override
base.original.pt
works for the new location as well. - The user gets a warning that they should use
base.new.pt
instead.
Malthe Borch <[email protected]>