Enterprise Content Management System
✔ Enterprise-quality Content Management System
✔ Usability Layer eines Entwicklungsframeworks
A significant strength of Plone is its flexibility.
-- Kim Nguyen, Senior System Analyst at University of Wisconsin OshkoshPlone beruht auf der Zope3 Component Architecture
Zope Configuration Mark-up Language
<configure xmlns="http://namespaces.zope.org/zope" xmlns:browser="http://namespaces.zope.org/browser" i18n_domain="my.package"> <configure package="plone.app.content.browser"> <browser:page for="Products.CMFCore.interfaces._content.IFolderish" class="my.package.browser.foldercontents.MyFolderContentsView" name="folder_contents" template="folder_contents.pt" layer="my.package.interfaces.IMyPackageLayer" permission="cmf.ListFolderContents" /> </configure> </configure>
from zope.interface import implements from zope.interface import Interface class IPony(Interface). pass class SweetSurprise(ContentItem): implements(IPony, ICookie) ... if ICookie.providedBy(object): # do stuff
@implementer(ILeadImage) @adapter(IDexterityContent) class LeadImage(object): def __init__(self, context): self.context = context
<adapter for=".shop.MyShoppableItemType" provides=".interfaces.IProductImageProvider" factory=".images.FolderishProductImageProvider" />
class AssetAssignmentTool(object): """ Factory providing CRUD oparations for project assets """ @memoize def read(self, uuid, key=None): data = api.find(...) return data
tool = getUtility(IAssetAssignmentTool) data = tool.read()
<!-- Tool providing utility functions for asset storage manipulation --> <utility factory=".tool.AssetAssignmentTool" provides=".interfaces.IAssetAssignmentTool"/>
Generic Setup steps
<genericsetup:registerProfile name="default" title="Plone Go Mobile" directory="profiles/default" description='Mobile CMS add-on' provides="Products.GenericSetup.interfaces.EXTENSION"/>
<genericsetup:upgradeStep title="Remove LDAP PAS Plugin" description="Execute this upgrade after the plonesite upgrade" handler=".v4.upgrade_pas" />
<subscriber for="Products.PlonePAS.events.UserLoggedOutEvent" handler=".mymodule.clear_extra_cookies_on_logout" />
def clear_extra_cookies_on_logout(event): # What event contains depends on the # triggerer of the event and event class request = event.object.REQUEST ...
Subsystem zur Erstellung von Content Objekten
✔ verfügbar seit Plone 4.1
We write XSLT so you do not have to...
-- The Beards of Plone✔ verfügbar seit Plone 4.0
<rules xmlns="http://namespaces.plone.org/diazo" xmlns:css="http://namespaces.plone.org/diazo/css" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <theme href="theme.html" /> <merge attributes="class" css:content="body" css:theme="body" /> <replace css:theme="title" css:content="title" /> <replace css:content-children="#content" css:theme-children="#content" /> <replace css:content="#sidebar" css:theme="#below-content-teaser" /> <drop css:theme="#theme-banner-slot" css:if-not-content="#backend-masthead" />
<!-- Required marker --> <replace css:content="span.required"> <xsl:copy> <xsl:copy-of select="@*" /> <xsl:attribute name="class"> <xsl:value-of select="./@class" /> text-warning </xsl:attribute> <xsl:apply-templates /> </xsl:copy> </replace>
Drag&Drop Reordering and Inline Content Editing
✔ verfügbar seit Plone 5.0a1 als Mosaic
Agenda 2020
Fragen?
Christoph @ Team23 GmbH & Co. KGwww.team23.de