[Checkins] SVN: z3c.layout/trunk/src/z3c/layout/ Introduced
IContentProviderFactory interface to add an extension point
on which context to use when looking up content providers.
Malthe Borch
mborch at gmail.com
Sun Aug 3 22:12:19 EDT 2008
Log message for revision 89337:
Introduced IContentProviderFactory interface to add an extension point on which context to use when looking up content providers.
Changed:
U z3c.layout/trunk/src/z3c/layout/README.txt
U z3c.layout/trunk/src/z3c/layout/browser/layout.py
U z3c.layout/trunk/src/z3c/layout/interfaces.py
-=-
Modified: z3c.layout/trunk/src/z3c/layout/README.txt
===================================================================
--- z3c.layout/trunk/src/z3c/layout/README.txt 2008-08-04 01:45:07 UTC (rev 89336)
+++ z3c.layout/trunk/src/z3c/layout/README.txt 2008-08-04 02:12:18 UTC (rev 89337)
@@ -49,25 +49,34 @@
>>> layout.regions.add(title)
>>> layout.regions.add(content)
+Let's define a context class.
+
+ >>> class MockContext(object):
+ ... interface.implements(interface.Interface)
+
We need to provide a general adapter that can provide content
-providers for regions that do not specify them directly.
+providers for regions that do not specify them directly. As an
+example, we'll define an adapter that simply tries to lookup a content
+provider with the same name as the region.
- >>> from z3c.layout.interfaces import IRegion
- >>> from zope.contentprovider.interfaces import IContentProvider
- >>> from zope.publisher.interfaces.browser import IBrowserRequest
- >>> from zope.publisher.interfaces.browser import IBrowserView
+ >>> from z3c.layout.interfaces import IContentProviderFactory
-As an example, we'll define an adapter that simply tries to lookup a
-content provider with the same name as the region.
-
- >>> @interface.implementer(IContentProvider)
- ... @component.adapter(IRegion, IBrowserRequest, IBrowserView)
- ... def getEponymousContentProvider(region, request, view):
- ... return component.getMultiAdapter(
- ... (region, request, view), IContentProvider, region.name)
+ >>> class EponymousContentProviderFactory(object):
+ ... interface.implements(IContentProviderFactory)
+ ...
+ ... def __init__(self, region):
+ ... self.region = region
+ ...
+ ... def __call__(self, context, request, view):
+ ... name = self.region.name
+ ... return component.getMultiAdapter(
+ ... (view.context, request, view), IContentProvider, name)
- >>> component.provideAdapter(getEponymousContentProvider)
+ >>> from z3c.layout.interfaces import IRegion
+ >>> component.provideAdapter(
+ ... EponymousContentProviderFactory, (IRegion,))
+
Rendering
---------
@@ -92,21 +101,21 @@
...
... def __repr__(self):
... return "<MockContentProvider '%s'>" % self.__name__
+
+ >>> from zope.publisher.interfaces.browser import IBrowserRequest
+ >>> from zope.publisher.interfaces.browser import IBrowserView
>>> component.provideAdapter(
- ... MockContentProvider, (IRegion, IBrowserRequest, IBrowserView),
+ ... MockContentProvider, (MockContext, IBrowserRequest, IBrowserView),
... name="title")
>>> component.provideAdapter(
- ... MockContentProvider, (IRegion, IBrowserRequest, IBrowserView),
+ ... MockContentProvider, (MockContext, IBrowserRequest, IBrowserView),
... name="content")
Let's instantiate the layout browser-view. We must define a context
and set up a request.
- >>> class MockContext(object):
- ... interface.implements(interface.Interface)
-
>>> from zope.publisher.browser import TestRequest
>>> context = MockContext()
Modified: z3c.layout/trunk/src/z3c/layout/browser/layout.py
===================================================================
--- z3c.layout/trunk/src/z3c/layout/browser/layout.py 2008-08-04 01:45:07 UTC (rev 89336)
+++ z3c.layout/trunk/src/z3c/layout/browser/layout.py 2008-08-04 02:12:18 UTC (rev 89337)
@@ -30,9 +30,6 @@
return lxml.html.tostring(tree, pretty_print=True).rstrip('\n')
- def get_context(self, region):
- return region
-
def _insert_provider(self, tree, region, provider):
# render and wrap provided content
html = provider.render()
@@ -45,16 +42,16 @@
"""Lookup content provider for region."""
name = region.provider
- context = self.get_context(region)
+ factory = interfaces.IContentProviderFactory(region, None)
+ if factory is not None:
+ return factory(self.context, self.request, self)
+
if name is not None:
- provider = component.queryMultiAdapter(
- (context, self.request, self), IContentProvider, name=name)
- else:
- provider = component.queryMultiAdapter(
- (context, self.request, self), IContentProvider)
+ return component.queryMultiAdapter(
+ (self.context, self.request, self), IContentProvider, name=name)
- return provider
+ return None
@memoize
def _get_region_provider_mapping(self):
Modified: z3c.layout/trunk/src/z3c/layout/interfaces.py
===================================================================
--- z3c.layout/trunk/src/z3c/layout/interfaces.py 2008-08-04 01:45:07 UTC (rev 89336)
+++ z3c.layout/trunk/src/z3c/layout/interfaces.py 2008-08-04 02:12:18 UTC (rev 89337)
@@ -44,3 +44,7 @@
def parse():
"""Parse template using lxml's HTML parser class. Transforms
are applied before the tree is returned."""
+
+class IContentProviderFactory(Interface):
+ def __call__(context, request, view):
+ """Return content provider."""
More information about the Checkins
mailing list