跳转到主要内容

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

作者

mFabrik Research Oy - 雇佣 Python 和 Plone 专业人士。

变更日志

0.1 - 0.1.1

  • plone.org 发布

  • 更新后的 README

0.1

  • 初始发布

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。

源代码分发

mfabrik.behaviorutilities-0.1.1.tar.gz (19.7 kB 查看散列)

上传时间

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面