基于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.doctestzope.testing.doctestunit
  • 去除了zpkg和zcml段塞。
  • 修复了自述文件中的rst格式。

1.0.0 (2007-09-21)

  • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何使用运行时从JAVA运行openssl命令?   不使用线程安全类(如AtomicInteger和SynchronizedList)的java ProducerConsumer问题   匹配字符串的java模式   在java中使用泛型接口作为返回类型   java将可能具有序列化JSON值的hashmap作为节点添加到JSON字符串中   Eclipse无法从Java8流推断正确的类型   java无法了解标准JButton的大小   java我能用一个循环优化这个函数吗(在第一种方法中)?   Apache CXF中基于WebSocket的java SOAP?   java想要运行奇偶和求和三步   矩阵上随机元素的java集值   java布尔相等:0==a,操作数顺序重要吗?   java Eclipse不会退出我的插件   java如何在spring的SOAP拦截器中获取HttpServletRequest和HttpServletResponse