Использование коллективный.z3cform.datagridfield с Ловкостью
Я новичок в Plone, и я пытаюсь использовать DataGridField с ловкостью. Цель - использовать Plone 4.1 для публикации результатов исследования юзабилити в нашей интрасети. Я создал пользовательский тип документа (называемый "Взаимодействие"), и я хочу использовать сетку данных для одного из полей, чтобы смоделировать таблицу, содержащую два столбца, показывающих сводку результатов.
В соответствии с инструкциями, приведенными на сайте http://plone.org/products/collective.z3cform.datagridfield, я успешно добавил яйцо collect.z3cform.datagrid в список яиц в моей сборке, и я вижу, что новое дополнение отображается как активное в моем списке дополнений. для моего сайта. Я создал простой Python-модуль схемы, который описывает документ, показывающий результаты исследования юзабилити, которое я документирую:
from five import grok
from zope import schema
from zope import interface
from plone.directives import form
from plonetheme.mytheme import InteractionMessageFactory as _
from plone.app.textfield import RichText
from z3c.form import field, button
from Products.CMFCore.interfaces import IFolderish
from collective.z3cform.datagridfield import DataGridFieldFactory, DictRow
class IFinding(interface.Interface):
summary = schema.TextLine(title=_(u"Summary"))
percentage = schema.TextLine(title=_(u"Percentage"))
class IInteraction(form.Schema):
findings = schema.List(
title=_(u"Overview of findings"),
required=False,
value_type=DictRow(
title=_(u"Finding"),
schema=IFinding
)
)
class EditForm(form.EditForm):
grok.context(IInteraction)
grok.require('zope2.View')
fields = field.Fields(IInteraction)
fields['findings'].widgetFactory = DataGridFieldFactory
Я зарегистрировал свой новый тип контента Interaction, добавив строку в файл examples / default / types.xml:
<?xml version="1.0"?>
<object meta_type="Plone Types Tool" name="portal_types">
<property name="title">Controls the available content types in your portal</property>
<object meta_type="Dexterity FTI" name="interaction" />
<!-- -*- extra stuff goes here -*- -->
</object>
Для полноты картины я также включил соответствующий файл profile / default / types / взаимодействия.xml:
<?xml version="1.0"?>
<object name="interaction" meta_type="Dexterity FTI"
xmlns:i18n="http://xml.zope.org/namespaces/i18n">
<property name="title">Interaction</property>
<property name="description">An item in the interactions dictionary</property>
<property name="icon_expr">string:${portal_url}/document_icon.png</property>
<property name="factory">interaction</property>
<property name="link_target"></property>
<property name="immediate_view">view</property>
<property name="global_allow">True</property>
<property name="filter_content_types">True</property>
<property name="allowed_content_types"/>
<property name="allow_discussion">False</property>
<property name="default_view">view</property>
<property name="view_methods">
<element value="view"/>
</property>
<property name="default_view_fallback">False</property>
<property name="add_permission">cmf.AddPortalContent</property>
<property name="klass">plone.dexterity.content.Item</property>
<property name="behaviors">
<element value="plone.app.dexterity.behaviors.metadata.IDublinCore"/>
<element value="plone.app.content.interfaces.INameFromTitle"/>
<element value="collective.flowplayer.behaviors.IFlowplayerFile"/>
</property>
<property name="schema">plonetheme.mytheme.interaction.IInteraction</property>
<property name="model_file"></property>
<alias from="(Default)" to="(dynamic view)"/>
<alias from="edit" to="@@edit"/>
<alias from="sharing" to="@@sharing"/>
<alias from="view" to="(selected layout)"/>
<action title="View" action_id="view" category="object" condition_expr=""
icon_expr="" link_target="" url_expr="string:${object_url}"
visible="True">
<permission value="View"/>
</action>
<action title="Edit" action_id="edit" category="object" condition_expr=""
icon_expr="" link_target="" url_expr="string:${object_url}/edit"
visible="True">
<permission value="Modify portal content"/>
</action>
</object>
Когда я перехожу к форме "Добавить" для своего пользовательского типа Interaction, я получаю стандартный виджет "Добавить / удалить" элемента списка "Ловкость", а не виджет таблицы таблицы данных, который я видел в примерах коллективного файла.z3cform.datagrid_demo. Когда я пытаюсь сохранить пользовательский тип, виджет со списком Ловкости отображает ошибку проверки: "Системе не удалось обработать указанное значение".
Есть ли другой код, который мне нужно добавить? Нужно ли переопределять шаблоны представлений Dexterity Add/EditForm?
3 ответа
Вы делаете вещи, как задокументировано, но это не сработает. Это известная проблема:
Это работает для меня в Plone 5.0.4
from zope import schema
from zope.interface import Interface
from plone.supermodel import model
from plone.autoform import directives
from collective.z3cform.datagridfield import DataGridFieldFactory, DictRow
from plonetheme.mytheme import InteractionMessageFactory as _
class IFindingRow(Interface):
summary = schema.TextLine(title=_(u'Summary'),
required=False)
percentage = schema.TextLine(title=_(u'Percentage'),
required=False)
class IInteraction(model.Schema):
directives.widget(findings=DataGridFieldFactory)
findings= schema.List(
title=_(u"Overview of findings"),
value_type=DictRow(title=_(u"Finding"),
schema=IFindingRow),
required=False,
)
Попробуйте использовать подсказки формы Ловкость:
...
from zope import schema
from zope.interface import Interface
from plone.directives import form
from collective.z3cform.datagridfield import DataGridFieldFactory, DictRow
from plonetheme.mytheme import InteractionMessageFactory as _
...
class IFindingRow(Interface):
summary = schema.TextLine(title=_(u'Summary'),
required=False)
percentage = schema.TextLine(title=_(u'Percentage'),
required=False)
class IInteraction(form.Schema):
...
form.widget(findings=DataGridFieldFactory)
findings= schema.List(
title=_(u"Overview of findings"),
value_type=DictRow(title=_(u"Finding"),
schema=IFindingRow),
required=False,
)