[Checkins] SVN: z3ext.layout/trunk/ Added 'pagelet' tales expression (same as @@pagelet)

Nikolay Kim fafhrd at datacom.kz
Wed Oct 29 12:49:01 EDT 2008


Log message for revision 92674:
  Added 'pagelet' tales expression (same as @@pagelet)

Changed:
  U   z3ext.layout/trunk/CHANGES.txt
  U   z3ext.layout/trunk/setup.py
  U   z3ext.layout/trunk/src/z3ext/layout/configure.zcml
  U   z3ext.layout/trunk/src/z3ext/layout/pagelet.txt
  A   z3ext.layout/trunk/src/z3ext/layout/tales.py
  U   z3ext.layout/trunk/src/z3ext/layout/zcml.py

-=-
Modified: z3ext.layout/trunk/CHANGES.txt
===================================================================
--- z3ext.layout/trunk/CHANGES.txt	2008-10-29 16:47:38 UTC (rev 92673)
+++ z3ext.layout/trunk/CHANGES.txt	2008-10-29 16:49:01 UTC (rev 92674)
@@ -2,6 +2,12 @@
 CHANGES
 =======
 
+1.5.4 (2008-10-30)
+------------------
+
+- Added 'pagelet' tales expression (same as @@pagelet)
+
+
 1.5.3 (2008-10-16)
 ------------------
 

Modified: z3ext.layout/trunk/setup.py
===================================================================
--- z3ext.layout/trunk/setup.py	2008-10-29 16:47:38 UTC (rev 92673)
+++ z3ext.layout/trunk/setup.py	2008-10-29 16:49:01 UTC (rev 92674)
@@ -61,6 +61,7 @@
 			  'zope.publisher',
 			  'zope.configuration',
 			  'zope.pagetemplate',
+                          'zope.tales',
 			  'zope.app.component',
 			  'zope.app.publisher',
 			  'zope.app.pagetemplate',

Modified: z3ext.layout/trunk/src/z3ext/layout/configure.zcml
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/configure.zcml	2008-10-29 16:47:38 UTC (rev 92673)
+++ z3ext.layout/trunk/src/z3ext/layout/configure.zcml	2008-10-29 16:49:01 UTC (rev 92674)
@@ -2,6 +2,7 @@
    xmlns="http://namespaces.zope.org/zope"
    xmlns:zcml="http://namespaces.zope.org/zcml"
    xmlns:z3ext="http://namespaces.zope.org/z3ext"
+   xmlns:tales="http://namespaces.zope.org/tales"
    i18n_domain="z3ext.layout">
 
   <includeDependencies package="z3ext.layout" />
@@ -9,6 +10,11 @@
   <!-- adapter provides IPagelet for (context, request) -->
   <adapter factory=".pagelet.queryPagelet" />
 
+  <!-- pagelet: tales expression -->
+  <tales:expressiontype
+     name="pagelet"
+     handler=".tales.TALESPageletExpression" />
+
   <!-- @@pagelet view -->
   <adapter
      name="pagelet"

Modified: z3ext.layout/trunk/src/z3ext/layout/pagelet.txt
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/pagelet.txt	2008-10-29 16:47:38 UTC (rev 92673)
+++ z3ext.layout/trunk/src/z3ext/layout/pagelet.txt	2008-10-29 16:49:01 UTC (rev 92674)
@@ -301,3 +301,169 @@
 
   >>> print pagelet.publishTraverse(request, 'testPageletType')
   <div>My pagelet</div>
