跳转到主要内容

Dolmen布局/视图选择器

项目描述

该包 dolmen.app.viewselectorDolmen 应用的扩展,允许基本管理替代视图。

关于

在CMS中,为单个项目设计并提供多个视图通常非常有用。这些视图可以根据特定的上下文和情况相关。 dolmen.app.viewselector 允许您将视图定义为渲染特定上下文的“替代”选项。然后,菜单为您提供选择最相关视图的机制。

快速概述

要知道一个组件可以提供替代视图,我们需要明确指定它。一个接口定义了“选择器”功能

>>> from dolmen.app.viewselector import IViewSelector
>>> list(IViewSelector)
['selected_view']

>>> IViewSelector['selected_view']
<...TextLine...>

IViewSelector接口定义了一个字段,称为“selected_view”。该字段的值仅仅是当前使用的页面组件的名称

>>> IViewSelector['selected_view'].default
u'base_view'

默认情况下,默认值设置为“base_view”。

定义内容

为了演示替代视图,我们首先需要一个知道视图选择的环境

>>> from zope.location import Location
>>> from zope.interface import implements

>>> class Bear(Location):
...  implements(IViewSelector)
...  selected_view = u"sleeping"

我们将默认视图定义为名为“sleeping”的视图。

定义替代视图

替代视图是注册到专用菜单的“pages”(参见 megrok.layoutdolmen.app.layout)。要定义替代视图,我们从 AlternativeView 基类继承

>>> import grokcore.view as grok
>>> from grokcore.component import testing
>>> from dolmen.app.viewselector import AlternativeView

>>> class Sleeping(AlternativeView):
...   grok.context(Bear)
...   grok.title("Sleeping bear")
...
...   def render(self):
...     return u"RRrrr..."

>>> testing.grok_component('sleeping', Sleeping)
True

我们定义的默认值"IViewSelector"的“睡眠”视图现在已经被定义并注册。让我们再注册两个视图,以填充菜单并提供一个“真实”的使用案例。

>>> class PolarFur(AlternativeView):
...   grok.context(Bear)
...   grok.title("Polar bear")
...
...   def render(self):
...     return u"I'm white !"

>>> testing.grok_component('polar', PolarFur)
True

>>> class SpringFur(AlternativeView):
...   grok.context(Bear)
...   grok.title("Spring bear")
...   grok.require("dolmen.content.Edit")
...
...   def render(self):
...     return u"I'm brown !"

>>> testing.grok_component('spring', SpringFur)
True

默认动态索引

为了渲染所选视图,我们使用另一个视图。我们可以称之为“路由”视图,因为它用于查找和渲染所需的组件。

我们首先需要实例化两个所需的组件,内容和请求

>>> from zope.publisher.browser import TestRequest

>>> herman = Bear()
>>> request = TestRequest()

内容提供IViewSelector接口,该接口的“路由”视图已注册

>>> IViewSelector.providedBy(herman)
True

根据惯例,“路由”视图称为“index”,可以作为一个基本视图进行查找

>>> from zope.component import getMultiAdapter
>>> index = getMultiAdapter((herman, request), name="index")
>>> index
<dolmen.app.viewselector.select.SelectedView...>

此视图渲染时,将查找并渲染名为< cite>selected_view属性的视图,该属性已为相同的内容和请求注册

>>> herman.selected_view
u'sleeping'

>>> index.render()
u'RRrrr...'

如果我们为< cite>selected_view属性设置不同的值,则查找的视图将相应更改

>>> herman.selected_view = u"polarfur"
>>> index.render()
u"I'm white !"

>>> herman.selected_view = u"springfur"
>>> index.render()
u"I'm brown !"

如果视图不存在,则返回一个基本消息

>>> herman.selected_view = u"nothing"
>>> index.render()
u'The selected view is not a valid IPage component.'

通过用户界面应用视图

所选视图可以从可用的替代视图列表中选择。此选择通过菜单进行,其中已注册视图。

应用

上面的菜单公开了为IViewSelector内容注册的视图“viewselector”。此视图是实际更改< cite>selected_view属性为点击值的组件。

让我们模拟一个点击以测试此视图。当前< cite>selected_view属性的值不一致

>>> herman.selected_view
u'nothing'

我们希望将其更改为现有内容,如< cite>PolarFur 视图

>>> request = TestRequest(form={'name': u'polarfur'})
>>> handler = getMultiAdapter((herman, request), name="viewselector")
>>> handler
<dolmen.app.viewselector.select.ApplyView ...>

以管理员用户登录,我们可以应用所选视图

>>> login('zope.mgr', request)
>>> handler()
'http://127.0.0.1/herman'

视图将您重定向到内容的基视图。值已更改

>>> herman.selected_view
u'polarfur'

更改

0.2.1 (2010-05-31)

  • 通过删除zip-safe标志修复了egg dist。

0.2 (2010-03-26)

  • 修复了缺失的MANIFEST。

0.1 (2010-03-25)

  • 初始发布。

由以下支持