как сделать контейнер Plone Dexterity похожим на папку Archetypes

Я создал продукт Dexterity, который включает контейнерные и неконтейнерные типы контента Dexterity. Обнаружив коллективный.documentviewer (ура! спасибо! ура!), я хотел бы использовать его dvpdf-group-view, но он зарегистрирован в ZCML как предназначенный для папок, а мои контейнеры Dexterity не подходят. Я просмотрел веб-интерфейсы, доступные для моего типа контейнера, добавил SiteRoot, и это позволило применить представление, но это тоже совершенно неправильно.

Я уверен, что есть правильный способ сделать это, и я почти уверен, что он занимает центральное место во всем механизме адаптера/интерфейса, но я просто не могу найти его ни в одной из книг.

Кто-нибудь хочет попробовать объяснение? Во-первых, одна или две строки, которые позволяют контейнеру Dexterity притворяться, что он также является папкой; во-вторых, как изменить представление по умолчанию одного экземпляра типа Dexterity, чтобы оно представляло представление внешнего компонента?

Спасибо.


person mjtrac    schedule 03.01.2013    source источник


Ответы (1)


<сильный>1. Зарегистрируйте представление и для контейнеров dexterity.

Представление зарегистрировано для интерфейса папки Archetypes (Products.CMFCore.interfaces._content.IFolderish), но ваш контейнер ловкости не предоставляет этот интерфейс (но plone.dexterity.interfaces.IDexterityContainer). Причина может заключаться в том, что продукт и/или вид несовместимы с ловкостью.

В любом случае, вы можете попробовать это сами, зарегистрировав представление также для интерфейса IDexterityContainer, поместив немного ZCML в configure.zcml вашего пакета (см. также Создание пакета в разделе Руководство разработчика по ловкости):

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:browser="http://namespaces.zope.org/browser">

    <configure package="collective.documentviewer">

        <browser:page
            name="dvpdf-group-view"
            for="plone.dexterity.interfaces.IDexterityContainer"
            class=".views.GroupView"
            template="templates/group-view.pt"
            permission="zope2.View"
            layer=".interfaces.ILayer" />

    </configure>

</configure>

<browser:page> копируется из конфигурации collective.documentviewer. zcml, но я изменил интерфейс for= на интерфейс контейнера ловкости, чтобы представление также работало для контейнеров ловкости.

Внутренний <configure package="collective.documentviewer"> сообщает синтаксическому анализатору ZCML, что конфигурация должна применяться так, как если бы configure.zcml находился непосредственно в collective.documentviewer — это позволяет вам, например, использовать исходный шаблон (иначе вам пришлось бы копировать его или делать какие-то гадости).

Сам не проверял: может быть еще так, что вьюшка нуждается в контейнере архетипов и не работает с контейнером ловкости. Также может случиться так, что вам придется зарегистрировать больше компонентов из средства просмотра документов для контейнеров ловкости (может быть, меню? посмотрите, что зарегистрировано в исходный файл configure.zcml.

Если все работает хорошо, вам следует подумать о том, чтобы внести изменения в коллективный. -просьба к автору (учитывайте, что ловкость - это еще не plone-core). Но сначала спросите, если и как вы должны это сделать :-)

<сильный>2. Изменение представления по умолчанию

С помощью plone можно определить несколько представлений для определенного типа. Затем вид можно выбрать в меню отображения для каждого экземпляра этого типа. Если вы откроете http://localhost:8080/Plone/portal_types/manage_main и нажмете на свой тип, появится поле Available view methods, где вы можете добавить имя представления (dvpdf-group-view) в отдельной строке.

После того, как вы создадите новый объект вашего типа или посетите существующий, у вас появится меню «Отображение», в котором должно быть указано представление. Выберите его, и этот объект теперь имеет этот вид по умолчанию.

(Если вы хотите сделать представление недоступным для выбора на других объектах этого типа, вы можете просто удалить его из конфигурации типа, чтобы его больше нельзя было выбрать - существующая конфигурация вашего объекта останется).

person jone    schedule 03.01.2013
comment
Эти инструкции были идеальными - спасибо! Я видел, но забыл, что в локальный файл configure.zcml можно поместить инструкции по настройке стороннего продукта. - person mjtrac; 04.01.2013
comment
(Время редактирования истекло.) Эти инструкции были идеальными — спасибо! Представление теперь работает, и его можно включить, например, через обещанное меню «Дисплей». Я видел, но забыл, что в локальный файл configure.zcml можно поместить инструкции по настройке стороннего продукта. Я рад внести изменения в копию коллектива.documentviewer; Правильно ли я понимаю, что функциональное изменение просто добавляет plone.dexterity.interfaces.IDexterityContainer с разделителями-пробелами в строку for представления? Какие дополнительные испытания контейнера ловкости потребуются? - person mjtrac; 04.01.2013
comment
Не за что :) Добавление IDexterityContainer в тот же ZCML-тег не сработает - в этом случае for может содержать только один единственный интерфейс (в других тегах, таких как ‹adapter›, возможно несколько значений, разделенных пробелами). Добавление дополнительного тега ‹browser:view› должно выполнять свою работу, но все, что связано с ловкостью, должно находиться в пределах zcml:condition=installed plone.app.dexterity (см. здесь на условиях zcml), так что он по-прежнему работает без ловкости, но с архетипами. - person jone; 04.01.2013
comment
Предлагаю связаться с автором коллектива.documentviewer, как это сделать. Может быть, было бы достаточно просто использовать неспецифический для архетипов интерфейс в коллективном.documentviewer, который предоставляется как контейнерами архетипов, так и контейнерами ловкости. OFS.interfaces.IFolder должно работать. - person jone; 04.01.2013