如何将文件夹类型中的特殊content_type对象的数量限制为仅一个对象?

时间:2011-07-13 10:13:19

标签: object directory plone

我正在创建一个文件夹类型(原型1),我希望有可能只将(原型2)的单个对象添加到此文件夹中。

4 个答案:

答案 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()中添加此检查