[Checkins] SVN: z3ext.layout/tags/1.5.9/ release tag
Nikolay Kim
fafhrd at datacom.kz
Mon Nov 24 04:07:51 EST 2008
Log message for revision 93289:
release tag
Changed:
A z3ext.layout/tags/1.5.9/
D z3ext.layout/tags/1.5.9/CHANGES.txt
A z3ext.layout/tags/1.5.9/CHANGES.txt
U z3ext.layout/tags/1.5.9/setup.py
D z3ext.layout/tags/1.5.9/src/z3ext/layout/pagelet.txt
A z3ext.layout/tags/1.5.9/src/z3ext/layout/pagelet.txt
-=-
Deleted: z3ext.layout/tags/1.5.9/CHANGES.txt
===================================================================
--- z3ext.layout/trunk/CHANGES.txt 2008-11-23 22:08:40 UTC (rev 93287)
+++ z3ext.layout/tags/1.5.9/CHANGES.txt 2008-11-24 09:07:51 UTC (rev 93289)
@@ -1,172 +0,0 @@
-=======
-CHANGES
-=======
-
-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/1.5.9/CHANGES.txt (from rev 93288, z3ext.layout/trunk/CHANGES.txt)
===================================================================
--- z3ext.layout/tags/1.5.9/CHANGES.txt (rev 0)
+++ z3ext.layout/tags/1.5.9/CHANGES.txt 2008-11-24 09:07:51 UTC (rev 93289)
@@ -0,0 +1,178 @@
+=======
+CHANGES
+=======
+
+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/1.5.9/setup.py
===================================================================
--- z3ext.layout/trunk/setup.py 2008-11-23 22:08:40 UTC (rev 93287)
+++ z3ext.layout/tags/1.5.9/setup.py 2008-11-24 09:07:51 UTC (rev 93289)
@@ -21,7 +21,7 @@
def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
-version='1.5.9dev'
+version='1.5.9'
setup(name='z3ext.layout',
Deleted: z3ext.layout/tags/1.5.9/src/z3ext/layout/pagelet.txt
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/pagelet.txt 2008-11-23 22:08:40 UTC (rev 93287)
+++ z3ext.layout/tags/1.5.9/src/z3ext/layout/pagelet.txt 2008-11-24 09:07:51 UTC (rev 93289)
@@ -1,523 +0,0 @@
-=================
-Pagelet directive
-=================
-
-Show how we can use the pagelet directive. Register the meta configuration for
-the directive.
-
- >>> import os, tempfile
- >>> from zope import interface, component
- >>> from zope.configuration import xmlconfig
- >>> from z3ext.layout.interfaces import IPagelet
- >>> 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
- ... 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
- ... name="new.html"
- ... class="z3ext.layout.TESTS.NewPagelet"
- ... permission="zope.Public"
- ... 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
-
-We can create pagelet without specific class
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... name="noclass.html"
- ... permission="zope.Public" />
- ... </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
- ... name="unknown.html"
- ... template="unknown.pt"
- ... permission="zope.Public" />
- ... </configure>
- ... """, context)
- Traceback (most recent call last):
- ...
- ZopeXMLConfigurationError: File "<string>", line 3.2-6.33
- 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
- ... 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 ...>>
-
-Pagelet rendering
-
- >>> print pagelet.render()
- <div>My pagelet</div>
-
-We should use page template as template for pagelet or we should
-provide IPageTemplate adapter for pagelet
-
- >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
- ... name='noclass.html')
- >>> pagelet.render()
- Traceback (most recent call last):
- ...
- LookupError: Can't find IPageTemplate for pagelet.
-
- >>> from zope.pagetemplate.interfaces import IPageTemplate
- >>> from zope.app.pagetemplate import ViewPageTemplateFile
- >>> pt = ViewPageTemplateFile(template)
- >>> def getPT(context, request):
- ... return pt
- >>> component.getSiteManager().registerAdapter(
- ... getPT, (pagelet.__class__, interface.Interface), IPageTemplate, '')
-
- >>> 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'
-
-
-Pagelet without name
-
- >>> class IMyPagelet1(interface.Interface):
- ... pass
-
- >>> class IMyPagelet2(interface.Interface):
- ... pass
-
- >>> template2 = os.path.join(temp_dir, 'pagelet2.pt')
- >>> open(template2, 'w').write('''<div>My pagelet2</div>''')
-
- >>> from z3ext.layout.tests import ITestPagelet
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... template="%s"
- ... provides="z3ext.layout.tests.ITestPagelet"
- ... permission="zope.Public" />
- ... <z3ext:pagelet
- ... template="%s"
- ... provides="z3ext.layout.TESTS.IMyPagelet2"
- ... permission="zope.Public" />
- ... <z3ext:pagelet
- ... template="%s"
- ... permission="zope.Public" />
- ... </configure>
- ... """%(template, template2, template2), 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 nameless 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 pagelet2</div>
-
- >>> print pagelet.publishTraverse(request, '')
- <div>My pagelet2</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 register nameless pagelet only if provided interface is not
-inherited from IBrowserPublisher, because we can override
-IBrowserPublisher for content.
-
- >>> class IWrongPageletInterface(IPagelet):
- ... pass
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... template="%s"
- ... provides="z3ext.layout.TESTS.IWrongPageletInterface"
- ... permission="zope.Public" />
- ... </configure>
- ... """%template, context)
- Traceback (most recent call last):
- ...
- ZopeXMLConfigurationError:...
- ConfigurationError: You can't register nameless pagelet...
-
-If we still need nameless adapter we can use IPagelet interface
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... for="z3ext.layout.TESTS.IContent"
- ... template="%s"
- ... provides="z3ext.layout.interfaces.IPagelet"
- ... permission="zope.Public" />
- ... </configure>
- ... """%template, context)
-
-
-If we register named pagelet and provided interface provides IPageletType,
-also nameless adapter registered
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... name="test.html"
- ... for="z3ext.layout.TESTS.IContent"
- ... template="%s"
- ... provides="z3ext.layout.TESTS.ITestPagelet"
- ... permission="zope.Public" />
- ... </configure>
- ... """%template, context)
-
- >>> content = Content()
- >>> pagelet1 = component.getMultiAdapter((content, request), name='test.html')
- >>> pagelet2 = component.getMultiAdapter((content, request), ITestPagelet)
-
- >>> pagelet1.__class__ is pagelet2.__class__
- True
-
-
-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>
Copied: z3ext.layout/tags/1.5.9/src/z3ext/layout/pagelet.txt (from rev 93288, z3ext.layout/trunk/src/z3ext/layout/pagelet.txt)
===================================================================
--- z3ext.layout/tags/1.5.9/src/z3ext/layout/pagelet.txt (rev 0)
+++ z3ext.layout/tags/1.5.9/src/z3ext/layout/pagelet.txt 2008-11-24 09:07:51 UTC (rev 93289)
@@ -0,0 +1,530 @@
+=================
+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
+ >>> from zope.configuration import xmlconfig
+ >>> from z3ext.layout.interfaces import IPagelet
+
+ >>> 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
+ ... 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
+ ... name="new.html"
+ ... class="z3ext.layout.TESTS.NewPagelet"
+ ... permission="zope.Public"
+ ... 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
+
+We can create pagelet without specific class
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... name="noclass.html"
+ ... permission="zope.Public" />
+ ... </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
+ ... name="unknown.html"
+ ... template="unknown.pt"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """, context)
+ Traceback (most recent call last):
+ ...
+ ZopeXMLConfigurationError: File "<string>", line 3.2-6.33
+ 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
+ ... 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 ...>>
+
+Pagelet rendering
+
+ >>> print pagelet.render()
+ <div>My pagelet</div>
+
+We should use page template as template for pagelet or we should
+provide IPageTemplate adapter for pagelet
+
+ >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
+ ... name='noclass.html')
+ >>> pagelet.render()
+ Traceback (most recent call last):
+ ...
+ LookupError: Can't find IPageTemplate for pagelet.
+
+ >>> try:
+ ... __file__
+ ... except NameError:
+ ... from z3ext.layout import tests
+ ... __file__ = tests.__file__
+
+ >>> from zope.pagetemplate.interfaces import IPageTemplate
+ >>> from zope.app.pagetemplate import ViewPageTemplateFile
+ >>> pt = ViewPageTemplateFile(template)
+ >>> def getPT(context, request):
+ ... return pt
+ >>> component.getSiteManager().registerAdapter(
+ ... getPT, (pagelet.__class__, interface.Interface), IPageTemplate, '')
+
+ >>> 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'
+
+
+Pagelet without name
+
+ >>> class IMyPagelet1(interface.Interface):
+ ... pass
+
+ >>> class IMyPagelet2(interface.Interface):
+ ... pass
+
+ >>> template2 = os.path.join(temp_dir, 'pagelet2.pt')
+ >>> open(template2, 'w').write('''<div>My pagelet2</div>''')
+
+ >>> from z3ext.layout.tests import ITestPagelet
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... template="%s"
+ ... provides="z3ext.layout.tests.ITestPagelet"
+ ... permission="zope.Public" />
+ ... <z3ext:pagelet
+ ... template="%s"
+ ... provides="z3ext.layout.TESTS.IMyPagelet2"
+ ... permission="zope.Public" />
+ ... <z3ext:pagelet
+ ... template="%s"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """%(template, template2, template2), 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 nameless 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 pagelet2</div>
+
+ >>> print pagelet.publishTraverse(request, '')
+ <div>My pagelet2</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 register nameless pagelet only if provided interface is not
+inherited from IBrowserPublisher, because we can override
+IBrowserPublisher for content.
+
+ >>> class IWrongPageletInterface(IPagelet):
+ ... pass
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... template="%s"
+ ... provides="z3ext.layout.TESTS.IWrongPageletInterface"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """%template, context)
+ Traceback (most recent call last):
+ ...
+ ZopeXMLConfigurationError:...
+ ConfigurationError: You can't register nameless pagelet...
+
+If we still need nameless adapter we can use IPagelet interface
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... for="z3ext.layout.TESTS.IContent"
+ ... template="%s"
+ ... provides="z3ext.layout.interfaces.IPagelet"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """%template, context)
+
+
+If we register named pagelet and provided interface provides IPageletType,
+also nameless adapter registered
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... name="test.html"
+ ... for="z3ext.layout.TESTS.IContent"
+ ... template="%s"
+ ... provides="z3ext.layout.TESTS.ITestPagelet"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """%template, context)
+
+ >>> content = Content()
+ >>> pagelet1 = component.getMultiAdapter((content, request), name='test.html')
+ >>> pagelet2 = component.getMultiAdapter((content, request), ITestPagelet)
+
+ >>> pagelet1.__class__ is pagelet2.__class__
+ True
+
+
+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>
More information about the Checkins
mailing list