Кажется, что toolset.xml проходит только половину пути. В идеале должна быть возможность избавиться от вызова ToolInit в initialize() в __init__.py. Но я не мог заставить значок инструмента отображаться в ZMI без вызова ToolInit.
GenericSetup: Что делает toolset.xml, если ToolInit по-прежнему нужно вызывать из initialize()?
Ответы (2)
Вызов ToolInit в функции инициализации регистрирует класс инструмента как нечто, что можно добавить в папки на основе OFS в базе данных — в первую очередь он регистрирует фабрику для создания экземпляров класса. В основном это то же самое, что ContentInit делает для обычных классов содержимого.
Как только класс зарегистрирован и известен его meta_type, экземпляры класса могут быть добавлены в папки на основе OFS. Шаги GenericSetup отвечают за управление постоянным содержимым и могут использоваться для добавления экземпляров инструмента в базу данных.
Если бы мы хотели избежать кода в функции инициализации, нам нужно было бы вместо этого создать некоторые пользовательские директивы ZCML и использовать их в файле configure.zcml для регистрации типа и его фабрики. Ловкость пошла по этому пути, но она недоступна для типов контента на основе архетипов или общих классов, таких как инструменты.
Цель toolset.xml — создать экземпляр инструментов в базе данных. Его также можно использовать для удаления инструментов; это очень полезно, например, на этапах обновления.
Пример набора инструментов.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
, если он присутствует.
Обратите внимание, что вы можете использовать toolset.xml в любом профиле GenericSetup, а не только в пакете, который изначально определяет инструмент, например, в общих пакетах политик для сайта, который вы разрабатываете.