[Checkins] SVN: z3ext.layout/tags/2.0.7/ release tag

Nikolay Kim fafhrd at datacom.kz
Wed Apr 15 01:08:09 EDT 2009


Log message for revision 99172:
  release tag

Changed:
  A   z3ext.layout/tags/2.0.7/
  D   z3ext.layout/tags/2.0.7/CHANGES.txt
  A   z3ext.layout/tags/2.0.7/CHANGES.txt
  U   z3ext.layout/tags/2.0.7/setup.py
  D   z3ext.layout/tags/2.0.7/src/z3ext/layout/pagelet.txt
  A   z3ext.layout/tags/2.0.7/src/z3ext/layout/pagelet.txt

-=-
Deleted: z3ext.layout/tags/2.0.7/CHANGES.txt
===================================================================
--- z3ext.layout/trunk/CHANGES.txt	2009-04-14 15:08:48 UTC (rev 99170)
+++ z3ext.layout/tags/2.0.7/CHANGES.txt	2009-04-15 05:08:09 UTC (rev 99172)
@@ -1,275 +0,0 @@
-=======
-CHANGES
-=======
-
-2.0.7 (2009-04-??)
-------------------
-
-- Do not use z3c.autoinclude
-
-
-2.0.6 (2009-03-11)
-------------------
-
-- Fixed discriminator for z3ext:pagelet directive
-
-- Allow use 'layout' pagelet type as template for layout
-
-- Update styles
-
-
-2.0.5 (2009-01-26)
-------------------
-
-- Update styles
-
-
-2.0.4 (2009-01-22)
-------------------
-
-- Pass permission to class required attributes
-
-
-2.0.3 (2009-01-20)
-------------------
-
-- Use __parent__ for layout quering
-
-
-2.0.2 (2009-01-08)
-------------------
-
-- Register layout for (view, for, layer), instead of view and for separatly
-
-
-2.0.1 (2008-12-25)
-------------------
-
-- Pagelet should implement provided interfaces
-
-
-2.0.0 (2008-12-22)
-------------------
-
-- Pagelet without name is not allowed
-
-- Added 'type' attribute to 'z3ext:pagelet'
-
-- Added 'z3ext:pageletType' directive for registering new pagelet types
-
-- multiple params is allowed for 'for' attribute
-
-- Removed pagelet 'manager' attribute
-
-- 'pagelet' tales expression and 'pagelet' view checks additional context IPageletContext
-  if exists use it as adapter parameter
-
-
-1.7.3 (2008-12-18)
-------------------
-
-- Use IPagelet instead of IPageTemplate for pagelet rendering
-
-
-1.7.2 (2008-12-17)
-------------------
-
-- Update default styles
-
-
-1.7.1 (2008-12-15)
-------------------
-
-- Check if context provides interface in @@pagelet view and pagelet: tales expresion
-
-
-1.7.0 (2008-12-11)
-------------------
-
-- Added `manager` attribute to z3ext:pagelet directive
-  this allow use getMultiAdapter((content, request, manager1, manager2, ...), IPagelet)
-
-- Use 'provides' schema for converting kwargs in z3ext:pagelet directive
-
-
-1.6.0 (2008-11-27)
-------------------
-
-- Added 'uid' attribute to z3ext:layout directive.
-  Send ILayoutCreatedEvent event only if layout has uid
-
-
-1.5.9 (2008-11-24)
-------------------
-
-- Fixed python2.4 compatibility
-
-
-1.5.7 (2008-11-17)
-------------------
-
-- Update css styles
-
-
-1.5.6 (2008-11-06)
-------------------
-
-- Register nameless pagelet only if provided interface is not
-inherited from IBrowserPublisher
-
-
-1.5.5 (2008-11-05)
-------------------
-
-- Add IPagelet interface to pagelet provides
-
-
-1.5.4 (2008-10-30)
-------------------
-
-- Added 'pagelet' tales expression (same as @@pagelet)
-
-- Update css styles
-
-
-1.5.3 (2008-10-16)
-------------------
-
-- Update css styles
-
-
-1.5.2 (2008-10-15)
-------------------
-
-- Render IPagelet adapter for @@pagelet view
-
-
-1.5.1 (2008-10-14)
-------------------
-
-- Fixed missing NotFount in @@pagelet 
-
-- Log errors in @@pagelet
-
-- Default css styles
-
-
-1.5.0 (2008-10-06)
-------------------
-
-- Added @@pagelet browser view for fast access pagelets
-
-
-1.4.6 (2008-10-03)
-------------------
-
-- Fixed bug with multple nameless pagelet
-
-
-1.4.5 (2008-08-18)
-------------------
-
-- `name` attribute is optional for <z3ext:pagelet/> directive
-
-
-1.4.4 (2008-07-22)
-------------------
-
-- Fix IPagelet adapter for content
-
-
-1.4.3 (2008-05-22)
-------------------
-
-- Added LayoutNotFound exception
-
-
-1.4.2 (2008-05-14)
-------------------
-
-- Remove unused interfaces
-
-- Tests updated
-
-
-1.4.1 (2008-04-23)
-------------------
-
-- Use newer version of z3ext.autoinclude
-
-
-1.4 (2008-03-21)
-----------------
-
-- Added z3ext:pagelet directive
-
-- Code cleanup
-
-- Moved to svn.zope.org
-
-
-1.3.2 (2008-03-06)
-------------------
-
-- Removed context layouts
-
-
-1.3.1 (2008-02-21)
-------------------
-
-- Code cleanup
-
-- Remove code related to zope.formlib
-
-
-1.3.0 (2008-02-20)
-------------------
-
-- Removed code related to z3c.form
-
-
-1.2.1 (2008-02-18)
-------------------
-
-- Added 'redirect' method to IBrowserPagelet, this is usefull
-  when we need redirect during 'update' method and we don't 
-  need render pagelet at all.
-
-- Added adapter to IPagelet for (context, request),
-  this adapter gets browser:defaultView for context and if it IPagelet return it
-
-
-1.2.0 (2008-02-13)
-------------------
-
-- Remove all code related to persistent templates
-
-
-1.1.2 (2008-02-12)
-------------------
-
-- Added 'title' and 'description' fields layout directive
-
-- check ILayoutTemplateTAL for ISite
-
-
-1.1.0 (2008-02-08)
-------------------
-
-- Added compatibility with z3c.template layouts
-
-- Added ILayoutTemplateTAL interface, other packages
-  can define adapter to this interface and change layout template
-  TAL program (layout customization)
-
-
-1.0.1 (2008-02-02)
-------------------
-
-- Added required dependencies
-
-
-1.0.0 (2008-01-15)
-------------------
-
-- Initial release

