Globale Definitionen
Viele globale Definitionen aus global_defines.pt werden nicht mehr vollständig im main_template.pt eingebunden, da dies die Performance deutlich beeinträchtigt. Einige globale Variablen wie z.B. context, view und template bleiben jedoch erhalten. Nicht erhalten geblieben sind jedoch die Definitionen aus der _initializeData-Klasse im @@plone-View von Plone3: Products/CMFPlone/browser/ploneview.py
Es empfiehlt sich daher, alle Seiten Ihres Produkts sich in einer Plone4-Site anzuschauen und dann ggf. die globalen Definitionen selbst einzubinden, also z.B.:
tal:attributes="action string:$here_url/${template/getId}"
ersetzen durch:
tal:attributes="action string:${context/@@plone_context_state/object_url}/${template/getId}"
- Achtung: Sie erhalten keine Fehlermeldung, wenn Sie globale Definitionen in der Überprüfung von exists verwenden z.B.::
- tal:condition="python:exists('portal/mystyle.css')"
Diese Bedingung führt zu keinem Fehler, sondern die Überprüfung schlägt auch fehl, wenn portal nicht definiert ist. Daher sollten Sie alle Templates nach exists durchsuchen und überprüfen, ob die verwendeten globalen Definitionen auch tatsächlich vorhanden sind.
Wegfall des Action Icons Tool
Produkte, die Icons für CMF-Aktionen am Action Icons Tool regsitrierten, sollten zukünftig die icon_expr-Anweisung verwenden um Icons am 'Actions Tool* oder im Control Panel Tool zu registrieren. So wird beispielsweise in Plone4 das Icon für Document in Products/CMFPlone/profiles/default/types/Document.xml so angegeben:
<property name="icon_expr">string:${portal_url}/document_icon.png</property>
Wegfall der Zope2-Interfaces
Zope2 vor Version 2.12.0 unterstützte zwei verschiedene Arten von Interfaces, die Zope2- und die Zope3-Implementierung:
Zope2:
from Interface import Interface class MyInterface(Interface): pass class MyClass(object): __implements__ = (MyInterface,)
Zope3:
from zope.interface import Interface class MyInterface(Interface): pass class MyClass(object): implements(MyInterface)
In Zope2.12 werden Zope3-Interfaces unterstützt.
Bei einer Zope2-Implementierung von Intervace wird dann folgender Fehler ausgegeben:
ImportError: No module named Interface
Imports
Diverse import-Methoden sind verschoben worden. Früher bereits als deprecated gekennzeichnete Methoden wurden entfernt.
Folgende Methoden wurden verschoben:
alt | neu |
---|---|
Products.ATContentTypes.content.folder.ATFolder | plone.app.folder.folder.ATFolder |
Products.ATContentTypes.content.folder.ATFolderSchema | plone.app.folder.folder.ATFolderSchema |
Products.CMFPlone.browser.navtree.SitemapNavtreeStrategy.icon | Products.CMFPlone.browser.navtree.SitemapNavtreeStrategy.item_icon |
Products.CMFPlone.browser.plone | Products.CMFPlone.browser.ploneview |
Products.CMFPlone.browser.ploneview.cache_decorator | plone.memoize.instance.memoize |
Products.CMFPlone.browser.ploneview.IndexIterator | Products.CMFPlone.utils.IndexIterator |
Products.CMFPlone.browser.ploneview.Plone.isRightToLeft | @@plone_portal_state/is_rtl |
Products.CMFPlone.browser.ploneview.Plone.keyFilteredActions | @@plone_context_state/keyed_actions |
Products.CMFPlone.browser.portlets | plone.app.portlets.portlets |
Products.CMFPlone.interfaces.OrderedContainer.IOrderedContainer | OFS.interfaces.IOrderedContainer |
Products.CMFPlone.utils.BrowserView | Products.Five.BrowserView |
Products.CMFPlone.utils.getGlobalTranslationService | Products.PageTemplates.GlobalTranslationService.getGlobalTranslationService |
Products.CMFPlone.utils.scale_image | Products.PlonePAS.utils.scale_image |
Products.CMFPlone.utils.utranslate | zope.i18n.translate |
Products.PageTemplates.GlobalTranslationService.getGlobalTranslationService | zope.i18n |
Products.CMFPlone.utils.ulocalized_time | Products.CMFPlone.i18nl10n.ulocalized_time |
zope.app.cache.interfaces.ram.IRAMCache | zope.ramcache.interfaces.ram.IRAMCache |
Products.ATReferenceBrowserWidget.ATReferenceBrowserWidget.ReferenceBrowserWidget | archetypes.referencebrowserwidget.ReferenceBrowserWidget |
Nicht mehr vorhandene Methoden
Products.CMFPlone.CatalogTool.registerIndexableAttribute
Stattdessen sollte plone.indexer verwendet werden.
Products.CMFPlone.PloneTool.setDefaultSkin
Products.CMFPlone.PloneTool.setCurrentSkin
Products.CMFPlone.PortalContent
Favorite-Artikeltyp
use_folder_tabs aus den site_properties
keyed_actions
Sollte durch die actions-Methode aus @@plone_context_state ersetzt werden, die nun als einzigen Parameter eine action category benötigt.
Validatoren
Auch Validatoren benötigen nun Zope3-Interfaces da ansonsten beim Starten der Instanz folgender Fehler ausgegeben wird:
Products.validation.exceptions.FalseValidatorError: <vs.registration.validators.ProjectIdValidator instance at 0xa92082c>
Die Zeile:
__implements__= (IValidator,)
sollte ersetzt werden durch:
from zope.interface import implements … try: # Plone 4 and higher import plone.app.upgrade USE_BBB_VALIDATORS = False except ImportError: # BBB Plone 3 USE_BBB_VALIDATORS = True … if USE_BBB_VALIDATORS: __implements__ = (ivalidator,) else: implements(IValidator)
Aufruf der translate-Methode
Folgende Module stehen nicht mehr zur Verfügung:
Products.CMFPlone.utils.utranslate Products.PageTemplates.GlobalTranslationService.getGlobalTranslationService
Stattdessen sollte zope.i18n.translate verwendet werden.
Und mit zope.i18n.translate ändert sich dann auch der Aufruf gegenüber utranslate:
- msgid ist nun das erste und nicht mehr erst das zweite Argument dieses Aufrufs.
- domain ist nun optional.
Add view für Artikeltypen
In Plone 4 kann jeder Artikeltyp im Portal Types Tool eine zusätzliche Eigenschaft für die Ansicht beim Hinzufügen haben. Diese Eigenschaft wird als TALES-Ausdruck für eine URL angegeben werden. Ein Link mit dieser URL wird Nutzern dann im Hinzufügen-Menü von Plone angezeigt.
Diese Eigenschaft hat den Titel Add view URL (expression) und die interne ID add_view_expr
This property has the title Add view URL (expression) and the internal id add_view_expr.
Auf diese Weise lässt sich z.B. für ein selbst-entwickeltes Hinzufügen-Formular folgender Ausdruck angeben:
string:${folder_url}/@@add-my-content
Beachten Sie hierbei, dass der View für den folder-Artikeltyp registriert wird und nicht für den zu erstellenden Artikeltyp.
send statt secureSend
Mit der send-Methode ändern sich auch weitere Angaben:
Message Type
Nun wird der vollständige MIME type als msg_type angegeben und nicht mehr nur der subtype-Parameter, also z.B.:
msg_type='text/plain'
statt:
subtype='plain'
Eigene Headers-Angaben
Um eigene Headers-Angaben für eine Nachricht anzugeben, kann z.B. folgendes angegeben werden:
from email import message_from_string from email.Header import Header my_message = message_from_string(message_body.encode('utf-8')) my_message.set_charset('utf-8') my_message['CC']= Header('someone@example.com') my_message['BCC']= Header('secret@example.com') my_message['X-Custom'] = Header(u'Some Custom Parameter', 'utf-8') mailhost.send(my_message, mto, mfrom, subject)
Geänderte Syntax des Portlets-Profil
In Plone 3 wird ein Portlet an einen bestimmten Portlet-Manager gebunden mit der Anweisung:
for="plone.app.portlets.interfaces.IColumn"
In Plone 4 erfolgt dies nun mit:
<for interface="plone.app.portlets.interfaces.IColumn" />
Somit lassen sich auch mehrere Werte im for-Feld angeben:
<for interface="plone.app.portlets.interfaces.IColumn" /> <for interface="plone.app.portlets.interfaces.IDashboard" />