Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Overriding another product's view template in Plone

Tags:

plone

I am using Plone 4.1.2 and I am trying to override a view template provided by collective.contenleadimage. It is easy to edit the provided template via portal_view_customization but I want to try doing it from my policy product in the filesystem.

I would like to replace the folder_leadimage_view of c.contentleadimage.

This is what I have done in my policy product.

in interfaces.py

from zope.interface import Interface

class IExamplePolicy(Interface):
    """Marker interface that defines a Zope 3 browser layer.
    """

in profiles/default/browserlayer.xml

<?xml version="1.0"?>
<layers>
    <layer name="example.policy" 
           interface="example.policy.interfaces.IExamplePolicy" />
</layers>

in browser/configure.zcml

<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
xmlns:i18n="http://namespaces.zope.org/i18n"
xmlns:zcml="http://namespaces.zope.org/zcml"
i18n_domain="example.policy">


<browser:page
     for="Products.Archetypes.interfaces.IBaseFolder"
     name="folder_leadimage_view"
     class="collective.contentleadimage.browser.folder_leadimage_view.FolderLeadImageView"
     template="folder_leadimage_view.pt"
     layer="..interfaces.IExamplePolicy"
     permission="zope2.View"
     allowed_attributes="tag"
/>

<browser:page
     for="Products.CMFPlone.interfaces.IPloneSiteRoot"
     name="folder_leadimage_view"
     class="collective.contentleadimage.browser.folder_leadimage_view.FolderLeadImageView"
     template="folder_leadimage_view.pt"
     layer="..interfaces.IExamplePolicy"
     permission="zope2.View"
 />

My policy product installs fine and I can see in portal_view_customization

Products.Archetypes.interfaces.base.IBaseFolder
    folder_leadimage_view (example.policy.interfaces.IExamplePolicy)
    folder_leadimage_view (collective.contentleadimage.interfaces.ILeadImageSpecific)

However, my new template is not the one rendered by Plone.

I would appreciate the assistance.

like image 247
h2o Avatar asked Feb 18 '12 01:02

h2o


1 Answers

Change your interfaces.py to:

from collective.contentleadimage.interfaces import ILeadImageSpecific

class IExamplePolicy(ILeadImageSpecific):
    """Marker interface that overrides collective.contentleadimage's
    browser layer.
    """

Browser layers are markers applied to the request. Both your IExamplePolicy and collective.contentleadimage's ILeadImageSpecific browser layers are applied, but by inheriting from ILeadImageSpecific for your browser layer you make your overridden folder_leadimage_view view more specific than collective.contentleadimage's own.

For more information on Zope Component Architecture interface resolution order see the "Customisation with more-specific adapters" section in the Dexterity manual.

like image 129
Dan Jacka Avatar answered Nov 11 '22 22:11

Dan Jacka