Рекомендуемый подход для маркировки типа контента dexterity с новым интерфейсом

#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/…