#plone #dexterity
#plone #dexterity
Вопрос:
Во время работы над проектом, основанным на dexterity, мне понадобился один из моих типов контента для поддержки collective.быстрая загрузка путем пометки его интерфейсом IQuickUploadCapable.
В настоящее время я добавляю «implements» в мой файл configure.zcml:
`<class class="plone.dexterity.content.Container">
<implements interface="collective.quickupload.browser.interfaces.IQuickUploadCapable" />
</class>`
Поскольку мой тип содержимого является контейнером, это работает, однако моим первым побуждением было использовать подход в стиле grok вместо объявления его в ZCML. Каков способ grok / dexterity сообщить моему типу контента dexterity, что он реализует дополнительный интерфейс, или я должен придерживаться текущего подхода?
Также я попытался добавить интерфейс в качестве поведения в свой profiles/default/types/my.dexterity.content.xml
файл, но это не сработало (я действительно не ожидал, что это так, поскольку поведение служит другой цели).
Комментарии:
1. Примечание: ваш текущий подход будет помечать все элементы контейнера dexterity как предоставляющие этот маркер, а не только ваш тип.
Ответ №1:
Ответ Шона хорош. Другой способ — создать поведение и применить его. Вам необходимо зарегистрировать поведение с помощью:
<plone:behavior
title="Quickupload"
provides="collective.quickupload.browser.interfaces.IQuickUploadCapable"
/>
Затем вы можете добавить ‘коллективный.quickupload.browser.interfaces.IQuickUploadCapable’ к вашему списку поведений в FTI.
Ваш подход с использованием не очень хорош, потому что это означает, что все типы ловкости на основе контейнеров получают интерфейс маркера, а не только ваш тип.
Ответ №2:
Почему бы просто не создать подкласс IQuickUploadCapable как смесь после формы.Схема в вашем интерфейсе типов?
Ответ №3:
Вы не можете использовать его как поведение, потому что оно не претендует на использование таким образом.
Как я прочитал из pypi, предназначен для использования в портлете или в viewlet.
Чтобы добавить его в стиле grok, вы должны:
from collective.quickupload.browser.interfaces import IQuickUploadCapable
from plone.directives import form
class IMyContent(form.schema):
grok.implements(IQuickUploadCapable)
И это все!
Убедитесь, что ваш тип содержимого позволяет добавлять в него файлы, поэтому он является как папочным, так и позволяет добавлять файлы (или он просто не ограничивает какой-либо конкретный тип содержимого).
Комментарии:
1. и я предполагаю
grok.implements(IQuickUploadCapable IOtherInterface)
, что это сработает?2. нет, это не сработает:
grok.implements(IQuickUploadCapable, IOtherInterface)
будет работать. Обратите внимание на запятую, разделяющую интерфейсы.3. Я попробовал grok.implements(IQuickUploadCapable) в своем классе. Это не сработало. Просто примечание, я почти уверен, что
form.schema
выше должно бытьform.Schema
нижней строкой, это не работает, я получаю:InvalidInterface: Concrete attribute, __implements_advice_data__
4. @DavidBain: github.com/collective/collective.developermanual/blob/master/…