基于zpt宏的viewlets。
z3c.macroviewlet的Python项目详细描述
宏视图是zope 3 ui组件。特别是他们允许开发者 指定基于宏而不是整个模板的Viewlet。
Macro Provider
这个包提供了一个zcml指令,允许您注册一个宏 在模板中定义为viewlet。这样一个基于宏的viewlet可以100%地 与其他Viewlet相同。如果你想写一个布局的话,它可能非常方便 一页模板中的模板,并将选定部分定义为不带 添加任何其他HTML。让我展示一下这将是什么样子:
布局/主模板可以如下所示:
<!DOCTYPE ...> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" i18n:domain="z3c"> <head> <tal:block replace="structure provider:ITitle"> <metal:block define-macro="title"> <title>The title</title> </metal:block> </tal:block> </head> <body tal:define="applicationURL request/getApplicationURL"> <div id="content"> <tal:block content="structure provider:pagelet">content</tal:block> </div> </div> </body> </html>
上面的template定义了一个ititle提供者,其中包含 对于自身的宏。必须在 zope.viewlet zcml指令,它提供ITITLE作为viewlet管理器。 之后,您可以将上面的模板注册为布局模板。 z3c:layout zcml指令如下:
<z3c:layout for="*" layer="z3c.skin.pagelet.IPageletBrowserSkin" template="template.pt" />
然后可以为ITitle Viewlet管理器注册宏Viewlet 像这样:
<z3c:macroViewlet for="*" template="template.pt" macro="title" manager="z3c.skin.pagelet.ITitle" layer="z3c.skin.pagelet.IPageletBrowserSkin" />
如您所见,上面的zcml配置指令使用title作为 宏属性,并使用ITitle作为Viewlet管理器。这将使用 模板的以下部分.pt:
<title>Pagelet skin</title>
并将其注册为viewlet。这个viewlet在ittle中呈现 供应商。如您所见,您可以使用一个完整的布局template并使用它 事实上。在这里,您可以提供一个包含的viewlet管理器 呈现可被其他上下文或视图覆盖的viewlet。 您还可以为ITitle Viewlet管理器注册多个Viewlet。 当然,这在我们的特殊标题标签示例中是没有意义的。
让我们在一些测试中演示一下。我们将首先创建一个内容对象 以后用作视图上下文:
>>> import zope.interface >>> import zope.component >>> from zope.publisher.interfaces.browser import IBrowserView >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer >>> class Content(object): ... zope.interface.implements(zope.interface.Interface) >>> content = Content()
我们还为稍后定义的示例模板创建了一个temp dir 用于测试:
>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp()
我们为macroviewlet类注册了一个安全检查程序:
>>> from zope.configuration.xmlconfig import XMLConfig >>> import zope.app.component >>> import z3c.macroviewlet >>> XMLConfig('meta.zcml', zope.app.component)() >>> XMLConfig('configure.zcml', z3c.macroviewlet)()
Layout template
我们定义了一个模板,包括宏定义和使用提供者:
>>> path = os.path.join(temp_dir, 'template.pt') >>> open(path, 'w').write(''' ... <html> ... <body> ... <head> ... <tal:block replace="structure provider:ITitle"> ... <metal:block define-macro="title"> ... <title>The title</title> ... </metal:block> ... </tal:block> ... </head> ... <body tal:define="applicationURL request/getApplicationURL"> ... content ... </body> ... </html> ... ''')
让我们使用视图模板注册一个视图类:
>>> import zope.interface >>> from zope.app.pagetemplate import viewpagetemplatefile >>> from zope.publisher.interfaces.browser import IBrowserView >>> class View(object): ... zope.interface.implements(IBrowserView) ... def __init__(self, context, request): ... self.context = context ... self.request = request ... def __call__(self): ... return viewpagetemplatefile.ViewPageTemplateFile(path)(self)
让我们准备视图:
>>> from zope.publisher.browser import TestRequest >>> request = TestRequest() >>> view = View(content, request)
让我们定义viewlet管理器ITitle:
>>> from zope.viewlet.interfaces import IViewletManager >>> from zope.viewlet.manager import ViewletManager >>> class ITitle(IViewletManager): ... """Viewlet manager located in the title tag.""" >>> title = ViewletManager('title', ITitle)
让我们注册viewlet管理器:
>>> from zope.viewlet.interfaces import IViewletManager >>> manager = zope.component.provideAdapter( ... title, ... (zope.interface.Interface, TestRequest, IBrowserView), ... IViewletManager, ... name='ITitle')
MacroViewlet
在注册宏viewlet之前,我们检查呈现的页面 注册的宏viewlet:
>>> print view() <html> <body> <head> </head> <body> content </body> </body></html>
如您所见,没有呈现标题。现在我们可以定义宏 viewlet…:
>>> from zope.app.pagetemplate import viewpagetemplatefile >>> from z3c.macroviewlet import zcml >>> macroViewlet = zcml.MacroViewletFactory(path, 'title', 'text/html')
并将它们注册为适配器:
>>> from zope.viewlet.interfaces import IViewlet >>> zope.component.provideAdapter( ... macroViewlet, ... (zope.interface.Interface, IDefaultBrowserLayer, IBrowserView, ... ITitle), ... IViewlet, ... name='title')
现在我们准备再次测试:
>>> print view() <html> <body> <head> <title>The title</title> </head> <body> content </body> </body></html>
如您所见,标题将作为viewlet呈现到ititle提供程序中。
Cleanup
>>> import shutil >>> shutil.rmtree(temp_dir)
Changes
1.1.0 (2010-07-14)
- 修复了使用当前包版本运行的测试 (metaconfigure.registerType已从^{tt4}移动$ 到zope.browserpage)。因此现在需要zope.browserpage。
- 不再使用已弃用的zope.testing.doctest和 zope.testing.doctestunit。
- 去除了zpkg和zcml段塞。
- 修复了自述文件中的rst格式。