+
+
+The TALES `pagelet` expression
+==============================
+
+The ``pagelet`` expression will look up the interaface or IPageletType
+name, call it and return the HTML content. The first step, however, will be to
+register our pagelet with the component architecture:
+
+Let's now create a view using a page template:
+
+  >>> import os, tempfile
+  >>> temp_dir = tempfile.mkdtemp()
+  >>> templateFileName = os.path.join(temp_dir, 'template.pt')
+  >>> open(templateFileName, 'w').write('''
+  ... <html>
+  ...   <body>
+  ...     <h1>My Web Page</h1>
+  ...     <div class="left-column">
+  ...       <tal:block replace="structure pagelet:z3ext.layout.tests.ITestPagelet" />
+  ...     </div>
+  ...     <div class="main">
+  ...       Content here
+  ...     </div>
+  ...   </body>
+  ... </html>
+  ... ''')
+
+Also we should register tales expression
+
+  >>> from z3ext.layout import tales
+  >>> from zope.app.pagetemplate.metaconfigure import registerType
+  >>> registerType('pagelet', tales.TALESPageletExpression)
+
+Finally we look up the view and render it.
+
+  >>> from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
+
+  >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+  >>> component.provideAdapter(
+  ...     FrontPage,
+  ...     (interface.Interface, interface.Interface), interface.Interface,
+  ...     name='main.html')
+
+  >>> view = component.getMultiAdapter((object(), request), name='main.html')
+  >>> print view()
+  <html>
+    <body>
+      <h1>My Web Page</h1>
+      <div class="left-column">
+        <div>My pagelet</div>
+      </div>
+      <div class="main">
+        Content here
+      </div>
+    </body>
+  </html>
+
+Or we can use typed pagelet interface
+
+  >>> open(templateFileName, 'w').write('''
+  ... <html>
+  ...   <body>
+  ...     <h1>My Web Page</h1>
+  ...     <div class="left-column">
+  ...       <tal:block replace="structure pagelet:testPageletType" />
+  ...     </div>
+  ...     <div class="main">
+  ...       Content here
+  ...     </div>
+  ...   </body>
+  ... </html>
+  ... ''')
+
+  >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+  >>> component.provideAdapter(
+  ...     FrontPage,
+  ...     (interface.Interface, interface.Interface), interface.Interface,
+  ...     name='main.html')
+
+  >>> view = component.getMultiAdapter((object(), request), name='main.html')
+  >>> print view()
+  <html>
+    <body>
+      <h1>My Web Page</h1>
+      <div class="left-column">
+        <div>My pagelet</div>
+      </div>
+      <div class="main">
+        Content here
+      </div>
+    </body>
+  </html>
+
+Default IPagelet
+
+  >>> open(templateFileName, 'w').write('''
+  ... <html>
+  ...   <body>
+  ...     <h1>My Web Page</h1>
+  ...     <div class="left-column">
+  ...       <tal:block replace="structure pagelet:" />
+  ...     </div>
+  ...     <div class="main">
+  ...       Content here
+  ...     </div>
+  ...   </body>
+  ... </html>
+  ... ''')
+
+  >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+  >>> component.provideAdapter(
+  ...     FrontPage,
+  ...     (interface.Interface, interface.Interface), interface.Interface,
+  ...     name='main.html')
+
+  >>> view = component.getMultiAdapter((object(), request), name='main.html')
+  >>> print view()
+  <html>
+    <body>
+      <h1>My Web Page</h1>
+      <div class="left-column">
+        <div>My pagelet2</div>
+      </div>
+      <div class="main">
+        Content here
+      </div>
+    </body>
+  </html>
+
+
+If pagelet is not exist, just return empty string
+
+  >>> open(templateFileName, 'w').write('''
+  ... <html>
+  ...   <body>
+  ...     <h1>My Web Page</h1>
+  ...     <div class="left-column">
+  ...       <tal:block replace="structure pagelet:test.unknown" />
+  ...     </div>
+  ...     <div class="main">
+  ...       Content here
+  ...     </div>
+  ...   </body>
+  ... </html>
+  ... ''')
+
+  >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+  >>> component.provideAdapter(
+  ...     FrontPage,
+  ...     (interface.Interface, interface.Interface), interface.Interface,
+  ...     name='main.html')
+
+  >>> view = component.getMultiAdapter((object(), request), name='main.html')
+  >>> print view()
+  <html>
+    <body>
+      <h1>My Web Page</h1>
+      <div class="left-column">
+  <BLANKLINE>
+      </div>
+      <div class="main">
+        Content here
+      </div>
+    </body>
+  </html>

Added: z3ext.layout/trunk/src/z3ext/layout/tales.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/tales.py	                        (rev 0)
+++ z3ext.layout/trunk/src/z3ext/layout/tales.py	2008-10-29 16:49:01 UTC (rev 92674)
@@ -0,0 +1,58 @@
+##############################################################################
+#
+# Copyright (c) 2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" 'pagelet' tales expression registrations
+
+$Id: tales.py 2720 2008-08-25 11:15:10Z fafhrd91 $
+"""
+import logging, sys
+from zope.component import queryUtility
+from zope.component import queryMultiAdapter
+from zope.tales.expressions import StringExpr
+
+from interfaces import IPagelet, IPageletType
+
+
+class TALESPageletExpression(StringExpr):
+
+    def __call__(self, econtext):
+        name = super(TALESPageletExpression, self).__call__(econtext)
+
+        context = econtext.vars['context']
+        request = econtext.vars['request']
+        modules = econtext.vars['modules']
+
+        # lookup pagelet
+        if name:
+            iface = queryUtility(IPageletType, name)
+            if iface is None:
+                try:
+                    iface, iname = name.rsplit('.', 1)
+                    iface = getattr(modules[iface], iname)
+                except Exception, err:
+                    log = logging.getLogger('z3ext.layout')
+                    log.exception(err)
+                    return u''
+        else:
+            iface = IPagelet
+
+        try:
+            view = queryMultiAdapter((context, request), iface)
+            if view is not None:
+                view.update()
+                return view.render()
+        except Exception, err:
+            log = logging.getLogger('z3ext.layout')
+            log.exception(err)
+
+        return u''

Modified: z3ext.layout/trunk/src/z3ext/layout/zcml.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/zcml.py	2008-10-29 16:47:38 UTC (rev 92673)
+++ z3ext.layout/trunk/src/z3ext/layout/zcml.py	2008-10-29 16:49:01 UTC (rev 92674)
@@ -26,7 +26,7 @@
 from zope.app.component.metadirectives import IBasicViewInformation
 from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
 
-from interfaces import IPagelet
+from interfaces import IPagelet, IPageletType
 from interfaces import ILayout, ILayoutCreatedEvent
 
 from pagelet import BrowserPagelet
@@ -328,12 +328,18 @@
     defineChecker(new_class, Checker(required))
 
     # register pagelet
+    _context.action(
+        discriminator = ('z3ext.layout:registerPagelets', new_class),
+        callable = registerPagelets,
+        args = (for_, layer, new_class, provides, name, _context.info))
+
+
+def registerPagelets(for_, layer, newClass, provides, name, info):
     for iface in provides:
-        _context.action(
-            discriminator = ('z3ext:pagelet', for_, layer, name, iface),
-            callable = handler,
-            args = ('registerAdapter',
-                    new_class, (for_, layer), iface, name, _context.info))
+        if IPageletType.providedBy(iface):
+            handler('registerAdapter', newClass, (for_, layer), iface, '', info)
+        else:
+            handler('registerAdapter', newClass, (for_, layer), iface, name, info)
 
 
 def _handle_allowed_interface(



More information about the Checkins mailing list