第十五章使用Archetypes扩展开发.docx
- 文档编号:10252464
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:46
- 大小:137.11KB
第十五章使用Archetypes扩展开发.docx
《第十五章使用Archetypes扩展开发.docx》由会员分享,可在线阅读,更多相关《第十五章使用Archetypes扩展开发.docx(46页珍藏版)》请在冰豆网上搜索。
第十五章使用Archetypes扩展开发
使用Archetypes扩展开发
在本章介绍之前,几乎所有的开发,都是在浏览器中通过ZMI完成的(ExternalMethod除外)。
这些技术也就是Plone的脚本开发技术。
掌握他们,可以满足大多数具体应用的需求。
另外一方面,Plone上有非常多的扩展插件产品,可供安装使用。
这些扩展插件产品,都是在文件系统开发完成,能够方便的发布,可被重复的使用。
本章将关注如何采用Archetypes技术,来开发Plone的可重用扩展插件产品。
本章适合扩展开发人员阅读。
本章学习重点是:
∙理解扩展产品开发应用的背景
∙掌握使用Archetypes语义为基础的产品开发
∙掌握开发内容类型时常用的重载方法
∙了解扩展产品在文件系统上的常用布局
∙掌握针对内容类型定制显示模板的方法
15.1 扩展插件产品开发背景
在各个Zope实例中,也有一个Products目录,包括CMFPlone在内的Zope外围插件产品就放置在这里。
在Zope启动的时候,会依次加载Products目录中的各个产品。
其中Plone的扩展插件产品,都可在Plone网站设置中的安装和卸载产品中安装和卸载。
一旦安装后,大多数的插件产品都会增加一组新的内容类型,可在文件夹的【添加到文件夹】下拉菜单中看到。
比如内容面板(CMFContentPanels)产品,就新增加了一个内容面板的内容类型。
每个内容类型,有自己的图标,有自己的编辑和查看界面;对用户的输入,能够对输入进行合法性校验,能够进行权限控制;每种内容类型,都支持一组标准的元数据(属性);所有的界面,需要支持国际化,能够在多种语言下工作。
可以看出,Plone扩展插件产品的开发需求还是比较复杂的。
在Archetypes技术出来之前,如果要对Plone进行扩展开发,就需要使用Zope/CMF提供的大量API,需要遵循比较复杂的代码规范,掌握扩展开发的学习曲线非常陡。
另外,这种开发方法,没有将对象的数据和逻辑分离开来,可扩展性不是很好。
15.2 archetypes做什么
Archetypes是Plone内容扩展开发的一个开发框架,只需要用python语言对内容类型提供描述信息,便可自动完成一些逻辑和内容编辑展现界面。
这样,Archetypes大大简化了Plone的扩展开发过程,减少了学习掌握的曲线;同时,代码减少,也意味着产生bug的可能性减少,以及后续的维护费用降低,并能带来更快的开发周期。
Archetypes分离了内容的数据字段(field)、显示器件(widget)、存储(storage)。
由于完全采用通过描述性语句来说明,因此还可以UML工具进行图形化建模,对建模结果采用一个叫做ArchGenXML的工具处理后自动生成代码。
你甚至不需要写任何的代码。
快速开发是Archetypes的最主要的优点。
很多用户将Archetypes用作建立快速的系统原型、建立应用框架的良好途径。
现在几乎所有的Plone扩展插件产品都使用了Archetypes,Archetypes基本上是Plone扩展开发的标准。
Arachetype开发包能够实现:
∙能自动生成内容的编辑和显示页面,因此你不用写任何的页面模版代码
∙为每个内容自动维护一个用户不能更改的、内部唯一代号(UID)。
这样即便内容被移动了,仍然可以通过UID来找到。
∙支持内容的关联引用。
每种内容,可和其他的内容建立多种关系。
比如,一个新闻可能附加了几个其他的参考文档的链接。
∙默认就包括一套安全设置,能够满足大多数的应用场合。
∙支持多种存储方式,除了保存在ZODB对象数据库外,还可保存在文件系统,或者关系数据库中
∙提供大量的显示器件(控件),可构造丰富的界面,如网格表格、富文本输入等。
∙提供了数据格式转换的功能,比如,可以将微软的Word文档转换为html格式,直接在浏览器上显示。
Archetypes不仅仅可被用在Plone上,他也可被用于CMF,但目前还仅仅在Plone中大量使用。
未来,Archetypes将融合更多Zope3的技术,比如采用Zope3的Schema架构。
采用Archetypes开发的产品,能够确保和未来的Plone版本兼容。
15.3 快速进入代码
Archetypes包括一个叫做ArchExample的示例产品,下面将以这个产品为例子做讲解。
这个产品可在http:
//dev.plone.org/archetypes/browser/ArchExample/trunk得到。
在继续之前,你可以先安装这个产品,并尝试它的功能,注意这次是从subversion仓库中取出代码,如果你不熟悉subversion仓库,Windows平台用户可以使用ToitoiseSVN作为客户端下载它的代码,而一般命令行上可以使用这个命令来获取代码:
svncohttps:
//svn.plone.org/svn/archetypes/ArchExample/trunkArchExample
获取的代码就在ArchExample文件夹中,将它放置在Products文件夹中,并重新启动Zope,在Web界面上打开站点设置的安装产品页面,可以看到多了一个ArchExample产品可安装,选中它并安装到Plone中。
这样安装之后,在添加下拉菜单中就多了一项article类型。
你可以尝试几次添加这种类型的对象,添加了之后还可以再编辑它的内容,修改它的属性,看它与其它Plone上可添加的类型有什么不同。
由此可能明白为什么要在文件系统上进行开发,这个过程就是创建了新的可添加类型。
试用过它的功能之后再看看这么多的功能需要的代码量是多少,由此你可以体会到使用Archetypes开发的快捷性。
这个产品实现一种新的文章内容类型,文章主要包括如下字段:
∙Title:
文档的标题(必填)
∙Group:
文章所属的栏目(例如:
头条,公告,专栏等等)
∙Blurb:
文章的摘要
∙Body:
文章的内容,提供2种输入方法(手动输入文章内容,上载文章内容)。
文章的格式多种格式,比如:
纯文本、html等。
其中Article.py文件包含了产品的主要代码。
在这个文件中,我们可以看到对摘要字段的定义:
StringField("blurb",
searchable=1,
widget=TextAreaWidget(),
),
这段代码是对文章摘要的定义。
这个属性的名字是blurb,他是一个字符串,编辑的时候将使用HTML的文本框(TextArea)进行输入。
编辑这个内容的时候,是这样的:
【图15.1】文章的摘要(blurb)属性
仅仅四行代码,我们就为文章这种内容类型添加了一个字段。
在编辑表单采用标准的Plone界面风格呈现:
如果你编辑了某个属性,再次回来的时候,原先的值可正确显示,错误可正确处理和提醒,等等。
做为示例,我们让输入标签显示文章摘要,而且必须输入,来表明修改的容易度。
我们调整代码为:
StringField("blurb",
required=1,
searchable=1,
widget=TextAreaWidget(label="文章摘要",
description="请输入文章的简短摘要信息"),
),
这里,我们添加了required=1参数,表示这个字段必须输入,另外添加了一个label(标题)和description(描述)参数。
需要特别指出的是,Plone默认采用utf-8作为页面编码,这里的代码中的汉字,也应该采用utf-8编码。
如果重新启动Plone,添加一个新的文章(Article),新的界面会自动更新,以反映这个新的语义。
这个字段现在显示为文章摘要:
【图15.2】更新后的文章摘要属性输入部分
这个变化表明,一旦内容的底层语义(schema)发生变化,相关的用户界面会随之改变,这正是Archetypes的强大所在。
一旦你定义好了语义,你不必再作任何其它调整,你完成了这个内容类型了。
随后你可再调整语义,界面也可随之改变。
当然,任何语义的调整之后,或者说产品的源代码改变之后,你必须重新启动Zope,才能让修改生效。
这样,新的变更才能被加载和正确注册。
这也是文件系统上的产品开发与以前的通过Web(TTW)式开发的一个不同。
15.4 内容语义(Schema)和相关概念
从前面,我们看到。
内容的语义(Schema)是整个插件产品的核心。
Archetypes的语义(schema)类似于我们通常的数据字典的定义,关系数据库中表结构的定义也是语义定义的重要部分。
内容的语义(Schema)由若干类型的字段(field)组成,每个字段包括一个显示器件(Widget)。
他们的关系如下:
+--------------+
|语义(Schema)|
+--------------+
|+--------------+
|-->|字段(Field)|
|+--------------+
||+------------------+
|`--------->|显示器件(Widget)|
|+------------------+
|+--------------+
`-->|字段(Field)|
+--------------+
|+------------------+
`--------->|显示器件(Widget)|
+------------------+
语义、字段和显示器件的关系
15.4.1 语义(Schema)
可将各个字段(Field)以按照元组(tuple)的方式传入Schema对象,即可创建一个新的语义(schema)。
例如,这个文章的语义(Schema)就包括三个字段(Field):
group,blurb和body,这个语义(Schema)的起始部分代码是:
Schema((
StringField('group',
vocabulary=ARTICLE_GROUPS,
widget=SelectionWidget(),
),
#这里开始是其他的字段...
)
多个语义(Schema)累加,是可以组装为一个新的语义(Schema)的。
ArchExample也是这样做的,它累加了一个叫做BaseSchema的语义。
BaseSchema包含了所有Plone内容类型都应该有的2个字段:
标题和英文代号。
标题用来在用户界面上显示这个内容,英文代号是用来内部命名的。
这2个语义简单的累加,可构成一个更大的语义。
在ArchExample中,可将你的内容语义和现有的BaseSchema进行累加。
例如:
schema=BaseSchema+Schema((
StringField('group',
vocabulary=ARTICLE_GROUPS,
widget=SelectionWidget(),
),
...
在界面上各个输入项显示的次序,和Schema定义中字段(Field)的添加次序是一致的。
这意味着,移动Schema中各个字段(Field)在语义(Schema)中的位置,便可调整这些元素在界面上的显示次序。
正因如此,由于BaseSchema加到了开始处,所以在编辑页面中,英文代号和标题在位于最上方,而不是底部。
15.4.2 字段(Field)
到现在为止,我们看到了StringField这个字段,它是在内容中表示字符串类型的一个常用字段。
在Archetypes中,还包括很多其他的字段,详细见本节后面的表格。
你可以尝试更多的字段类型,甚至定义自己的字段类型。
每个字段(Field)有一个默认使用的显示器件,你也可以专门指定一个。
上面的摘要blurb字段中,指定了一个TextAreaWidget(Widget在下节讲述)。
所有的这些字段,可在Archetypes的public模块中导入,比如:
fromProducts.Archetypes.publicimportBooleanField
所有的字段的实例化方法是相同的:
创建一个字段,并将字段名作为第一参数传入。
你也可以使用关键字参数的方式,传递更多的可选参数。
比如:
fromProducts.Archetypes.publicimportIntegerField
#年龄字段
age=IntegerField('age')
【表15.1】Archetypes中可用的字段清单
名字
类型
默认显示器件
描述
BooleanField
布尔类型
ComputedWidget
用于存放真/假的简单字段
DateTimeField
日期和时间对象
CalendarWidget
用于存放日期和时间
FileField
文件类型
FileWidget
用于存放大段的数据,比如文本文件,微软的Word文档,等等
FixedPointField
定点数值
DecimalWidget
用于存放定点的数值数据
FloatField
浮点数
DecimalWidget
用于存放浮点数值数据
ImageField
图片
ImageWidget
存放图片,允许动态的调整图片的大小
IntegerField
整数
StringWidget
存放整数数值类型
LinesField
列表
LinesWidget
数据的列表(list),比如关键字
ReferenceField
引用
ReferenceWidget
指向这个对象和其他对象的引用
StringField
字符串
StringWidget
针对存放比较小的字符串优化的字段,比如小于100个字符的字符串
TextField
字符串
TextWidget
针对存放较大的字符串优化的字段,比如大于100个字符.这个字符串可被转化为多种格式
每个字段都有一组可设置的属性。
我们现在已经至少看到了2个:
name和widget属性。
name属性是字段唯一必需的参数,而且必须唯一,并使用不包含空格和点号的小写英文字母。
name字段将在内部使用,因此应该严格遵守这个命名规范。
所有的其他属性都是可选的。
下表描述了其他的所有的属性。
【表15.2】字段(Field)属性
名字
描述
可能的值
accessor
获取字段值的方法名
可以指定任何方法名(如specialGetMethod)
default
字段默认值
为字段设置一个合适的默认值
default_method
参数是一个方法名的字符串,调用该方法得到字段默认值,如果不设置则系统将自动生成一个
任何一个方法的名称字符串
edit_accessor
获取字段原始值的方法名
任何方法名(如rawGetMethod)
enforceVocabulary
如果被设置则不接受vocabulary之外的任何值
True或False.
index
如果你希望这个字段被用在它自己的索引名中,可以在这里设置一个索引类型字符串。
如果再加上:
schema后缀,则它还会作为metadata信息被存储
任何索引名,如KeywordIndex或KeywordIndex:
schema.
name
字段的唯一命名
任何小写的字符串并遵守Python变量命名规则,(如description,user_name,或coffee_bag_6).
mode
字段的读写模式,使用一个字符串形式表示,默认值是读写模式
只读模式是'r',只写模式是'w',读写模式是'rw'
multiValued
表示字段是否可以有多个值,这对于下拉列表形式的多选项很有用
True或False.
mutator
改变字段值的方法名,由此可以改变这个字段怎样被设置
任何方法名(如specialSetMethod)
primary
如果设置为真,则这个字段将被作为FTP和WebDAV协议的响应。
只能有一个字段设置这个值,如果有多个字段设置了primary则只有第一个被使用。
通常只为主body属性设置这个字段
True或False.
required
指定这个字段是否必需
True或False.
schemata
将这个字段放入其它字段中组中称为schematas
metadata
指示这个值是否会被放入到metadata信息中
默认值是False
searchable
拕定该字段是否加入到可搜索文本中以被搜索到
True或False.
validators
为字段设置校验,可以在这里设置校验方法的字符串的元组,它会顺序执行这个校验方法
任何校验器,seethe'ValidationsofInput”sectionlater.
vocabulary
字段的可能的值的列表,常用于下拉列表中的可选项
字符串列表,如['Green','Red','Blue'])
storage
在哪里存放数据;默认是AttributeStorage,将数据存放为对象的一个属性
任何一个有效的storage对象,比如AttributeStorage或者SQLStorage。
更多的信息,请查看存储(storage)一节.
widget
用于显示字段的器件名称
任何器件对象
read_permission
用于读取时的权限设置
如CMFCore的permissions中定义的View权限
write_permission
修改这个字段所需要的权限
如CMFCorer的permissions中定义的ModifyPortalContent权限
到现在为止,我们已经讲述了默认的字段(Field)和属性,现在开始讲述显示器件(Widget).
15.4.3 显示器件(Widget)
显示器件(Widget)包含了如何显示对象的一些信息。
通常,一个字段的显示视图和这个字段的类型密切相关。
但是,你可以有更多的显示选项,比如字符串可以被输入,或者从多个可选项中选择。
你可从Archetypes的public模块中导入显示器件。
例如:
fromProducts.Archetypes.publicimportBooleanWidget
所有的显示器件采用相同的方式实例化:
创建一个显示器件,并传入所需的关键字参数。
比如:
fromProducts.Archetypes.publicimportIntegerField
fromProducts.Archetypes.publicimportIntegerWidget
#年龄字段
age=IntegerField('age',
widget=IntegerWidget(label="您的年龄")
)
显示器件能有其他的属性,这取决于显示器件的类型。
大多数情况下,这些附加的属性直接和HTML属性对应。
比如,StringWidget就有一个size属性。
相应的,这将产生使用这个size属性的HTML输入框。
如果我们需要让输入框只有20个字符串宽,我们可创建如下的显示器件:
bankAccountNumber=StringField('bank',
widget=StringWidget(
label="银行帐号",
size=20)
)
下表描述了Archetypes中可用的所有显示器件。
【表15.3】可用的显示器件(widget)
名字
描述
其他属性
BooleanWidget
显示一个复选框
—
CalendarWidget
一组输入框,还包含一个弹出式小窗口用于选择日期
show_hm控制是否显示小时和分钟,show_ymd控制是否显示年月日
ComputedWidget
以HTML来显示计算值
—
DecimalWidget
简单的HTML输入框用于输入字符串
thousands_commas可以指定是否以逗号分隔三位数字的形式显示数字
FileWidget
显示一个HTML文件元素用于上传文件
show_content_type控制是否显示内容类型
IdWidget
一个简单HTML输入框用于显示自动产生的ID
display_autogenerated控制是否显示自动产生的id
ImageWidget
显示并允许编辑图片
可使用display_threshold设置图片的大小
IntegerWidget
一个简单的HTML字符串输入框
size控制输入框大小,maxlength控制可输入的最大长度
KeywordWidget
在一个复杂器件中显示可用的关键字列表
—
LabelWidgets
用于显示表单上的提示信息
—
LinesWidget
显示一个文本区让用户输入
可以用rows控制行数,cols控制列数
MultiSelectionWidget
选择器件,默认是使用HTML的select器件
format,其值可以是select或checkbox
PasswordWidget
HTML密码输入元件
—
RichWidget
允许以多种格式输入一个文件内容并将在内部作转换格式
可使用rows控制显示行数,cols控制显示列数和format控制显示格式
ReferenceWidget
显示HTML的select元素用于选择一列可能的引用值
—
SelectionWidget
显示一个选择器件,它在默认情况下是很灵活的:
当可选择值多于四个时显示一个选择框,否则显示为一组单选按钮
format,其值可以是flex(默认值),select,或radio.
StringWidget
简单的HTML字符串输入框
size指定输入框的大小,maxlength指定最多可输入的字符个数
TextAreaWidget
允许以多种格式上传内容的文本区
可使用allowed_content_types,值是字符串的列表,其中每一个字符串代表着一种上传内容的meta_type类型,append_only设置为True可以设为追加模式
上表中的各种显示器件,在下表中描述了所有显示器件公共的属性。
你已经看过了label和description属性了,他们用于设置显示器件的标题和提示说明信息。
和上面各个显示器件的附加属性在一起,我们可获得一个完整的显示器件属性清单。
【表15.4】显示器件(widget)的公共属性
名字
描述
可能值
label
显示在用户界面上的提示信息
任何字符串,如StartDateforafieldstart_date.
modes
器件的显示模式,默认有两种模式,view和edit.
模式字符串的列表,默认是('view','edit').
populate
如果这设置为真,则查看或编辑时控件内的值将被显示,通常这个值被设置,但对于密码输入则不应该设置。
默认值是真。
True或False
postback
如果这设置为真,当查看或编辑发生错误时,则控件内的值将被显示,通常这个值被设置,但对于密码输入则
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十五 使用 Archetypes 扩展 开发