Copied: z3ext.layout/tags/2.0.7/CHANGES.txt (from rev 99171, z3ext.layout/trunk/CHANGES.txt)
===================================================================
--- z3ext.layout/tags/2.0.7/CHANGES.txt	                        (rev 0)
+++ z3ext.layout/tags/2.0.7/CHANGES.txt	2009-04-15 05:08:09 UTC (rev 99172)
@@ -0,0 +1,275 @@
+=======
+CHANGES
+=======
+
+2.0.7 (2009-04-15)
+------------------
+
+- Do not use z3c.autoinclude
+
+
+2.0.6 (2009-03-11)
+------------------
+
+- Fixed discriminator for z3ext:pagelet directive
+
+- Allow use 'layout' pagelet type as template for layout
+
+- Update styles
+
+
+2.0.5 (2009-01-26)
+------------------
+
+- Update styles
+
+
+2.0.4 (2009-01-22)
+------------------
+
+- Pass permission to class required attributes
+
+
+2.0.3 (2009-01-20)
+------------------
+
+- Use __parent__ for layout quering
+
+
+2.0.2 (2009-01-08)
+------------------
+
+- Register layout for (view, for, layer), instead of view and for separatly
+
+
+2.0.1 (2008-12-25)
+------------------
+
+- Pagelet should implement provided interfaces
+
+
+2.0.0 (2008-12-22)
+------------------
+
+- Pagelet without name is not allowed
+
+- Added 'type' attribute to 'z3ext:pagelet'
+
+- Added 'z3ext:pageletType' directive for registering new pagelet types
+
+- multiple params is allowed for 'for' attribute
+
+- Removed pagelet 'manager' attribute
+
+- 'pagelet' tales expression and 'pagelet' view checks additional context IPageletContext
+  if exists use it as adapter parameter
+
+
+1.7.3 (2008-12-18)
+------------------
+
+- Use IPagelet instead of IPageTemplate for pagelet rendering
+
+
+1.7.2 (2008-12-17)
+------------------
+
+- Update default styles
+
+
+1.7.1 (2008-12-15)
+------------------
+
+- Check if context provides interface in @@pagelet view and pagelet: tales expresion
+
+
+1.7.0 (2008-12-11)
+------------------
+
+- Added `manager` attribute to z3ext:pagelet directive
+  this allow use getMultiAdapter((content, request, manager1, manager2, ...), IPagelet)
+
+- Use 'provides' schema for converting kwargs in z3ext:pagelet directive
+
+
+1.6.0 (2008-11-27)
+------------------
+
+- Added 'uid' attribute to z3ext:layout directive.
+  Send ILayoutCreatedEvent event only if layout has uid
+
+
+1.5.9 (2008-11-24)
+------------------
+
+- Fixed python2.4 compatibility
+
+
+1.5.7 (2008-11-17)
+------------------
+
+- Update css styles
+
+
+1.5.6 (2008-11-06)
+------------------
+
+- Register nameless pagelet only if provided interface is not
+inherited from IBrowserPublisher
+
+
+1.5.5 (2008-11-05)
+------------------
+
+- Add IPagelet interface to pagelet provides
+
+
+1.5.4 (2008-10-30)
+------------------
+
+- Added 'pagelet' tales expression (same as @@pagelet)
+
+- Update css styles
+
+
+1.5.3 (2008-10-16)
+------------------
+
+- Update css styles
+
+
+1.5.2 (2008-10-15)
+------------------
+
+- Render IPagelet adapter for @@pagelet view
+
+
+1.5.1 (2008-10-14)
+------------------
+
+- Fixed missing NotFount in @@pagelet 
+
+- Log errors in @@pagelet
+
+- Default css styles
+
+
+1.5.0 (2008-10-06)
+------------------
+
+- Added @@pagelet browser view for fast access pagelets
+
+
+1.4.6 (2008-10-03)
+------------------
+
+- Fixed bug with multple nameless pagelet
+
+
+1.4.5 (2008-08-18)
+------------------
+
+- `name` attribute is optional for <z3ext:pagelet/> directive
+
+
+1.4.4 (2008-07-22)
+------------------
+
+- Fix IPagelet adapter for content
+
+
+1.4.3 (2008-05-22)
+------------------
+
+- Added LayoutNotFound exception
+
+
+1.4.2 (2008-05-14)
+------------------
+
+- Remove unused interfaces
+
+- Tests updated
+
+
+1.4.1 (2008-04-23)
+------------------
+
+- Use newer version of z3ext.autoinclude
+
+
+1.4 (2008-03-21)
+----------------
+
+- Added z3ext:pagelet directive
+
+- Code cleanup
+
+- Moved to svn.zope.org
+
+
+1.3.2 (2008-03-06)
+------------------
+
+- Removed context layouts
+
+
+1.3.1 (2008-02-21)
+------------------
+
+- Code cleanup
+
+- Remove code related to zope.formlib
+
+
+1.3.0 (2008-02-20)
+------------------
+
+- Removed code related to z3c.form
+
+
+1.2.1 (2008-02-18)
+------------------
+
+- Added 'redirect' method to IBrowserPagelet, this is usefull
+  when we need redirect during 'update' method and we don't 
+  need render pagelet at all.
+
+- Added adapter to IPagelet for (context, request),
+  this adapter gets browser:defaultView for context and if it IPagelet return it
+
+
+1.2.0 (2008-02-13)
+------------------
+
+- Remove all code related to persistent templates
+
+
+1.1.2 (2008-02-12)
+------------------
+
+- Added 'title' and 'description' fields layout directive
+
+- check ILayoutTemplateTAL for ISite
+
+
+1.1.0 (2008-02-08)
+------------------
+
+- Added compatibility with z3c.template layouts
+
+- Added ILayoutTemplateTAL interface, other packages
+  can define adapter to this interface and change layout template
+  TAL program (layout customization)
+
+
+1.0.1 (2008-02-02)
+------------------
+
+- Added required dependencies
+
+
+1.0.0 (2008-01-15)
+------------------
+
+- Initial release

Modified: z3ext.layout/tags/2.0.7/setup.py
===================================================================
--- z3ext.layout/trunk/setup.py	2009-04-14 15:08:48 UTC (rev 99170)
+++ z3ext.layout/tags/2.0.7/setup.py	2009-04-15 05:08:09 UTC (rev 99172)
@@ -21,7 +21,7 @@
 def read(*rnames):
     return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
 
