如何以编程方式控制对象的允许内容类型的添加菜单列表?

时间:2011-03-04 13:40:08

标签: plone plone-3.x

我想务实地控制单个对象的允许内容类型的添加菜单列表。

我正在使用archgenxml构建一组内容类型。在一种情况下,我有一个由RangeBase类组成的模拟类,它有三个实现,valueRange,vectorRange和uniformRange。模拟可以只包含一个范围,即RangeBase的多重性为1,因此模拟的添加菜单应提供所有三种范围类型或根本不提供。

为实现这一点,我想要订阅IObjectInitializedEvent和IObjectRemovedEvent事件;在RangeBase类中放置各自的处理程序initializedHook和removedHook。处理程序将请求对象的本地允许类型列表,并相应地删除或添加三个范围。在仔细阅读了Plone的“社区开发者文档”后,我认为initializedHook代码看起来像这样:

  # Set allowed content types
  from Products.ATContentTypes.lib import constraintypes

  def initializedHook(obj, event):

    # Get this range's parent simulation
    parent = obj.aq_parent

    # Enable constraining
    parent.setConstrainTypesMode(constraintypes.ENABLED)

    # Remove the three ranges 
    allowedTypes = parent.getLocallyAllowedTypes()
    ranges = ('valueRange','vectorRange','uniformRange')
    for range in ranges:
      allowedTypes.remove(range)

    # Tweak the menu
    parent.setLocallyAllowedTypes(allowedTypes)
    parent.setImmediatelyAddableTypes(allowedTypes)

不幸的是,我的模拟类没有这些功能。

是否有适配器可以为我的模拟类提供此功能,还是有其他完全不同的方法来实现所需的菜单行为?任何建议将不胜感激。

4 个答案:

答案 0 :(得分:4)

有可能。

我认为你需要覆盖getLocallyAllowedType()

http://svn.plone.org/svn/collective/Products.ATContentTypes/trunk/Products/ATContentTypes/lib/constraintypes.py

AT是在适配器之前编写的时间,所以AT没有使用它。

我建议您也可以更新有关此文档的文档......这是非常常见的用例。

http://web.archive.org/web/20101010142032/http://collective-docs.plone.org/content/creating.html

答案 1 :(得分:1)

在尝试调整_allowedTypes()几次失败后,我按照http://plone.org/documentation/kb/restrict-addable-types上的最后一个建议并自定义了getNotAddableTypes.py。我的自定义仅列出了三个范围的文件夹内容过滤。如果结果数组不为空,我将三种范围类型添加到列表中:

 # customize this script to filter addable portal types based on
 # context, the current user or other criteria

 ranges = []
 ranges = context.listFolderContents(contentFilter={'portal_type':
                     ('VectorRange','ValueRange','UniformRange')})
 return {True:  ('Favorite', 'VectorRange', 'ValueRange', 'UniformRange'),
         False: ('Favorite')}[len(ranges)]

答案 2 :(得分:0)

答案 3 :(得分:0)

方法

foo.getLocallyAllowedTypes()

返回一个元组,你只需要复制/过滤到另一个元组/列表,因为它是不可变的。

allowed_types = parent.getLocallyAllowedTypes()
filtered_types = []
for v in allowed_types:
    if not v in ranges:
        filtered_types.append(v)

然后你可以将该元组赋予setter方法

parent.setLocallyAllowedTypes(filtered_types)

你完成了。但是,如果要在对象创建期间访问父级以限制文件夹的内容类型,则可以在其中创建对象,可以从BaseObject连接at_post_create_script()和manage_beforeDelete()。这对我很有用,将特定内容类型的数量限制在一个文件夹中,并在删除对象时更正AllowedTypes。