如何添加条件以使敏捷类型可添加?

How to add a condition to make a Dexterity type addable?

Dexterity FTI 可以选择 select 作为类型的 "AddPermission" 权限,但我正在寻找一种方法来要求一些潜在的复杂逻辑在允许类型之前解析为真要添加到容器中。在我的特定示例中,我不允许在任何给定容器中只允许 X 数量的此内容。如果我可以 subclass 一个方法,比如说,"isAddable" 或一些很棒的方法,但我没有看到任何现成的方法可以做到这一点。也许这是不可能的,因为 class 对象还没有启动,所以它不能调用任何方法,但也许 FTI 本身有东西?

我想到了另外两个选项。在我的例子中,由于容器也是自定义内容类型,我可以覆盖它的 allowedContentTypes 方法。我宁愿不依赖容器来做这个检查。另一种选择是覆盖 plone.app.content.browser.folderfactories.FolderFactoriesView 中的 addable_types 方法。有没有更好的方法?

这是在 Plone 4.3 中

不幸的是,fti 中没有 "addable_expression" 这样的东西。

我认为重写 FolderFactoriesView 不会成功 - 聪明的用户仍然可以调用 ${folder_url}/++add++your.type

对我来说,为您的文件夹类型自定义实现 allowedContentTypes 是个不错的解决方案。

另一种选择是添加一个事件处理程序(不知道哪个事件适合 - 也许 zope.lifecycleevent.IObjectCreatedEvent 就好了),如果您的条件不满足,它会引发错误。 (用户仍会看到 "add / yourtype" 菜单,但会出现错误 - 因此应将其与自定义 FolderFactoriesView 结合使用)