Dexterity开发手册:第五章 定制视图

Dexterity开发手册:第五章 定制视图
定制视图
定制简单视图和显示表单
5.1.简单的视图
5.2.显示表单

5.1简单的视图
创建基本视图
到目前为止,我们一直都在使用默认的视图类型,就像添加和编辑表单使用编辑控件都是来自z3c.from显示表单,这些默认视图是实用的,但不是非常有吸引力.大多数视图类型需要一个或多个自定义视图模板.

在plone里,Dexterity类型与其他的内容类型没有什么不同.你可以给视图模型建一个视图,并且可以设置视图的类型.如果你创建视图命名为view,至少在视图使用FTI的标准配置时,它将会使用默认视图.这是因为FTI的default_view属性设置为view,而且viewview_methods列表中。

当dexterity工作时,我们将用five.grok配置系统来配置视图,避开ZCML配置.下面,我们将讲解和演示如何给Program and Speaker添加简单的视图类型.如果需要的话,接下来,我们将演示一下如果利用标准控件来显示表单.

five.grok视图方法调用内容类型的模块的一个类,自动关联模板目录中的模板。模板目录与模块文件创建在同一目录中,所以在目录下会有program_templates,presenter_templates和session_templates等模板文件。

在program.py,注册视图如下:
class View(grok.View): grok.context(IProgram) grok.require('zope2.View') def sessions(self): """Return a catalog search result of sessions to show """ context = aq_inner(self.context) catalog = getToolByName(context, 'portal_catalog') return catalog(object_provides=ISession.__identifier__, path='/'.join(context.getPhysicalPath()), sort_on='sortable_title')它创建了一个视图,效果类似于在ZCML指令中的<browser:page /> 。我们还增加了一个可以在视图中使用的辅助方法。请注意,这需要在文件的顶部部分添加:
from Acquisition import aq_inner from Products.CMFCore.utils import getToolByName from example.conference.session import ISession视图工作的原理:
  • 视图的名字可以用@@view从类名中查看,如果需要的话,您可以指定另外的名字,然后将grok.name("some-name")中的some-name进行替代名称.
  • grok.context()命令是调用IProgram作为模板应用的对象.
  • 如果想指定浏览器层,您可以添加一个grok.layer()指令.
  • grok.require()指定设置视图所属的权限.它使用的Zope3权限的名称.
  • Zope2.view和zope.Public是最常用的权限.(事实上,zope.public实际上不是一个权限,它只是意味着"没有权限").对于其他权限标准,请参考parts/omelette/products/five/permissions.zcml。 在帮助手册后面,我们将来介绍创建自定义的权限.
  • 任何在视图中添加的方法可以通过视图变量在模板中调用,内容对象可以像通常的那样传递context内容。
这是program_template/view.pt,它的文件名与类名可以匹配(即使指定了不同的视图名),包括:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal" xmlns:metal="http://xml.zope.org/namespaces/metal" xmlns:i18n="http://xml.zope.org/namespaces/i18n" lang="en" metal:use-macro="context/main_template/macros/master" i18n:domain="example.conference"> <body> <metal:main fill-slot="main"> <tal:main-macro metal:define-macro="main" tal:define="toLocalizedTime nocall:context/@@plone/toLocalizedTime"> <div tal:replace="structure provider:plone.abovecontenttitle" /> <h1 class="documentFirstHeading" tal:content="context/title" /> <div class="discreet"> <tal:block condition="context/start"> <span i18n:translate="label_from">From:</span> <span tal:content="python:context.start.strftime('%x %X')" /> </tal:block> <tal:block condition="context/end"> <span i18n:translate="label_to">To:</span> <span tal:content="python:context.end.strftime('%x %X')" /> </tal:block> </div> <div tal:replace="structure provider:plone.belowcontenttitle" /> <p class="documentDescription" tal:content="context/description" /> <div tal:replace="structure provider:plone.abovecontentbody" /> <div tal:content="structure context/details/output" /> <h2 i18n:translate="heading_sessions">Sessions</h2> <dl> <tal:block repeat="session view/sessions"> <dt> <a tal:attributes="href session/getURL" tal:content="session/Title" /> </dt> <dd tal:content="session/Description" /> </tal:block> </dl> <div tal:replace="structure provider:plone.belowcontentbody" /> </tal:main-macro> </metal:main> </body> </html>在大多数情况下,模板输出的变量值,在视图上使用session()方法来获取程序中session.


