GenericSetup:如果仍然必须从initialize()调用ToolInit,toolset.xml会完成什么

时间:2011-04-09 07:06:58

标签: plone zope genericsetup

似乎toolset.xml只进行了一半。理想情况下,它应该能够在__init__.py中的initialize()中取消ToolInit调用。但是如果没有ToolInit调用,我无法在ZMI中显示工具图标。

2 个答案:

答案 0 :(得分:3)

初始化函数中的ToolInit调用将工具类注册为可以添加到数据库中基于OFS的文件夹的东西 - 主要是注册工厂以创建类的实例。这与ContentInit对普通内容类的基本相同。

一旦注册了类并且其meta_type已知,就可以将类的实例添加到基于OFS的文件夹中。 GenericSetup步骤负责管理持久性内容,可用于将工具实例添加到数据库中。

如果我们想避免初始化函数中的代码,我们需要创建一些自定义ZCML指令,并在configure.zcml中使用它们来注册类型及其工厂。 Dexterity已经走了这条路线,但它不适用于基于Archetypes的内容类型或工具等常规类。

答案 1 :(得分:2)

toolset.xml的目标是将工具实例化到数据库中。它也可以用来删除工具;例如,这在升级步骤中非常有用。

示例toolset.xml:

<?xml version="1.0"?>
<tool-setup>
  <required tool_id="portal_foo" class="dotted.path.to.FooTool" />
  <forbidden tool_id="portal_spam" />
</tool-setup>

此示例toolset.xml将在其上下文中将FooTool类实例化为portal_foo,并删除任何标识为portal_spam的对象(如果存在)。

请注意,您可以在任何GenericSetup配置文件中使用toolset.xml,而不仅仅是在首先定义该工具的包中,例如,在您开发的站点的一般策略包中。