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, а не только в пакете, который определяет инструмент в первую очередь, например, в пакетах общей политики для сайта, который вы разрабатываете.

Другие вопросы по тегам