我创建了一个名为“Résumé”的自定义Archetypes内容类型,并希望强制执行限制,允许成员在文件夹中仅添加此类型的一个项目。更好的方法是将会员重定向到他或她的项目的编辑页面,如果它已存在于该文件夹中。
如何执行此限制并提供此额外功能?
答案 0 :(得分:5)
可以在eestec.base中找到针对Plone 3的类似用例的解决方案。我们通过覆盖createObject.cpy并为此添加一个特殊检查来完成它。
代码位于集体SVN中,http://dev.plone.org/collective/browser/eestec.base/trunk/eestec/base/skins/eestec_base_templates/createObject.cpy,第20-32行。
答案 1 :(得分:2)
嗯,这是一种验证约束,所以也许在标题字段中添加一个验证器,实际上并不打扰标题,但检查用户等? (我认为一个字段验证器传递了足够的信息来解决这个问题,如果没有,覆盖post_validate方法或者听相应的事件应该有效。)
如果您尝试这样做,请记住在用户编辑时已经调用了post_validate(即将焦点移出字段时)。
答案 2 :(得分:1)
我不知道这是否是最佳做法,但您可以在创建时与基础对象挂钩def at_post_create_script
,在删除时挂钩manage_beforeDelete
。
例如:
from Products.ATContentTypes.lib import constraintypes
class YourContentype(folder.ATFolder)
[...]
def at_post_create(self):
origin = aq_parent(aq_inner(self))
origin.setConstrainTypesMode(constraintypes.ENABLED) # enable constrain types
org_types = origin.getLocallyAllowedTypes() # returns an immutable tuple
new_types = [x for x in org_types if x! = self.portal_type] # filter tuple into a list
origin.setLocallyAllowedTypes(new_types)
def manage_beforeDelete(self, item, container)
BaseObject.manage_beforeDelete(self, item, container) # from baseObject
self._v_cp_refs = None # from baseObject
origin = aq_parent(aq_inner(self))
origin.setConstrainTypesMode(constraintypes.ENABLED) # enable constrain types
org_types = origin.getLocallyAllowedTypes() # returns an immutable tuple
new_types = [x for x in org_types].append(self.portal_type)
origin.setLocallyAllowedTypes(new_types)
注意:还有一个名为setImmediatelyAddableTypes()
的方法,您可能想要探索它。
注意II:这在内容迁移中无法存在。