我想务实地控制单个对象的允许内容类型的添加菜单列表。
我正在使用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)
不幸的是,我的模拟类没有这些功能。
是否有适配器可以为我的模拟类提供此功能,还是有其他完全不同的方法来实现所需的菜单行为?任何建议将不胜感激。
答案 0 :(得分:4)
有可能。
我认为你需要覆盖getLocallyAllowedType()
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)
请参阅此处的最后一篇文章,了解两种可能性:http://plone.293351.n2.nabble.com/Folder-constraints-not-applicable-to-custom-content-types-td6073100.html
答案 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。