我正在创建一个文件夹类型(原型1),我希望有可能只将(原型2)的单个对象添加到此文件夹中。
答案 0 :(得分:1)
您可以通过修改“archetypes 1”类型定义(profiles / default / archetype1.xml)将文件夹类型(“原型1”)中的可添加类型限制为“原型2”:
<?xml version="1.0"?>
<object name="archetype1">
...
<property name="filter_content_types">True</property>
<property name="allowed_content_types">
<element value="archetype2" />
</property>
...
</object>
答案 1 :(得分:1)
好的,所以你希望你的第二个类型 archetype 2 只能在 archetype 1 中添加一次吗?
我会这样做,绿色编辑栏上的添加新下拉列表只显示原型2 (如果可以添加)(此处需要其他解决方案)用户首先呈现添加表单,然后被告知不允许这样做。)
您需要确保您的文件夹原型1 子类 ConstrainTypesMixin 。
我认为如果您使用 Products.ATContentTypes 中的文件夹内容类型,您将自动将此mixin类子类化,但这有助于确保。
然后,在 archetype 1 中,添加方法: getLocallyAllowedTypes 。此方法在 Products / ATContentTypes / lib / constraintypes.py
中的 ConstrainTypesMixin 类中声明。在此方法中,您现在可以添加逻辑以检查是否已添加 archetype 2 的实例。如果有,请不要将其作为本地允许的类型之一返回。如果没有,则返回(如果存在则返回其他类型)。
确保首先在此方法中调用 super(),以从超类的方法中获取本地添加的类型。
要了解其工作原理,您可以在 plone / app / contentmenu / menu.py 中的 FactoriesSubMenuItem 类中查看* _addableTypesInContext *方法,以查看何时和如何调用 getLocallyAllowedTypes 方法。
答案 2 :(得分:0)
您可能最好创建一个自定义添加表单(可能使用z3c.form)并在那里设置限制。
答案 3 :(得分:0)
您可以覆盖createObject.cpy脚本并在那里添加一个检查:
this_type = REQUEST.form.get('type_name')
if this_type == 'MyATContentType':
# MyATContentType needs a special check
ctool = getToolByName(context, 'portal_catalog')
this_path = '/'.join(context.getPhysicalPath())
# Query the Catalog to see we already have an instance of this object here
results = ctool.searchResults({'portal_type': this_type, 'path': this_path})
if results:
context.plone_utils.addPortalMessage(_(
u'Sorry, but there already is an object of type %s here.' % this_type
))
# Redirect to the edit form of the first found object.
cv = results[0]
cv_path = cv.getPath()
return context.REQUEST.RESPONSE.redirect(cv_path + "/edit")
在产品的外观/模板文件夹中提供自定义脚本以及关联的.metadata文件。
额外提示:在Dexterity中,您可以在dexterity.AddForm.update()中添加此检查