Log message for revision 65814:
  Unregister locally defined views when the corresponding PageTemplate object
  is deleted.  We do that using an event subscriber which is very elegant 
(thanks
  for making this available in Zope 2.9, Florent!).
  

Changed:
  U   Products.Five/branches/philikon-local-components/component/browser.py
  U   Products.Five/branches/philikon-local-components/component/configure.zcml
  U   Products.Five/branches/philikon-local-components/component/zpt.py
  U   Products.Five/branches/philikon-local-components/component/zpt.txt

-=-
Modified: Products.Five/branches/philikon-local-components/component/browser.py
===================================================================
--- Products.Five/branches/philikon-local-components/component/browser.py       
2006-03-05 00:31:08 UTC (rev 65813)
+++ Products.Five/branches/philikon-local-components/component/browser.py       
2006-03-05 00:32:56 UTC (rev 65814)
@@ -21,7 +21,7 @@
 from Products.Five.browser import BrowserView
 from Products.Five.component import enableSite, disableSite, findSite
 from Products.Five.component.interfaces import IObjectManagerSite
-from Products.Five.component.zpt import ZPTViewFactory
+from Products.Five.component.zpt import ZPTViewFactory, 
IRegisteredViewPageTemplate
 from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
 
 import zope.interface
@@ -104,6 +104,7 @@
         zpt_id = os.path.basename(template.filename)
 
         viewzpt = ZopePageTemplate(zpt_id, template.read())
+        zope.interface.alsoProvides(viewzpt, IRegisteredViewPageTemplate)
         site._setObject(zpt_id, viewzpt) #XXXthere could be a naming conflict
         components = site.getSiteManager()
 

Modified: 
Products.Five/branches/philikon-local-components/component/configure.zcml
===================================================================
--- Products.Five/branches/philikon-local-components/component/configure.zcml   
2006-03-05 00:31:08 UTC (rev 65813)
+++ Products.Five/branches/philikon-local-components/component/configure.zcml   
2006-03-05 00:32:56 UTC (rev 65814)
@@ -42,4 +42,6 @@
 
   </browser:pages>
 
+  <subscriber handler=".zpt.unregisterViewWhenZPTIsDeleted" />
+
 </configure>

Modified: Products.Five/branches/philikon-local-components/component/zpt.py
===================================================================
--- Products.Five/branches/philikon-local-components/component/zpt.py   
2006-03-05 00:31:08 UTC (rev 65813)
+++ Products.Five/branches/philikon-local-components/component/zpt.py   
2006-03-05 00:32:56 UTC (rev 65814)
@@ -18,10 +18,22 @@
 from Acquisition import aq_inner, aq_acquire
 from Products.PageTemplates.Expressions import SecureModuleImporter
 from Products.Five.browser import BrowserView
+from Products.Five.component import findSite
 
 import zope.component
 import zope.interface
+from zope.pagetemplate.interfaces import IPageTemplate
+from zope.app.container.interfaces import IObjectRemovedEvent
 
+class IZPTViewFactory(zope.interface.Interface):
+    """Marker interface for those view factories that invoke locally
+    registered components.
+
+    By finding factories that provide this interface we can find the
+    registration object for a locally registered template and, for
+    example, unregister the view when the template is deleted."""
+    template = zope.interface.Attribute("The ZPT template to invoke.")
+
 class ZPTViewFactory(object):
     """View factory that gets registered with a local component
     registry.
@@ -31,6 +43,7 @@
     persistent) reference only to the Page Template, everything else
     needed for the template (e.g. its view class) is constructed by
     the view."""
+    zope.interface.implements(IZPTViewFactory)
 
     def __init__(self, template, name):
         self.template = template
@@ -84,3 +97,17 @@
             kwargs['args'] = args
         namespace['options'] = kwargs
         return self.template.pt_render(namespace)
+
+class IRegisteredViewPageTemplate(IPageTemplate):
+    """Marker interface for registered view page templates
+    """
+
[EMAIL PROTECTED](IRegisteredViewPageTemplate, IObjectRemovedEvent)
+def unregisterViewWhenZPTIsDeleted(zpt, event):
+    components = zope.component.getSiteManager(zpt)
+    for reg in components.registeredAdapters():
+        if (IZPTViewFactory.providedBy(reg.factory) and
+            reg.factory.template == zpt):
+            break
+    components.unregisterAdapter(reg.factory, reg.required, reg.provided,
+                                 reg.name)

Modified: Products.Five/branches/philikon-local-components/component/zpt.txt
===================================================================
--- Products.Five/branches/philikon-local-components/component/zpt.txt  
2006-03-05 00:31:08 UTC (rev 65813)
+++ Products.Five/branches/philikon-local-components/component/zpt.txt  
2006-03-05 00:32:56 UTC (rev 65814)
@@ -25,9 +25,11 @@
 
   >>> from Products.Five import zcml
   >>> import Products.Five.component
+  >>> import zope.app.event
   >>> zcml.load_config('meta.zcml', Products.Five)
   >>> zcml.load_config('permissions.zcml', Products.Five)
   >>> zcml.load_config('configure.zcml', Products.Five.component)
+  >>> zcml.load_config('configure.zcml', zope.app.event)
 
 We should also create a root object:
 
@@ -175,6 +177,28 @@
   <BLANKLINE>
 
 
+5. Deleting view templates
+--------------------------
+
+Once in a while we would like to get rid of the customized view.  The
+easiest way to do that is to simply delete the template:
+
+  >>> if True:
+  ...     site._delObject('customizetemplate.pt')
+
+Now the view look-up is back to the old way:
+
+  >>> view = zope.component.getMultiAdapter((item, request),
+  ...                                       name=u"customizetemplate.html")
+  >>> print view.index.read() #doctest: +ELLIPSIS
+  <html metal:use-macro="context/@@standard_macros/view"
+        i18n:domain="zope">
+  ...
+    <p i18n:translate="">This is the source of the
+    <code tal:content="request/form/viewname">viewname</code>:</p>
+  ...
+
+
 Clean up:
 ---------
 

_______________________________________________
Zope-Checkins maillist  -  Zope-Checkins@zope.org
http://mail.zope.org/mailman/listinfo/zope-checkins

Reply via email to