Dexterity开发手册:第五章 定制视图
Dexterity开发手册:第五章 定制视图
http://www.315ok.org/blogfolder/401
http://www.315ok.org/logo.png
Dexterity开发手册:第五章 定制视图
Dexterity开发手册:第五章 定制视图
定制视图
定制简单视图和显示表单
5.1.简单的视图
5.2.显示表单
5.1简单的视图
创建基本视图
到目前为止,我们一直都在使用默认的视图类型,就像添加和编辑表单使用编辑控件都是来自z3c.from显示表单,这些默认视图是实用的,但不是非常有吸引力.大多数视图类型需要一个或多个自定义视图模板.
在plone里,Dexterity类型与其他的内容类型没有什么不同.你可以给视图模型建一个视图,并且可以设置视图的类型.如果你创建视图命名为view,至少在视图使用FTI的标准配置时,它将会使用默认视图.这是因为FTI的default_view属性设置为view,而且view在view_methods列表中。
当dexterity工作时,我们将用five.grok配置系统来配置视图,避开ZCML配置.下面,我们将讲解和演示如何给Program and Speaker添加简单的视图类型.如果需要的话,接下来,我们将演示一下如果利用标准控件来显示表单.
five.grok视图方法调用内容类型的模块的一个类,自动关联模板目录中的模板。模板目录与模块文件创建在同一目录中,所以在目录下会有program_templates,presenter_templates和session_templates等模板文件。
在program.py,注册视图如下:
注意RichText类型的调用需要加上output, tar:content="structure/context/details/output"。output这个关键结构保证了HTML可以呈现RichText内容.额外的details/output是必要的,因为RichText存储一个RichTextValue的对象,它包括不仅为用户输入的原始文本,但也是一个MIME类型(如text/html)和呈现的输入文本.更详细的RichText信息在手册后面。
调用Presenter的视图,在presenter.py文件中,过程非常简单:
你也应该认识到,你可以用这种技术创建任何视图类型.你的视图与特定内容类型没有关系. 甚至,你可以设置接口,例如:一个可以被所有内容类型调用的视图.
5.2 显示表单
在控件显示你的视图
在上一节中,我们创建一个通过grok.view调用的视图. 这种视图是最常见的,但有时候我们想更直接的调用控件和类型模型,例如进行转换或使用更复杂的HTML。
要做到这一点,你可以使用显示表单.这只是其中一种关于视图类型的视图基类。 我们将在session.py模板使用一个insession_templates/view.pt例子.
注意:显示形式包括同样的形式添加和编辑表单。如果是有许多行为、字段集和组件的更复杂表单,至少在高容量的网站上,你也许会注意到速度比普通视图慢。
新的视图类和以前的类几乎相同一样,除了来自dexterity.DisplayForm(plon.directives.dexterity.DisplayForm)
session_templates/ view.pt模板包含以下内容:
英文原版
<<<第四章 schema驱动内容类型
[align=right]第六章:高级配置>>>
[/align]
定制简单视图和显示表单
5.1.简单的视图
5.2.显示表单
5.1简单的视图
创建基本视图
到目前为止,我们一直都在使用默认的视图类型,就像添加和编辑表单使用编辑控件都是来自z3c.from显示表单,这些默认视图是实用的,但不是非常有吸引力.大多数视图类型需要一个或多个自定义视图模板.
在plone里,Dexterity类型与其他的内容类型没有什么不同.你可以给视图模型建一个视图,并且可以设置视图的类型.如果你创建视图命名为view,至少在视图使用FTI的标准配置时,它将会使用默认视图.这是因为FTI的default_view属性设置为view,而且view在view_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内容。
<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在控件列表的组件。
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]