GenericSetup: Что делает toolset.xml, если ToolInit по-прежнему нужно вызывать из initialize()?

Кажется, что toolset.xml проходит только половину пути. В идеале должна быть возможность избавиться от вызова ToolInit в initialize() в __init__.py. Но я не мог заставить значок инструмента отображаться в ZMI без вызова ToolInit.


person sureshvv    schedule 09.04.2011    source источник


Ответы (2)


Вызов ToolInit в функции инициализации регистрирует класс инструмента как нечто, что можно добавить в папки на основе OFS в базе данных — в первую очередь он регистрирует фабрику для создания экземпляров класса. В основном это то же самое, что ContentInit делает для обычных классов содержимого.

Как только класс зарегистрирован и известен его meta_type, экземпляры класса могут быть добавлены в папки на основе OFS. Шаги GenericSetup отвечают за управление постоянным содержимым и могут использоваться для добавления экземпляров инструмента в базу данных.

Если бы мы хотели избежать кода в функции инициализации, нам нужно было бы вместо этого создать некоторые пользовательские директивы ZCML и использовать их в файле configure.zcml для регистрации типа и его фабрики. Ловкость пошла по этому пути, но она недоступна для типов контента на основе архетипов или общих классов, таких как инструменты.

person Hanno Schlichting    schedule 09.04.2011
comment
Я обнаружил, что вызов Toolinit из initialize() не требуется, если мы используем toolset.xml. Инструмент создается на сайте. Кроме одного - отсутствует значок. Поэтому, чтобы значок выглядел правильно, мне пришлось создать тело для функции инициализации и вызвать там ToolInit. Если бы в toolset.xml можно было указать значок, даже в этом не было бы необходимости. - person sureshvv; 10.04.2011
comment
@sureshvv: Тот факт, что это вообще работает, является счастливым совпадением; например, в toolset.xml нет ничего, что бы регистрировало фабрику. Конечно, поддержка этого варианта использования никогда не была целью toolset.xml. - person Martijn Pieters; 11.04.2011
comment
@martijn: К сожалению, опыт разработчиков далеко не идеален, если нам нужно коснуться 3 или 4 мест, казалось бы, несвязанным образом, чтобы что-то произошло. - person sureshvv; 13.04.2011
comment
@sureshvv: отсюда и мое объяснение того, что делает toolset.xml роли. Регистрация инструментов по-прежнему является задачей уровня Zope (значки отображаются только в ZMI), поэтому для этого вы используете API-интерфейсы уровня Zope. CMF (частью которого является GenericSetup) и Plone являются более поздними надстройками, построенными поверх этого. - person Martijn Pieters; 13.04.2011

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

person Martijn Pieters    schedule 09.04.2011
comment
Использование ‹запрещено› с идентификатором инструмента, который ранее был помечен как обязательный, вызывает исключение: ValueError: Требуется инструмент [tool_id]! Как на самом деле удалить инструмент? - person David Glick; 19.10.2013
comment
@DavidGlick: интересно; это исключение возникает только в том случае, если инструмент указан как обязательный и запрещенный в цепочке зависимостей профиля. Вам придется принудительно удалить с помощью пользовательского шага, если вы не можете избавиться от зависимости в своем профиле. - person Martijn Pieters; 19.10.2013