使用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 |