How to get a different look for some pages of a plone-site
It's pretty easy to attach a special look to whole sections. Styling only some pages is a different story.
I'm currently working on a site where the customer wanted some pages to look differently than others.
(I should really not do the "Hey you could also do this and that" when my time is limited!)
The pages should have a additional css and a line of text above the heading. I wanted it to look like this:
Here "what if foo..." is the Name of the folder that contains the document "...hits the bar?", being the h1.
Since the old trick with body.section-foo only works for whole sections and I needed the additional text (what if foo...) anyway I decided to go with the beloved marker interfaces.
Here is how it works:
1. Add a marker interface
In your theme-product edit your browser/interfaces.py and add:
class IMySpecialStyle(Interface): """Marker Interface for Documents with a special style """
2. Register a viewlet pinned to the Interface
In your browser/configure.zcml add:
<browser:viewlet name="myspecialstyle.viewlet " manager="plone.app.layout.viewlets.interfaces.IAboveContentTitle" template="templates/myspecialstyle_viewlet.pt" layer=".interfaces.IThemeSpecific" for=".interfaces.IMySpecialStyle" permission="zope2.View" /> <browser:resource name="myspecialstyle.css" file="resources/myspecialstyle.css" />
The line for=".interfaces.MySpecialStyle" activates the viewlet only for content which have the marker-interface. The viewlet-manager IAboveContentTitle inserts the viewlet just before the h1-tag of the targeted document.
3. Add content and styles
Now add a file browser/templates/myspecialstyle_viewlet.pt containing:
<link href="myspecialstyle.css" rel="stylesheet" type="text/css" tal:attributes="href string:${context/portal_url}/++resource++myspecialstyle.css"/> <div id="myspecialstyle-viewlet"> <h2 class="myspecialstyle-header" tal:content="python: context.getParentNode().title"> what if foo ... </h2> </div>
Instead of "getParentNode.title" I could also enter the expected line of text by hand. But like this I can reuse it for other folders.
Keep in mind that for default-pages you might want the 'grandparent‘, so you could use this
tal:define="is_default_page context/@@plone_context_state/is_default_page"
to check if it's a default page, and
tal:condition="is_default_page" tal:content="python context.getParentNode().getParentNode().title"
to get the grandparents title.
Now create browser/resources/myspecialstyle.css and add:
#myspecialstyle-viewlet { position: absolute; } .myspecialstyle-header { bottom:1.45em; font-family: "Arial Black"; font-size: 500%; font-weight: bold; left:-22px; color: #e1e1e1 !important; position:relative; z-index: 0; } h1.documentFirstHeading { z-index: 1; position: relative; padding-top: 10px; }
4. Use it
Restart Zope. In ZMI go to the page in question (or rather add /manage_interfaces to it's url), select IMySpecialStyle from the available Marker Interfaces and add it.
If you remove everything from the viewlet except for the <link ...>-stuff you get a really simple way to style some selected pages.