-version='2.0.7dev'
+version='2.0.7'
 
 
 setup(name='z3ext.layout',

Deleted: z3ext.layout/tags/2.0.7/src/z3ext/layout/pagelet.txt
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/pagelet.txt	2009-04-14 15:08:48 UTC (rev 99170)
+++ z3ext.layout/tags/2.0.7/src/z3ext/layout/pagelet.txt	2009-04-15 05:08:09 UTC (rev 99172)
@@ -1,942 +0,0 @@
-=================
-Pagelet directive
-=================
-
-Show how we can use the pagelet directive. Register the meta configuration for 
-the directive.
-
-  >>> import os, tempfile, sys
-  >>> from zope import interface, component, schema
-  >>> from zope.configuration import xmlconfig
-  >>> from z3ext.layout.interfaces import IPagelet, IPageletType, IPageletContext
-
-  >>> import z3ext.layout
-  >>> context = xmlconfig.file('meta.zcml', z3ext.layout)
-
-We need also a custom pagelet class:
-
-  >>> from z3ext.layout.pagelet import BrowserPagelet
-  >>> class MyPagelet(BrowserPagelet):
-  ...     """Custom pagelet"""
-
-Register a pagelet within the directive with minimal attributes:
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       name="index.html"
-  ...       class="z3ext.layout.TESTS.MyPagelet"
-  ...       permission="zope.Public"
-  ...       />
-  ... </configure>
-  ... """, context)
-
-Let's get the pagelet
-
-  >>> from zope.publisher.browser import TestRequest
-  >>> pagelet = component.queryMultiAdapter(
-  ...     (object(), TestRequest()), name='index.html')
-
-and check them:
-
-  >>> pagelet
-  <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.MyPagelet'> ...>
-
-  >>> pagelet.context
-  <object object at ...>
-
-Register the pagelet with a different name and more attributes provided from
-the directive. We also use a custom attribute called label here.
-Also we don't use BrowserPagelet as parent class, pagelet directive automaticly
-adds BrowserPagetlet to bases classes. Let's define some more components...
-
-  >>> class SecondPagelet(object):
-  ...     label = u''
-
-  >>> import zope.interface
-  >>> class IContent(zope.interface.Interface):
-  ...     """Content interface."""
-
-  >>> class Content(object):
-  ...     zope.interface.implements(IContent)
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       name="custom.html"
-  ...       class="z3ext.layout.TESTS.SecondPagelet"
-  ...       for="z3ext.layout.TESTS.IContent"
-  ...       permission="zope.Public"
-  ...       label="my Label" />
-  ... </configure>
-  ... """, context)
-
-Get the pagelet for the new content object
-
-  >>> import zope.component
-  >>> pagelet = zope.component.queryMultiAdapter((Content(), TestRequest()), 
-  ...     name='custom.html')
-
-and check them:
-
-  >>> pagelet
-  <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.SecondPagelet'> ...>
-
-  >>> pagelet.label
-  u'my Label'
-
-We also can provide another interface then the IPagelet within the directive.
-Such a interface must be inherited from IPagelet.
-
-  >>> class NewPagelet(BrowserPagelet):
-  ...     """New pagelet"""
-
-Now register the pagelet within a interface.
-
-  >>> class INewPagelet(interface.Interface):
-  ...     """New pagelet interface."""
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       name="new.html"
-  ...       class="z3ext.layout.TESTS.NewPagelet"
-  ...       provides="z3ext.layout.TESTS.INewPagelet" />
-  ... </configure>
-  ... """, context)
-
-And if we get the pagelet, we can see that the object provides the new 
-pagelet interface:
-
-  >>> pagelet = component.queryMultiAdapter((object(), TestRequest()), 
-  ...     name='new.html')
-  >>> pagelet
-  <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.NewPagelet'> ...>
-
-  >>> INewPagelet.providedBy(pagelet)
-  True
-
-If any of provides interfaces define schema field, newlly create class
-will have this attribute. Let' redefine INewPagelet interface
-
-  >>> class INewPagelet2(interface.Interface):
-  ...     """New pagelet interface."""
-  ...     
-  ...     number = schema.Int(
-  ...         title = u'Number',
-  ...         required = True)
-
-Because NewPagelet class doesn't have 'number' attribute and we don't
-supply it in directive we get exception.
-
-  >>> xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       name="new.html"
-  ...       class="z3ext.layout.TESTS.NewPagelet"
-  ...       provides="z3ext.layout.TESTS.INewPagelet2" />
-  ... </configure>
-  ... """, context)
-  Traceback (most recent call last):
-  ...
-  ZopeXMLConfigurationError: ...Required field is missing...number...
-
-Schema can provide default value
-
-  >>> class INewPagelet2(interface.Interface):
-  ...     """New pagelet interface."""
-  ...     
-  ...     number = schema.Int(
-  ...         title = u'Number',
-  ...         required = False,
-  ...         default = 9)
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       name="new.html"
-  ...       class="z3ext.layout.TESTS.NewPagelet"
-  ...       provides="z3ext.layout.TESTS.INewPagelet2" />
-  ... </configure>
-  ... """, context)
-
-  >>> pagelet = component.getMultiAdapter(
-  ...     (object(), TestRequest()), IPagelet, name='new.html')
-  >>> print pagelet.number
-  9
-
-Let's provide 'number' in directive
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       name="new1.html"
-  ...       class="z3ext.layout.TESTS.NewPagelet"
-  ...       provides="z3ext.layout.TESTS.INewPagelet2"
-  ...       number="10" />
-  ... </configure>
-  ... """, context)
-
-  >>> pagelet = component.getMultiAdapter(
-  ...     (object(), TestRequest()), IPagelet, name='new1.html')
-  >>> print pagelet.number, ':', type(pagelet.number)
-  10 : <type 'int'>
-
-Value should be in right format
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       name="new1.html"
-  ...       class="z3ext.layout.TESTS.NewPagelet"
-  ...       provides="z3ext.layout.TESTS.INewPagelet2"
-  ...       number="xxxxx" />
-  ... </configure>
-  ... """, context)
-  Traceback (most recent call last):
-  ...
-  ZopeXMLConfigurationError: ...invalid literal for int()...
-
-Schema field should implement IFromUnicode 
-
-  >>> class INewPagelet3(interface.Interface):
-  ...     
-  ...     date = schema.Date(
-  ...         title = u'Date',
-  ...         required = False)
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       name="new.html"
-  ...       class="z3ext.layout.TESTS.NewPagelet"
-  ...       date="2007-10-10"
-  ...       provides="z3ext.layout.TESTS.INewPagelet3" />
-  ... </configure>
-  ... """, context)
-  Traceback (most recent call last):
-  ...
-  ZopeXMLConfigurationError:...ConfigurationError: ("Can't convert value", 'date')
-
-If pagelet is typed, type schema also checked
-
-  >>> from zope.component.interface import provideInterface
-  >>> provideInterface('newPagelet3', INewPagelet3, IPageletType)
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       name="new.html"
-  ...       class="z3ext.layout.TESTS.NewPagelet"
-  ...       date="2007-10-10"
-  ...       type="newPagelet3" />
-  ... </configure>
-  ... """, context)
-  Traceback (most recent call last):
-  ...
-  ZopeXMLConfigurationError:...ConfigurationError: ("Can't convert value", 'date')
-
-
-We can create pagelet without specific class
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       name="noclass.html" />
-  ... </configure>
-  ... """, context) 
-
-  >>> pagelet = component.queryMultiAdapter(
-  ...     (object(), TestRequest()), name='noclass.html')
-  >>> pagelet
-  <z3ext.layout.zcml.PageletClass from None ...>
-
-
-We can create pagelet with template:
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       name="unknown.html"
-  ...       template="unknown.pt" />
-  ... </configure>
-  ... """, context)
-  Traceback (most recent call last):
-  ...
-  ZopeXMLConfigurationError: File "<string>", line 3.2-6.30
-  ConfigurationError: ('No such file', '...unknown.pt')
-
-  >>> temp_dir = tempfile.mkdtemp()
-  >>> template = os.path.join(temp_dir, 'pagelet.pt')
-  >>> open(template, 'w').write('''<div>My pagelet</div>''')
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       name="template.html"
-  ...       template="%s"
-  ...       permission="zope.Public" />
-  ... </configure>
-  ... """%template, context)
-
-  >>> pagelet = component.queryMultiAdapter((object(), TestRequest()), 
-  ...     name='template.html')
-  >>> pagelet
-  <z3ext.layout.zcml.PageletClass from None ...>
-
-  >>> pagelet.template
-  <BoundPageTemplateFile of <z3ext.layout.zcml.PageletClass from None ...>>
-
-We can create pagelet with additional context
-
-  >>> class IContext2(interface.Interface):
-  ...     """ additional context """
-
-  >>> class Context2(object):
-  ...     interface.implements(IContext2)
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       name="index.html"
-  ...       for="* z3ext.layout.TESTS.IContext2" />
-  ... </configure>
-  ... """, context) 
-
-  >>> context2 = Context2()
-
-  >>> c2Pagelet = component.queryMultiAdapter(
-  ...     (object(), context2, TestRequest()), name='index.html')
-  >>> c2Pagelet
-  <z3ext.layout.zcml.PageletClass from None ...>
-
-  >>> c2Pagelet.contexts
-  (<z3ext.layout.TESTS.Context2 ...>,)
-
-
-Pagelet rendering
-
-  >>> print pagelet.render()
-  <div>My pagelet</div>
-
-We should use page template as template for pagelet or we should
-provide IPagelet adapter for pagelet
-
-  >>> pagelet = component.queryMultiAdapter((object(), TestRequest()), 
-  ...     name='noclass.html')
-  >>> pagelet.render()
-  Traceback (most recent call last):
-  ...
-  LookupError: Can't find IPagelet for this pagelet.
-
-  >>> try:
-  ...     tmp = __file__
-  ... except NameError:
-  ...     from z3ext.layout import tests
-  ...     __file__ = tests.__file__
-
-  >>> pageletClass = pagelet.__class__
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pageletType name="pagelet"
-  ...       interface="z3ext.layout.interfaces.IPagelet" />
-  ...   <z3ext:pagelet
-  ...       type="pagelet"
-  ...       for="z3ext.layout.TESTS.pageletClass"
-  ...       template="%s"
-  ...       permission="zope.Public" />
-  ... </configure>
-  ... """%template, context)
-
-  >>> print pagelet()
-  <div>My pagelet</div>
-
-We can redirect during pagelet rendering, in this case render method
-doesn't call.
-
-  >>> pagelet = component.queryMultiAdapter((object(), TestRequest()), 
-  ...     name='noclass.html')
-  >>> pagelet.redirect('/')
-  >>> pagelet.isRedirected
-  True
-  >>> pagelet()
-  u''
-
-We can get default pagelet view for content. First register default view
-
-  >>> from zope.component.interfaces import IDefaultViewName
-  >>> component.getSiteManager().registerAdapter(
-  ...     'index.html', (interface.Interface, interface.Interface),
-  ...     IDefaultViewName)
-
-  >>> view = component.getMultiAdapter(
-  ...     (object(), TestRequest()), z3ext.layout.interfaces.IPagelet)
-
-  >>> view
-  <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.MyPagelet'> ...>
-
-  >>> view.__name__
-  u'index.html'
-
-
-Pagelte Type
-
-pagelet type can't be IPublishTraverse
-
-  >>> from zope.publisher.interfaces import IPublishTraverse
-
-  >>> class IMyPageletType(IPublishTraverse):
-  ...     pass
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pageletType name="pagelet"
-  ...       interface="z3ext.layout.TESTS.IMyPageletType" />
-  ... </configure>""", context)
-  Traceback (most recent call last):
-  ...
-  ZopeXMLConfigurationError:...ConfigurationError: Can't use IPublishTraverse as base for pagelet type
-
-
-Typed pagelets
-
-  >>> class IMyPagelet2(interface.Interface):
-  ...     pass
-
-  >>> class IMyPagelet3(interface.Interface):
-  ...     pass
-
-  >>> from z3ext.layout.tests import ITestPagelet
-
-We need register types
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pageletType name="myPagelet1"
-  ...       interface="z3ext.layout.tests.ITestPagelet" />
-  ...   <z3ext:pageletType name="myPagelet2"
-  ...       interface="z3ext.layout.TESTS.IMyPagelet2" />
-  ...   <z3ext:pageletType name="myPagelet3"
-  ...       interface="z3ext.layout.TESTS.IMyPagelet3" />
-  ... </configure>""", context)
-
-  >>> template2 = os.path.join(temp_dir, 'pagelet2.pt')
-  >>> open(template2, 'w').write('''<div>My pagelet2</div>''')
-
-  >>> template3 = os.path.join(temp_dir, 'pagelet3.pt')
-  >>> open(template3, 'w').write('''<div>My pagelet3</div>''')
-
-  >>> template4 = os.path.join(temp_dir, 'pagelet4.pt')
-  >>> open(template4, 'w').write('''<div>My pagelet - default</div>''')
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       template="%s"
-  ...       type="myPagelet1"
-  ...       permission="zope.Public" />
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       template="%s"
-  ...       type="myPagelet2"
-  ...       permission="zope.Public" />
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       template="%s"
-  ...       type="myPagelet3"
-  ...       permission="zope.Public" />
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       template="%s"
-  ...       type="pagelet"
-  ...       permission="zope.Public" />
-  ... </configure>
-  ... """%(template, template2, template3, template4), context)
-
-  >>> pagelet = component.queryMultiAdapter(
-  ...     (object(), TestRequest()), ITestPagelet)
-  
-  >>> ITestPagelet.providedBy(pagelet)
-  True
-  >>> print pagelet.render()
-  <div>My pagelet</div>
-
-  >>> request = TestRequest()
-  >>> pagelet = component.queryMultiAdapter((object(), request), IMyPagelet2)
-  >>> IMyPagelet2.providedBy(pagelet)
-  True
-  >>> print pagelet.render()
-  <div>My pagelet2</div>
-
-
-Access typed pagelet from view
-
-  >>> pagelet = component.getMultiAdapter((object(), request), name='pagelet')
-
-  >>> print pagelet.publishTraverse(
-  ...     request, 'test.unknown')
-  Traceback (most recent call last):
-  ...
-  NotFound: Object: ..., name: 'test.unknown'
-
-  >>> pagelet.browserDefault(request)
-  (..., ('',))
-
-by default IPagelet
-
-  >>> print pagelet()
-  <div>My pagelet - default</div>
-
-  >>> print pagelet.publishTraverse(request, '')
-  <div>My pagelet - default</div>
-
-  >>> print pagelet.publishTraverse(
-  ...     request, 'z3ext.layout.tests.ITestPagelet')
-  <div>My pagelet</div>
-
-We can register our marker interface as named utility and use name
-instead of full module path
-
-  >>> component.provideUtility(
-  ...     ITestPagelet, z3ext.layout.interfaces.IPageletType, name='testPageletType')
-  >>> interface.alsoProvides(ITestPagelet, z3ext.layout.interfaces.IPageletType)
-
-  >>> print pagelet.publishTraverse(request, 'testPageletType')
-  <div>My pagelet</div>
-
-We can provide additional context for pagelet
-
-  >>> def getContexts(content):
-  ...     return Content()
-
-  >>> component.provideAdapter(
-  ...     getContexts, (IContent,), IPageletContext, name='myPagelet4')
-
-  >>> class IMyPagelet4(interface.Interface):
-  ...     pass
-
-  >>> provideInterface('myPagelet4', IMyPagelet4, IPageletType)
-
-  >>> template4 = os.path.join(temp_dir, 'pagelet4.pt')
-  >>> open(template4, 'w').write('''<div>My pagelet4</div>''')
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="* z3ext.layout.TESTS.IContent"
-  ...       template="%s"
-  ...       type="myPagelet4"
-  ...       permission="zope.Public" />
-  ... </configure>"""%template4, context)
-
-  >>> pagelet = component.getMultiAdapter((Content(), request), name='pagelet')
-  >>> print pagelet.publishTraverse(request, 'myPagelet4')
-  <div>My pagelet4</div>
-
-Or multiple contexts
-
-  >>> def getContexts2(content):
-  ...     return (Content(), Content())
-
-  >>> component.provideAdapter(
-  ...     getContexts2, (IContent,), IPageletContext, name='myPagelet5')
-
-  >>> class IMyPagelet5(interface.Interface):
-  ...     pass
-
-  >>> provideInterface('myPagelet5', IMyPagelet5, IPageletType)
-
-  >>> template5 = os.path.join(temp_dir, 'pagelet5.pt')
-  >>> open(template5, 'w').write('''<div>My pagelet5</div>''')
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="* z3ext.layout.TESTS.IContent z3ext.layout.TESTS.IContent"
-  ...       template="%s"
-  ...       type="myPagelet5"
-  ...       permission="zope.Public" />
-  ... </configure>"""%template5, context)
-
-  >>> pagelet = component.getMultiAdapter((Content(), request), name='pagelet')
-  >>> print pagelet.publishTraverse(request, 'myPagelet5')
-  <div>My pagelet5</div>
-
-
-We can't register nameless pagelet, we can register only typed pagelet
-without name
-
-  >>> class IWrongPageletInterface(IPagelet):
-  ...     pass
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="*"
-  ...       template="%s"
-  ...       permission="zope.Public" />
-  ... </configure>
-  ... """%template, context)
-  Traceback (most recent call last):
-  ...
-  ZopeXMLConfigurationError:...
-      ConfigurationError: Can't create pagelet without name.
-
-If we still need nameless adapter we can use IPagelet interface
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       type="pagelet"
-  ...       for="z3ext.layout.TESTS.IContent"
-  ...       template="%s"
-  ...       permission="zope.Public" />
-  ... </configure>
-  ... """%template, context)
-
-
-We can register typed pagelet with name
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       name="test.html"
-  ...       for="z3ext.layout.TESTS.IContent"
-  ...       template="%s"
-  ...       type="myPagelet1"
-  ...       permission="zope.Public" />
-  ... </configure>
-  ... """%template, context)
-
-  >>> content = Content()
-  >>> pagelet = component.getMultiAdapter(
-  ...     (content, request), ITestPagelet, name='test.html')
-
-Pagelets with errors
-
-  >>> class PageletWithError(object):
-  ...     def render(self):
-  ...         raise Exception('Error')
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="z3ext.layout.TESTS.IContent"
-  ...       class="z3ext.layout.TESTS.PageletWithError"
-  ...       type="myPagelet2" />
-  ... </configure>
-  ... """, context)
-
-  >>> pagelet = component.getMultiAdapter((content, request), name='pagelet')
-  >>> pagelet.publishTraverse(request, 'myPagelet2')
-  Traceback (most recent call last):
-  ...
-  NotFound: ...
-
-  >>> pagelet('myPagelet2')
-  u''
-
-  >>> pagelet['myPagelet2']
-  Traceback (most recent call last):
-  ...
-  KeyError: 'myPagelet2'
-
-
-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 pagelet - default</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">
-      </div>
-      <div class="main">
-        Content here
-      </div>
-    </body>
-  </html>
-
-
-Pagelets with errors
-
-  >>> class PageletWithError(object):
-  ...     def render(self):
-  ...         raise Exception('Error')
-
-  >>> context = xmlconfig.string("""
-  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
-  ...   <z3ext:pagelet
-  ...       for="z3ext.layout.TESTS.IContent"
-  ...       class="z3ext.layout.TESTS.PageletWithError"
-  ...       type="myPagelet2" />
-  ... </configure>
-  ... """, context)
-
-  >>> open(templateFileName, 'w').write('''
-  ... <html>
-  ...   <body>
-  ...     <h1>My Web Page</h1>
-  ...     <div class="left-column">
-  ...       <tal:block replace="structure pagelet:myPagelet2" />
-  ...     </div>
-  ...     <div class="main">
-  ...       Content here
-  ...     </div>
-  ...   </body>
-  ... </html>
-  ... ''')
-
-  >>> FrontPage = SimpleViewClass(templateFileName, name='error.html')
-  >>> component.provideAdapter(
-  ...     FrontPage,
-  ...     (IContent, interface.Interface), interface.Interface,
-  ...     name='error.html')
-
-  >>> view = component.getMultiAdapter((Content(), request), name='error.html')
-  >>> print view()
-    <html>
-      <body>
-        <h1>My Web Page</h1>
-        <div class="left-column">
-        </div>
-        <div class="main">
-          Content here
-        </div>
-      </body>
-    </html>
-
-Pagelet with extra context
-
-  >>> open(templateFileName, 'w').write('''
-  ... <html>
-  ...   <body>
-  ...     <h1>My Web Page</h1>
-  ...     <div class="left-column">
-  ...       <tal:block replace="structure pagelet:myPagelet4" />
-  ...     </div>
-  ...     <div class="main">
-  ...       Content here
-  ...     </div>
-  ...   </body>
-  ... </html>
-  ... ''')
-
-  >>> FrontPage = SimpleViewClass(templateFileName, name='extra4.html')
-  >>> component.provideAdapter(
-  ...     FrontPage,
-  ...     (IContent, interface.Interface), interface.Interface,
-  ...     name='extra4.html')
-
-  >>> view = component.getMultiAdapter((Content(), request), name='extra4.html')
-  >>> print view()
-  <html>
-    <body>
-      <h1>My Web Page</h1>
-      <div class="left-column">
-        <div>My pagelet4</div>
-      </div>
-      <div class="main">
-        Content here
-      </div>
-    </body>
-  </html>
-
-
-Pagelet with extra context
-
-  >>> open(templateFileName, 'w').write('''
-  ... <html>
-  ...   <body>
-  ...     <h1>My Web Page</h1>
-  ...     <div class="left-column">
-  ...       <tal:block replace="structure pagelet:myPagelet5" />
-  ...     </div>
-  ...     <div class="main">
-  ...       Content here
-  ...     </div>
-  ...   </body>
-  ... </html>
-  ... ''')
-
-  >>> FrontPage = SimpleViewClass(templateFileName, name='extra5.html')
-  >>> component.provideAdapter(
-  ...     FrontPage,
-  ...     (IContent, interface.Interface), interface.Interface,
-  ...     name='extra5.html')
-
-  >>> view = component.getMultiAdapter((Content(), request), name='extra5.html')
-  >>> print view()
-  <html>
-    <body>
-      <h1>My Web Page</h1>
-      <div class="left-column">
-        <div>My pagelet5</div>
-      </div>
-      <div class="main">
-        Content here
-      </div>
-    </body>
-  </html>

Copied: z3ext.layout/tags/2.0.7/src/z3ext/layout/pagelet.txt (from rev 99171, z3ext.layout/trunk/src/z3ext/layout/pagelet.txt)
===================================================================
--- z3ext.layout/tags/2.0.7/src/z3ext/layout/pagelet.txt	                        (rev 0)
+++ z3ext.layout/tags/2.0.7/src/z3ext/layout/pagelet.txt	2009-04-15 05:08:09 UTC (rev 99172)
@@ -0,0 +1,945 @@
+=================
+Pagelet directive
+=================
+
+Show how we can use the pagelet directive. Register the meta configuration for 
+the directive.
+
+  >>> import os, tempfile, sys
+  >>> from zope import interface, component, schema
+  >>> from zope.configuration import xmlconfig
+  >>> from z3ext.layout.interfaces import IPagelet, IPageletType, IPageletContext
+
+  >>> import z3ext.layout
+  >>> context = xmlconfig.file('meta.zcml', z3ext.layout)
+
+We need also a custom pagelet class:
+
+  >>> from z3ext.layout.pagelet import BrowserPagelet
+  >>> class MyPagelet(BrowserPagelet):
+  ...     """Custom pagelet"""
+
+Register a pagelet within the directive with minimal attributes:
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       name="index.html"
+  ...       class="z3ext.layout.TESTS.MyPagelet"
+  ...       permission="zope.Public"
+  ...       />
+  ... </configure>
+  ... """, context)
+
+Let's get the pagelet
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> pagelet = component.queryMultiAdapter(
+  ...     (object(), TestRequest()), name='index.html')
+
+and check them:
+
+  >>> pagelet
+  <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.MyPagelet'> ...>
+
+  >>> pagelet.context
+  <object object at ...>
+
+Register the pagelet with a different name and more attributes provided from
+the directive. We also use a custom attribute called label here.
+Also we don't use BrowserPagelet as parent class, pagelet directive automaticly
+adds BrowserPagetlet to bases classes. Let's define some more components...
+
+  >>> class SecondPagelet(object):
+  ...     label = u''
+
+  >>> import zope.interface
+  >>> class IContent(zope.interface.Interface):
+  ...     """Content interface."""
+
+  >>> class Content(object):
+  ...     zope.interface.implements(IContent)
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       name="custom.html"
+  ...       class="z3ext.layout.TESTS.SecondPagelet"
+  ...       for="z3ext.layout.TESTS.IContent"
+  ...       permission="zope.Public"
+  ...       label="my Label" />
+  ... </configure>
+  ... """, context)
+
+Get the pagelet for the new content object
+
+  >>> import zope.component
+  >>> pagelet = zope.component.queryMultiAdapter((Content(), TestRequest()), 
+  ...     name='custom.html')
+
+and check them:
+
+  >>> pagelet
+  <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.SecondPagelet'> ...>
+
+  >>> pagelet.label
+  u'my Label'
+
+We also can provide another interface then the IPagelet within the directive.
+Such a interface must be inherited from IPagelet.
+
+  >>> class NewPagelet(BrowserPagelet):
+  ...     """New pagelet"""
+
+Now register the pagelet within a interface.
+
+  >>> class INewPagelet(interface.Interface):
+  ...     """New pagelet interface."""
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       name="new.html"
+  ...       class="z3ext.layout.TESTS.NewPagelet"
+  ...       provides="z3ext.layout.TESTS.INewPagelet" />
+  ... </configure>
+  ... """, context)
+
+And if we get the pagelet, we can see that the object provides the new 
+pagelet interface:
+
+  >>> pagelet = component.queryMultiAdapter((object(), TestRequest()), 
+  ...     name='new.html')
+  >>> pagelet
+  <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.NewPagelet'> ...>
+
+  >>> INewPagelet.providedBy(pagelet)
+  True
+
+If any of provides interfaces define schema field, newlly create class
+will have this attribute. Let' redefine INewPagelet interface
+
+  >>> class INewPagelet2(interface.Interface):
+  ...     """New pagelet interface."""
+  ...     
+  ...     number = schema.Int(
+  ...         title = u'Number',
+  ...         required = True)
+
+Because NewPagelet class doesn't have 'number' attribute and we don't
+supply it in directive we get exception.
+
+  >>> xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       name="new.html"
+  ...       class="z3ext.layout.TESTS.NewPagelet"
+  ...       provides="z3ext.layout.TESTS.INewPagelet2" />
+  ... </configure>
+  ... """, context)
+  Traceback (most recent call last):
+  ...
+  ZopeXMLConfigurationError: ...Required field is missing...number...
+
+Schema can provide default value
+
+  >>> class INewPagelet2(interface.Interface):
+  ...     """New pagelet interface."""
+  ...     
+  ...     number = schema.Int(
+  ...         title = u'Number',
+  ...         required = False,
+  ...         default = 9)
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       name="new.html"
+  ...       class="z3ext.layout.TESTS.NewPagelet"
+  ...       provides="z3ext.layout.TESTS.INewPagelet2" />
+  ... </configure>
+  ... """, context)
+
+  >>> pagelet = component.getMultiAdapter(
+  ...     (object(), TestRequest()), IPagelet, name='new.html')
+  >>> print pagelet.number
+  9
+
+Let's provide 'number' in directive
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       name="new1.html"
+  ...       class="z3ext.layout.TESTS.NewPagelet"
+  ...       provides="z3ext.layout.TESTS.INewPagelet2"
+  ...       number="10" />
+  ... </configure>
+  ... """, context)
+
+  >>> pagelet = component.getMultiAdapter(
+  ...     (object(), TestRequest()), IPagelet, name='new1.html')
+  >>> print pagelet.number, ':', type(pagelet.number)
+  10 : <type 'int'>
+
+Value should be in right format
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       name="new1.html"
+  ...       class="z3ext.layout.TESTS.NewPagelet"
+  ...       provides="z3ext.layout.TESTS.INewPagelet2"
+  ...       number="xxxxx" />
+  ... </configure>
+  ... """, context)
+  Traceback (most recent call last):
+  ...
+  ZopeXMLConfigurationError: ...invalid literal for int()...
+
+Schema field should implement IFromUnicode 
+
+  >>> class INewPagelet3(interface.Interface):
+  ...     
+  ...     date = schema.Date(
+  ...         title = u'Date',
+  ...         required = False)
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       name="new.html"
+  ...       class="z3ext.layout.TESTS.NewPagelet"
+  ...       date="2007-10-10"
+  ...       provides="z3ext.layout.TESTS.INewPagelet3" />
+  ... </configure>
+  ... """, context)
+  Traceback (most recent call last):
+  ...
+  ZopeXMLConfigurationError:...ConfigurationError: ("Can't convert value", 'date')
+
+If pagelet is typed, type schema also checked
+
+  >>> from zope.component.interface import provideInterface
+  >>> provideInterface('newPagelet3', INewPagelet3, IPageletType)
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       name="new.html"
+  ...       class="z3ext.layout.TESTS.NewPagelet"
+  ...       date="2007-10-10"
+  ...       type="newPagelet3" />
+  ... </configure>
+  ... """, context)
+  Traceback (most recent call last):
+  ...
+  ZopeXMLConfigurationError:...ConfigurationError: ("Can't convert value", 'date')
+
+
+We can create pagelet without specific class
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       name="noclass.html" />
+  ... </configure>
+  ... """, context) 
+
+  >>> pagelet = component.queryMultiAdapter(
+  ...     (object(), TestRequest()), name='noclass.html')
+  >>> pagelet
+  <z3ext.layout.zcml.PageletClass from None ...>
+
+
+We can create pagelet with template:
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       name="unknown.html"
+  ...       template="unknown.pt" />
+  ... </configure>
+  ... """, context)
+  Traceback (most recent call last):
+  ...
+  ZopeXMLConfigurationError: File "<string>", line 3.2-6.30
+  ConfigurationError: ('No such file', '...unknown.pt')
+
+  >>> temp_dir = tempfile.mkdtemp()
+  >>> template = os.path.join(temp_dir, 'pagelet.pt')
+  >>> open(template, 'w').write('''<div>My pagelet</div>''')
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       name="template.html"
+  ...       template="%s"
+  ...       permission="zope.Public" />
+  ... </configure>
+  ... """%template, context)
+
+  >>> pagelet = component.queryMultiAdapter((object(), TestRequest()), 
+  ...     name='template.html')
+  >>> pagelet
+  <z3ext.layout.zcml.PageletClass from None ...>
+
+  >>> pagelet.template
+  <BoundPageTemplateFile of <z3ext.layout.zcml.PageletClass from None ...>>
+
+We can create pagelet with additional context
+
+  >>> class IContext2(interface.Interface):
+  ...     """ additional context """
+
+  >>> class Context2(object):
+  ...     interface.implements(IContext2)
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       name="index.html"
+  ...       for="* z3ext.layout.TESTS.IContext2" />
+  ... </configure>
+  ... """, context) 
+
+  >>> context2 = Context2()
+
+  >>> c2Pagelet = component.queryMultiAdapter(
+  ...     (object(), context2, TestRequest()), name='index.html')
+  >>> c2Pagelet
+  <z3ext.layout.zcml.PageletClass from None ...>
+
+  >>> c2Pagelet.contexts
+  (<z3ext.layout.TESTS.Context2 ...>,)
+
+
+Pagelet rendering
+
+  >>> print pagelet.render()
+  <div>My pagelet</div>
+
+We should use page template as template for pagelet or we should
+provide IPagelet adapter for pagelet
+
+  >>> pagelet = component.queryMultiAdapter((object(), TestRequest()), 
+  ...     name='noclass.html')
+  >>> pagelet.render()
+  Traceback (most recent call last):
+  ...
+  LookupError: Can't find IPagelet for this pagelet.
+
+  >>> try:
+  ...     tmp = __file__
+  ... except NameError:
+  ...     from z3ext.layout import tests
+  ...     __file__ = tests.__file__
+
+  >>> pageletClass = pagelet.__class__
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pageletType name="pagelet"
+  ...       interface="z3ext.layout.interfaces.IPagelet" />
+  ...   <z3ext:pagelet
+  ...       type="pagelet"
+  ...       for="z3ext.layout.TESTS.pageletClass"
+  ...       template="%s"
+  ...       permission="zope.Public" />
+  ... </configure>
+  ... """%template, context)
+
+  >>> print pagelet()
+  <div>My pagelet</div>
+
+We can redirect during pagelet rendering, in this case render method
+doesn't call.
+
+  >>> pagelet = component.queryMultiAdapter((object(), TestRequest()), 
+  ...     name='noclass.html')
+  >>> pagelet.redirect('/')
+  >>> pagelet.isRedirected
+  True
+  >>> pagelet()
+  u''
+
+We can get default pagelet view for content. First register default view
+
+  >>> try:
+  ...     from zope.component.interfaces import IDefaultViewName
+  ... except:
+  ...     from zope.publisher.interfaces import IDefaultViewName
+  >>> component.getSiteManager().registerAdapter(
+  ...     'index.html', (interface.Interface, interface.Interface),
+  ...     IDefaultViewName)
+
+  >>> view = component.getMultiAdapter(
+  ...     (object(), TestRequest()), z3ext.layout.interfaces.IPagelet)
+
+  >>> view
+  <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.MyPagelet'> ...>
+
+  >>> view.__name__
+  u'index.html'
+
+
+Pagelte Type
+
+pagelet type can't be IPublishTraverse
+
+  >>> from zope.publisher.interfaces import IPublishTraverse
+
+  >>> class IMyPageletType(IPublishTraverse):
+  ...     pass
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pageletType name="pagelet"
+  ...       interface="z3ext.layout.TESTS.IMyPageletType" />
+  ... </configure>""", context)
+  Traceback (most recent call last):
+  ...
+  ZopeXMLConfigurationError:...ConfigurationError: Can't use IPublishTraverse as base for pagelet type
+
+
+Typed pagelets
+
+  >>> class IMyPagelet2(interface.Interface):
+  ...     pass
+
+  >>> class IMyPagelet3(interface.Interface):
+  ...     pass
+
+  >>> from z3ext.layout.tests import ITestPagelet
+
+We need register types
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pageletType name="myPagelet1"
+  ...       interface="z3ext.layout.tests.ITestPagelet" />
+  ...   <z3ext:pageletType name="myPagelet2"
+  ...       interface="z3ext.layout.TESTS.IMyPagelet2" />
+  ...   <z3ext:pageletType name="myPagelet3"
+  ...       interface="z3ext.layout.TESTS.IMyPagelet3" />
+  ... </configure>""", context)
+
+  >>> template2 = os.path.join(temp_dir, 'pagelet2.pt')
+  >>> open(template2, 'w').write('''<div>My pagelet2</div>''')
+
+  >>> template3 = os.path.join(temp_dir, 'pagelet3.pt')
+  >>> open(template3, 'w').write('''<div>My pagelet3</div>''')
+
+  >>> template4 = os.path.join(temp_dir, 'pagelet4.pt')
+  >>> open(template4, 'w').write('''<div>My pagelet - default</div>''')
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       template="%s"
+  ...       type="myPagelet1"
+  ...       permission="zope.Public" />
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       template="%s"
+  ...       type="myPagelet2"
+  ...       permission="zope.Public" />
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       template="%s"
+  ...       type="myPagelet3"
+  ...       permission="zope.Public" />
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       template="%s"
+  ...       type="pagelet"
+  ...       permission="zope.Public" />
+  ... </configure>
+  ... """%(template, template2, template3, template4), context)
+
+  >>> pagelet = component.queryMultiAdapter(
+  ...     (object(), TestRequest()), ITestPagelet)
+  
+  >>> ITestPagelet.providedBy(pagelet)
+  True
+  >>> print pagelet.render()
+  <div>My pagelet</div>
+
+  >>> request = TestRequest()
+  >>> pagelet = component.queryMultiAdapter((object(), request), IMyPagelet2)
+  >>> IMyPagelet2.providedBy(pagelet)
+  True
+  >>> print pagelet.render()
+  <div>My pagelet2</div>
+
+
+Access typed pagelet from view
+
+  >>> pagelet = component.getMultiAdapter((object(), request), name='pagelet')
+
+  >>> print pagelet.publishTraverse(
+  ...     request, 'test.unknown')
+  Traceback (most recent call last):
+  ...
+  NotFound: Object: ..., name: 'test.unknown'
+
+  >>> pagelet.browserDefault(request)
+  (..., ('',))
+
+by default IPagelet
+
+  >>> print pagelet()
+  <div>My pagelet - default</div>
+
+  >>> print pagelet.publishTraverse(request, '')
+  <div>My pagelet - default</div>
+
+  >>> print pagelet.publishTraverse(
+  ...     request, 'z3ext.layout.tests.ITestPagelet')
+  <div>My pagelet</div>
+
+We can register our marker interface as named utility and use name
+instead of full module path
+
+  >>> component.provideUtility(
+  ...     ITestPagelet, z3ext.layout.interfaces.IPageletType, name='testPageletType')
+  >>> interface.alsoProvides(ITestPagelet, z3ext.layout.interfaces.IPageletType)
+
+  >>> print pagelet.publishTraverse(request, 'testPageletType')
+  <div>My pagelet</div>
+
+We can provide additional context for pagelet
+
+  >>> def getContexts(content):
+  ...     return Content()
+
+  >>> component.provideAdapter(
+  ...     getContexts, (IContent,), IPageletContext, name='myPagelet4')
+
+  >>> class IMyPagelet4(interface.Interface):
+  ...     pass
+
+  >>> provideInterface('myPagelet4', IMyPagelet4, IPageletType)
+
+  >>> template4 = os.path.join(temp_dir, 'pagelet4.pt')
+  >>> open(template4, 'w').write('''<div>My pagelet4</div>''')
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="* z3ext.layout.TESTS.IContent"
+  ...       template="%s"
+  ...       type="myPagelet4"
+  ...       permission="zope.Public" />
+  ... </configure>"""%template4, context)
+
+  >>> pagelet = component.getMultiAdapter((Content(), request), name='pagelet')
+  >>> print pagelet.publishTraverse(request, 'myPagelet4')
+  <div>My pagelet4</div>
+
+Or multiple contexts
+
+  >>> def getContexts2(content):
+  ...     return (Content(), Content())
+
+  >>> component.provideAdapter(
+  ...     getContexts2, (IContent,), IPageletContext, name='myPagelet5')
+
+  >>> class IMyPagelet5(interface.Interface):
+  ...     pass
+
+  >>> provideInterface('myPagelet5', IMyPagelet5, IPageletType)
+
+  >>> template5 = os.path.join(temp_dir, 'pagelet5.pt')
+  >>> open(template5, 'w').write('''<div>My pagelet5</div>''')
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="* z3ext.layout.TESTS.IContent z3ext.layout.TESTS.IContent"
+  ...       template="%s"
+  ...       type="myPagelet5"
+  ...       permission="zope.Public" />
+  ... </configure>"""%template5, context)
+
+  >>> pagelet = component.getMultiAdapter((Content(), request), name='pagelet')
+  >>> print pagelet.publishTraverse(request, 'myPagelet5')
+  <div>My pagelet5</div>
+
+
+We can't register nameless pagelet, we can register only typed pagelet
+without name
+
+  >>> class IWrongPageletInterface(IPagelet):
+  ...     pass
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       template="%s"
+  ...       permission="zope.Public" />
+  ... </configure>
+  ... """%template, context)
+  Traceback (most recent call last):
+  ...
+  ZopeXMLConfigurationError:...
+      ConfigurationError: Can't create pagelet without name.
+
+If we still need nameless adapter we can use IPagelet interface
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       type="pagelet"
+  ...       for="z3ext.layout.TESTS.IContent"
+  ...       template="%s"
+  ...       permission="zope.Public" />
+  ... </configure>
+  ... """%template, context)
+
+
+We can register typed pagelet with name
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       name="test.html"
+  ...       for="z3ext.layout.TESTS.IContent"
+  ...       template="%s"
+  ...       type="myPagelet1"
+  ...       permission="zope.Public" />
+  ... </configure>
+  ... """%template, context)
+
+  >>> content = Content()
+  >>> pagelet = component.getMultiAdapter(
+  ...     (content, request), ITestPagelet, name='test.html')
+
+Pagelets with errors
+
+  >>> class PageletWithError(object):
+  ...     def render(self):
+  ...         raise Exception('Error')
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="z3ext.layout.TESTS.IContent"
+  ...       class="z3ext.layout.TESTS.PageletWithError"
+  ...       type="myPagelet2" />
+  ... </configure>
+  ... """, context)
+
+  >>> pagelet = component.getMultiAdapter((content, request), name='pagelet')
+  >>> pagelet.publishTraverse(request, 'myPagelet2')
+  Traceback (most recent call last):
+  ...
+  NotFound: ...
+
+  >>> pagelet('myPagelet2')
+  u''
+
+  >>> pagelet['myPagelet2']
+  Traceback (most recent call last):
+  ...
+  KeyError: 'myPagelet2'
+
+
+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 pagelet - default</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">
+      </div>
+      <div class="main">
+        Content here
+      </div>
+    </body>
+  </html>
+
+
+Pagelets with errors
+
+  >>> class PageletWithError(object):
+  ...     def render(self):
+  ...         raise Exception('Error')
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="z3ext.layout.TESTS.IContent"
+  ...       class="z3ext.layout.TESTS.PageletWithError"
+  ...       type="myPagelet2" />
+  ... </configure>
+  ... """, context)
+
+  >>> open(templateFileName, 'w').write('''
+  ... <html>
+  ...   <body>
+  ...     <h1>My Web Page</h1>
+  ...     <div class="left-column">
+  ...       <tal:block replace="structure pagelet:myPagelet2" />
+  ...     </div>
+  ...     <div class="main">
+  ...       Content here
+  ...     </div>
+  ...   </body>
+  ... </html>
+  ... ''')
+
+  >>> FrontPage = SimpleViewClass(templateFileName, name='error.html')
+  >>> component.provideAdapter(
+  ...     FrontPage,
+  ...     (IContent, interface.Interface), interface.Interface,
+  ...     name='error.html')
+
+  >>> view = component.getMultiAdapter((Content(), request), name='error.html')
+  >>> print view()
+    <html>
+      <body>
+        <h1>My Web Page</h1>
+        <div class="left-column">
+        </div>
+        <div class="main">
+          Content here
+        </div>
+      </body>
+    </html>
+
+Pagelet with extra context
+
+  >>> open(templateFileName, 'w').write('''
+  ... <html>
+  ...   <body>
+  ...     <h1>My Web Page</h1>
+  ...     <div class="left-column">
+  ...       <tal:block replace="structure pagelet:myPagelet4" />
+  ...     </div>
+  ...     <div class="main">
+  ...       Content here
+  ...     </div>
+  ...   </body>
+  ... </html>
+  ... ''')
+
+  >>> FrontPage = SimpleViewClass(templateFileName, name='extra4.html')
+  >>> component.provideAdapter(
+  ...     FrontPage,
+  ...     (IContent, interface.Interface), interface.Interface,
+  ...     name='extra4.html')
+
+  >>> view = component.getMultiAdapter((Content(), request), name='extra4.html')
+  >>> print view()
+  <html>
+    <body>
+      <h1>My Web Page</h1>
+      <div class="left-column">
+        <div>My pagelet4</div>
+      </div>
+      <div class="main">
+        Content here
+      </div>
+    </body>
+  </html>
+
+
+Pagelet with extra context
+
+  >>> open(templateFileName, 'w').write('''
+  ... <html>
+  ...   <body>
+  ...     <h1>My Web Page</h1>
+  ...     <div class="left-column">
+  ...       <tal:block replace="structure pagelet:myPagelet5" />
+  ...     </div>
+  ...     <div class="main">
+  ...       Content here
+  ...     </div>
+  ...   </body>
+  ... </html>
+  ... ''')
+
+  >>> FrontPage = SimpleViewClass(templateFileName, name='extra5.html')
+  >>> component.provideAdapter(
+  ...     FrontPage,
+  ...     (IContent, interface.Interface), interface.Interface,
+  ...     name='extra5.html')
+
+  >>> view = component.getMultiAdapter((Content(), request), name='extra5.html')
+  >>> print view()
+  <html>
+    <body>
+      <h1>My Web Page</h1>
+      <div class="left-column">
+        <div>My pagelet5</div>
+      </div>
+      <div class="main">
+        Content here
+      </div>
+    </body>
+  </html>



More information about the Checkins mailing list