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