===================================== Migration eines Produkts zu Plone 4.0 ===================================== Für die Migration von Plone3 auf Plone4 sollten die folgenden Änderungen beachtet werden. 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:: string:${portal_url}/document_icon.png .. _`Products/CMFPlone/browser/ploneview.py`: http://dev.plone.org/plone/browser/CMFPlone/branches/3.0/browser/ploneview.py#L77 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: 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:: Somit lassen sich auch mehrere Werte im ``for``-Feld angeben:: Zum Weiterlesen =============== - `Upgrading Plone 3.x to 4.0`_ - `Migrating a Product to Plone 4.0`_ - `BACKWARDS_COMPATIBILITY.txt`_ .. _Upgrading Plone 3.x to 4.0: http://plone.org/documentation/manual/upgrade-guide/version/upgrading-plone-3-x-to-4.0/referencemanual-all-pages .. _`Migrating a Product to Plone 4.0`: http://maurits.vanrees.org/weblog/archive/2009/10/migrating-a-product-to-plone-4.0 .. _`BACKWARDS_COMPATIBILITY.txt`: http://dev.plone.org/plone/browser/Plone/trunk/docs/BACKWARDS_COMPATIBILITY.txt