注意RichText类型的调用需要加上output, tar:content="structure/context/details/output"。output这个关键结构保证了HTML可以呈现RichText内容.额外的details/output是必要的,因为RichText存储一个RichTextValue的对象,它包括不仅为用户输入的原始文本,但也是一个MIME类型(如text/html)和呈现的输入文本.更详细的RichText信息在手册后面。


调用Presenter的视图,在presenter.py文件中,过程非常简单:
class View(grok.View): grok.context(IPresenter) grok.require('zope2.View')它的模板在presenter_templates/view.pt,类似以前的模板:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal" xmlns:metal="http://xml.zope.org/namespaces/metal" xmlns:i18n="http://xml.zope.org/namespaces/i18n" lang="en" metal:use-macro="context/main_template/macros/master" i18n:domain="example.conference"> <body> <metal:main fill-slot="main"> <tal:main-macro metal:define-macro="main"> <div tal:replace="structure provider:plone.abovecontenttitle" /> <h1 class="documentFirstHeading" tal:content="context/title" /> <div tal:replace="structure provider:plone.belowcontenttitle" /> <p class="documentDescription" tal:content="context/description" /> <div tal:replace="structure provider:plone.abovecontentbody" /> <div tal:content="structure context/bio/output" /> <div tal:replace="structure provider:plone.belowcontentbody" /> </tal:main-macro> </metal:main> </body> </html>显然,这些视图是非常基本的,更有趣的视图,可以在模板中放入多个的功能。

你也应该认识到,你可以用这种技术创建任何视图类型.你的视图与特定内容类型没有关系. 甚至,你可以设置接口,例如:一个可以被所有内容类型调用的视图.

5.2 显示表单
在控件显示你的视图

在上一节中,我们创建一个通过grok.view调用的视图. 这种视图是最常见的,但有时候我们想更直接的调用控件和类型模型,例如进行转换或使用更复杂的HTML。

要做到这一点,你可以使用显示表单.这只是其中一种关于视图类型的视图基类。 我们将在session.py模板使用一个insession_templates/view.pt例子.


注意:显示形式包括同样的形式添加和编辑表单。如果是有许多行为、字段集和组件的更复杂表单,至少在高容量的网站上,你也许会注意到速度比普通视图慢。


新的视图类和以前的类几乎相同一样,除了来自dexterity.DisplayForm(plon.directives.dexterity.DisplayForm)
class View(dexterity.DisplayForm): grok.context(ISession) grok.require('zope2.View') 我们可以在view模板中使用一些额外的属性:
  • view.w是显示表单中所有的字段名称,键,控件,字典. 行为提供的字段,也就是通常的行为接口的名称(IBehaviorInterface.field_name)。 对于默认的模型,有着不合适的名称.
  • view.widgets包含在架构序列的widget列表默认的字段集.
  • view.groups包含的字段集列表.
  • view.fieldsets包含一个字典映射fieldset名称作为字段的fieldset, 在一个字段集,您可以访问得到fieldset在控件列表的组件。
词典w绝大多数情况可以被正常使用。

session_templates/ view.pt模板包含以下内容:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal" xmlns:metal="http://xml.zope.org/namespaces/metal" xmlns:i18n="http://xml.zope.org/namespaces/i18n" lang="en" metal:use-macro="context/main_template/macros/master" i18n:domain="example.conference"> <body> <metal:main fill-slot="main"> <tal:main-macro metal:define-macro="main"> <div tal:replace="structure provider:plone.abovecontenttitle" /> <h1 class="documentFirstHeading" tal:content="context/title" /> <div tal:replace="structure provider:plone.belowcontenttitle" /> <p class="documentDescription" tal:content="context/description" /> <div tal:replace="structure provider:plone.abovecontentbody" /> <div tal:content="structure view/w/details/render" /> <div tal:replace="structure provider:plone.belowcontentbody" /> </tal:main-macro> </metal:main> </body> </html>注意我们如何查看 view/w/detail/render(其中的字段名称),以获得一个部件的支持。 其它属性包括的__name__,字段的名称,和标签,字段标题。

英文原版
<<<第四章 schema驱动内容类型
[align=right]第六章:高级配置>>>
[/align]

设置