Plone 4.3 - Как собрать пакет Form с помощью Zc3.form без Grok?

Я пытаюсь создать пакет форм для веб-сайта Plone. В настоящее время я работаю с Plone 4.3. Раньше я использовал Dexterity с библиотеками Five.grok и Grok. Но после прочтения раздела этой статьи о миграции Plone 4.3 и зависимостях Five.grok: http://developer.plone.org/components/grok.html похоже, что разработчики Plone вообще отказываются от использования grok.

Итак, должен ли я отказаться от использования Grok и как мне это сделать, когда вся текущая документация в настоящее время использует Grok? Кроме того, я разрабатываю с машины на базе Windows.


person Herr Josua    schedule 30.09.2013    source источник


Ответы (1)


Первое создание формы без grok не так сложно и не зависит от вашей операционной системы.

Создание формы всегда одно и то же. Вот как я поступаю:

  • Некоторый импорт
from Products.Five.browser import BrowserView
from plone.autoform.form import AutoExtensibleForm
from plone.app.z3cform import layout
from zope import interface
from zope import schema
from zope import component
from z3c.form import form

from collective.my.i18n import _
  • Создать схему
class AddFormSchema(interface.Interface):
    what = schema.Choice(
        title=_(u"What"),
        vocabulary="plone.app.vocabularies.UserFriendlyTypes"
    )
    where = schema.Choice(
        title=u"Where",
        vocabulary="collective.my.vocabulary.groups"
    )
  • создать универсальный адаптер для заполнения формы из любого места
class AddFormAdapter(object):
    interface.implements(AddFormSchema)
    component.adapts(interface.Interface)
    def __init__(self, context):
        self.what = None
        self.where = None
  • Затем напишите форму
class AddForm(AutoExtensibleForm, form.Form):
    schema = AddFormSchema
    form_name = 'add_content'
  • Добавить вид
class AddButton(layout.FormWrapper):
    """Add button"""
    form = AddForm
  • Теперь время ZCML, это шаг, который вам не нужен при использовании grok:
<adapter factory=".my.AddFormAdapter"/>
<browser:page
  for="*"
  name="my.addbutton"
  class=".my.AddButton"
  template="addbutton.pt"
  permission="zope2.View"
  />

Если вы перейдете от грока:

Это зависит от того, что вы делаете. Для аддона я говорю да, но для проекта это зависит от вас.

Grok не является частью уже большой Zope. Таким образом, добавление зависимости всегда должно выполняться только в случае необходимости. Grok - это вариант, поэтому я никогда его не использовал.

person toutpt    schedule 03.10.2013
comment
+1 за очень хороший ответ, на самом деле можно было бы сразу скопировать в документы :) Просто интересно, нужен ли здесь адаптер, соответственно, не могли бы вы привести пример его использования? - person Ida; 05.10.2013
comment
благодаря. z3cform использует этот адаптер для заполнения формы в зависимости от контекста. Например, здесь вы можете предварительно загрузить where с текущим содержимым, используя что-то вроде self.where = IUUID(self.context) - person toutpt; 07.10.2013
comment
Ах хорошо, это звучит разумно. Мерси бис за полезную информацию! - person Ida; 08.10.2013