This section of Plone content management system Developer Documentation is no longer under active maintance. The section is included as the reference for older technologies (Plone 2.x, Plone 3.x). Some of the practices described in this documents may still work, but are not recommended to be used in your active Plone development. Use at your own risk.
If you arrived at this page by a web search we recommend to also see the Plone Developer Documentation front page .
How to programmatically change the active view of a Plone content item
Dynamic views are views which the content editor can choose for his or her content from the Display... drop-down menu in the green edit frame.
By default, Plone comes with dynamic views for:
The default view can be also a content item picked from the folder. Available content item types can be managed from the ZMI at portal_properties -> site_properties -> default_page_types.
A user needs the Modify view template permission to use the dynamic view dropdown. If you want to restrict this ability, grant or revoke this permission as appropriate.
This can be useful for some content-types like Dexterity ones, where dynamic views are enabled by default, and the easiest way to disable them is using this permission.
Plone supports a few dynamic views for folders out of the box:
These are defined in portal_types information for the Folder content type and mapped to the Display menu all over in ZCML using browser:menuItem as described below.
Newly created folders have this dynamic view applied:
Here are instructions how to create your own dynamic view.
There is also an example product Listless view, which provides "no content listing" view for Folder content types.
If you manage to:
... you cannot access the folder anymore, because you are taken to the broken view stack trace instead instead of rendering the green edit menubar.
The fix is to reset the view by browsing to the select_default_view directly. Access your folder like this:
Products.CMFDynamicViewFTI.browserdefault.BrowserDefaultMixin.getAvailableLayouts() returns the list of known layouts in the following format:
[('folder_summary_view', 'Summary view'), ('folder_tabular_view', 'Tabular view'), ('atct_album_view', 'Thumbnail view'), ('folder_listing', 'Standard view'), ('product_listing', u'Product listing')]
So to see if your view is available, check it against the ids from that result:
layout_ids = [id for id, title in self.portal.folder.getAvailableLayouts() ] self.assertTrue("product_list" in layout_ids)
The default page is a content item chosen to be displayed when the visitor arrives at a URL without any subpages or views selected.
This is useful if you are doing the folder listing manually and you want to replace the default view.
The default_page helper view can be used to manipulate default pages.
Getting the default page:
# Filter out default content container = self.getListingContainer() default_page_helper = getMultiAdapter( (container, self.request), name='default_page') # Return content object which is the default page or None if not set default_page = default_page_helper.getDefaultPage(container)
Another example how to use this:
from Products.CMFCore.interfaces import IFolderish def hasTabs(self): """Determine whether the page itself, or default page, in the case of folders, has setting showTabs set true. Show tab setting defined in dynamicpage.py. """ page = self.context try: if IFolderish.providedBy(self.context): folder = self.context default_page_helper = getMultiAdapter( (folder, self.request), name='default_page') page_name = default_page_helper.getDefaultPage(folder) page = folder[page_name] except: pass tabs = getattr(page, "showTabs", False) return tabs
Setting the default page can be done as simply as setting a default_page attribute on the folder to the id of the default page:
folder.default_page = "my_content_id"
More information can be found in
Add to your content type class:
def canSetDefaultPage(self): """ Override BrowserDefaultMixin because default page stuff doesn't make sense for topics. """ return False
If you need to have a view for few individual content items only, it is best to do this using marker interfaces.
For more info, see
Below is a script snippet which allows you to change the default view for all folders to another type. You can execute the script through the ZMI as a Python Script.
from StringIO import StringIO orignal = 'fancy_zoom_view' target = 'atct_album_view' for brain in context.portal_catalog(portal_type="Folder"): obj = brain.getObject() if getattr(obj, "layout", None) == orignal: print "Updated:" + obj.absolute_url() obj.setLayout(target) return printed
This will allow you to migrate from collective.fancyzoom to Plone 4's default album view or Products.PipBox.
Method aliases allow you to redirect basic actions (view, edit) to content-type specific views. Aliases are configured in portal_types.
The source code of this file is hosted on GitHub. Everyone can update and fix errors in this document with few clicks - no downloads needed.
For basic information about updating this manual and Sphinx format please see Writing and updating the manual guide.