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

Plone 如何以编程方式控制对象';添加允许的内容类型的菜单列表?,plone,plone-3.x,Plone,Plone 3.x,我希望实际地控制单个对象的“添加”菜单列表中允许的内容类型 我正在使用archgenxml构建一个内容类型集合。在一个例子中,我有一个由RangeBase类组成的模拟类,它有三个实现:valueRange、vectorRange和uniformRange。模拟可以只包含一个范围,即RangeBase的多重性为1,因此模拟的“添加”菜单应该提供所有三种范围类型,或者根本不提供 为了实现这一点,我想订阅IObjectInitializedEvent和IObjectRemovedEvent事件;在Ra

我希望实际地控制单个对象的“添加”菜单列表中允许的内容类型

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

为了实现这一点,我想订阅IObjectInitializedEvent和IObjectRemovedEvent事件;在RangeBase类中放置各自的处理程序initializedHook和removedHook。处理程序将请求对象的本地允许类型列表,并相应地删除或添加三个范围。在阅读了Plone的“社区开发人员文档”之后,我认为初始化的钩子代码可能如下所示:

  # 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)
不幸的是,我的模拟类没有这些函数

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

这是可能的

我认为您需要重写getLocallyAllowedType()

AT是在适配器之前编写的,所以AT不使用它

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


请参阅此处的最后一篇文章,了解两种可能性:

在多次尝试调整_allowedTypes()失败后,我在上一次建议中进行了修改,并自定义了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)]
方法

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)
你的任务完成了。但是,如果要在对象创建过程中访问父对象以限制文件夹的内容类型,则在中创建对象时,可以在中连接到\u post\u create\u script()并从BaseObject中管理\u beforeDelete()。这对我来说非常有用,它将特定内容类型的数量限制在一个文件夹中,并且在对象被删除时更正了AllowedType