使用plone.behavior包为Archetypes内容创建行为模式的辅助模式
项目描述
简介
mfabrik.behaviorutilities是Plone 3和Archetypes的plone.behavior支持和辅助包。
关于行为模式
行为模式是一种为内容对象提供可扩展行为的方式,而无需触及实际内容对象类的源代码,并且可以开启和关闭行为。
首先阅读plone.behavior教程
请注意,该教程没有描述如何使用行为对象与基于Archetypes的内容一起使用,而这个Python模块试图填补这方面的空白。
功能
为Archetypes对象创建plone.behavior行为并使其可分配
按需创建行为对象 - 如果行为默认值没有更改,则不要进行保存或Zope事务
z3c.form支持使行为对象具有上下文感知能力,从而使选择小部件词汇解析正常工作
遍历工具
示例产品
以下基于此代码创建的Plone插件
示例代码遍历
注意:这里的代码仅用于示例目的,可能无法直接使用。在框架进一步成形后,将完成适当的用法文档。请参考现有代码用户以获取更多帮助。
行为被定义为接口,该接口还定义了用户可以编辑的行为表单选项。使用 plone.directives.form 包定义模式。
class IMultiChannelBehavior(form.Schema): """ How content and its children react to differt medias """ contentMedias = schema.Choice(title=u"Content medias", description=u"Does this content appear on web, mobile or both", default=ContentMediaOption.USE_PARENT, required=True) # More form fields here alsoProvides(IMultiChannelBehavior, form.IFormFieldProvider)
行为实现是一个持久的 Zope 对象,它知道其 上下文,即分配行为的对象。这是通过使用 mfabrik.beahviorutilities.volatilecontext.VolatileContext 基类实现的,该类是 Zope 持久类的子类。
实现使用 FieldProperties 将行为接口字段映射为类属性。
我们使用 AnnotationPersistentFactory 存储行为。这意味着当行为在您的内容对象上保存后,您可以通过遍历直接访问它。
context.__annotations__["your_annotation_key_name"]
示例
class MobileBehaviorStorage(VolatileContext): # Implement your behavior implements(IMobileBehavior) mobileFolderListing = FieldProperty(IMobileBehavior["mobileFolderListing"]) appearInFolderListing = FieldProperty(IMobileBehavior["appearInFolderListing"]) # This defines a behavior factoty method mobile_behavior_factory = AnnotationPersistentFactory(MobileBehaviorStorage, "mobile")
现在您可以创建和查询行为。
首先,我们检查行为是否可分配。目前,所有行为都硬编码为可分配给所有 Archetypes 内容对象。
self.loginAsPortalOwner() self.portal.invokeFactory("Document", "doc") doc = self.portal.doc # Check assignable works from plone.behavior.interfaces import IBehaviorAssignable assignable = IBehaviorAssignable(doc, None) self.assertTrue(assignable.supports(IMobileBehavior)) self.assertNotEqual(assignable, None)
当我们查询行为时,如果内容上尚不存在该行为,则将在动态创建。如果创建行为,则其属性将使用模式中指定的默认值进行填充。
behavior = IMobileBehavior(doc)
行为知道它属于哪个内容。这作为易失性引用实现,因此不会在 ZODB 中存储循环指针。
doc == behavior.context
您可以通过在存储类上定义的属性来编辑行为参数。
behavior.mobileFolderListing = True
如果您对行为进行了任何更改,则需要调用 VolatileContext 类的 save() 方法。这确保了如果行为不是默认行为,您需要实际在注释中保存持久参数。
behavior.save() # Recreate behavior from the scratch # and see it is persistent behavior = IMobileBehavior(doc) assert behavior.behavior.mobileFolderListing == True
每个行为还需要一个编辑表单 - 您可以使用 z3c.form 轻松完成此操作。
class MobileForm(z3c.form.form.EditForm): """ Folder/page specific mobile publishing options """ fields = field.Fields(IMobileBehavior) prefix = "mobile" label = u"Mobile navigation options" def update(self): return z3c.form.form.EditForm.update(self) def getContent(self): """ Return the object which the form should edit. """ behavior = IMobileBehavior(self.context) return behavior def applyChanges(self, data): # Call super content = self.getContent() val = z3c.form.form.EditForm.applyChanges(self, data) # Write behavior to database content = self.getContent() content.save() return val MobileFormView = wrap_form(MobileForm)
通过使用 document_actions 链接将此表单链接到您的对象是最简单的。
<?xml version="1.0"?> <object name="portal_actions" meta_type="Plone Actions Tool" xmlns:i18n="http://xml.zope.org/namespaces/i18n"> <object name="document_actions" meta_type="CMF Action Category"> <object name="mobile_options" meta_type="CMF Action" i18n:domain="plone"> <property name="title" i18n:translate="">Mobile settings</property> <property name="description" i18n:translate="">Set mobile publishing options</property> <property name="url_expr">string:$object_url/@@mobile_options</property> <property name="icon_expr"></property> <property name="available_expr"></property> <property name="permissions"> <element value="Modify portal content"/> </property> <property name="visible">True</property> </object> </object> </object>
0.1 - 0.1.1
plone.org 发布
更新后的 README
0.1
初始发布
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。
源代码分发
mfabrik.behaviorutilities-0.1.1.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 50a7b6252a463e8461ca5d562adc171b445c9fd4c9d47aef9773087e184bff7c |
|
MD5 | 2ba593cef154ed7ab31a05064f41653b |
|
BLAKE2b-256 | 119385e9ea0421edefc490a511158c86b63087cf351c2c0c9f2b4ca0ddcafc8e |