Plone 如何以编程方式控制对象';添加允许的内容类型的菜单列表?
我希望实际地控制单个对象的“添加”菜单列表中允许的内容类型 我正在使用archgenxml构建一个内容类型集合。在一个例子中,我有一个由RangeBase类组成的模拟类,它有三个实现:valueRange、vectorRange和uniformRange。模拟可以只包含一个范围,即RangeBase的多重性为1,因此模拟的“添加”菜单应该提供所有三种范围类型,或者根本不提供 为了实现这一点,我想订阅IObjectInitializedEvent和IObjectRemovedEvent事件;在RangeBase类中放置各自的处理程序initializedHook和removedHook。处理程序将请求对象的本地允许类型列表,并相应地删除或添加三个范围。在阅读了Plone的“社区开发人员文档”之后,我认为初始化的钩子代码可能如下所示:Plone 如何以编程方式控制对象';添加允许的内容类型的菜单列表?,plone,plone-3.x,Plone,Plone 3.x,我希望实际地控制单个对象的“添加”菜单列表中允许的内容类型 我正在使用archgenxml构建一个内容类型集合。在一个例子中,我有一个由RangeBase类组成的模拟类,它有三个实现:valueRange、vectorRange和uniformRange。模拟可以只包含一个范围,即RangeBase的多重性为1,因此模拟的“添加”菜单应该提供所有三种范围类型,或者根本不提供 为了实现这一点,我想订阅IObjectInitializedEvent和IObjectRemovedEvent事件;在Ra
# 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