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