Могу ли я использовать z3c.form на портлетах Plone вместо zope.formlib? - PullRequest
5 голосов
/ 03 марта 2011

Какие изменения мне нужно сделать, учитывая, что у меня есть сгенерированный пакет формуляра ZopeSkel plone3_portlet formlib?Т.е.:

  • От каких классов я должен наследовать?
  • Какие крючки я должен предоставить?

Могу ли я использовать его полностью, включая пять.grok and plone.directives.form?

Ответы [ 7 ]

7 голосов
/ 04 марта 2011

Да, вы можете сделать это, вам нужны формы Add / Edit ... Вот что я сделал для проекта Jarn, вы можете использовать AddForm и EditForm так же, как вы использовали бы их эквивалент formlib:

from Acquisition import aq_parent, aq_inner
from plone.app.portlets import PloneMessageFactory as _
from plone.app.portlets.browser.interfaces import IPortletAddForm
from plone.app.portlets.browser.interfaces import IPortletEditForm
from plone.app.portlets.interfaces import IPortletPermissionChecker
from z3c.form import button
from z3c.form import form
from zope.component import getMultiAdapter
from zope.interface import implements


class AddForm(form.AddForm):
    implements(IPortletAddForm)

    label = _(u"Configure portlet")

    def add(self, object):
        ob = self.context.add(object)
        self._finishedAdd = True
        return ob

    def __call__(self):
        IPortletPermissionChecker(aq_parent(aq_inner(self.context)))()
        return super(AddForm, self).__call__()

    def nextURL(self):
        addview = aq_parent(aq_inner(self.context))
        context = aq_parent(aq_inner(addview))
        url = str(getMultiAdapter((context, self.request),
                                  name=u"absolute_url"))
        return url + '/@@manage-portlets'

    @button.buttonAndHandler(_(u"label_save", default=u"Save"), name='add')
    def handleAdd(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return
        obj = self.createAndAdd(data)
        if obj is not None:
            # mark only as finished if we get the new object
            self._finishedAdd = True

    @button.buttonAndHandler(_(u"label_cancel", default=u"Cancel"),
                             name='cancel_add')
    def handleCancel(self, action):
        nextURL = self.nextURL()
        if nextURL:
            self.request.response.redirect(nextURL)
        return ''


class EditForm(form.EditForm):
    """An edit form for portlets.
    """

    implements(IPortletEditForm)

    label = _(u"Modify portlet")

    def __call__(self):
        IPortletPermissionChecker(aq_parent(aq_inner(self.context)))()
        return super(EditForm, self).__call__()

    def nextURL(self):
        editview = aq_parent(aq_inner(self.context))
        context = aq_parent(aq_inner(editview))
        url = str(getMultiAdapter((context, self.request),
                                  name=u"absolute_url"))
        return url + '/@@manage-portlets'

    @button.buttonAndHandler(_(u"label_save", default=u"Save"), name='apply')
    def handleSave(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return
        changes = self.applyChanges(data)
        if changes:
            self.status = "Changes saved"
        else:
            self.status = "No changes"

        nextURL = self.nextURL()
        if nextURL:
            self.request.response.redirect(self.nextURL())
        return ''

    @button.buttonAndHandler(_(u"label_cancel", default=u"Cancel"),
                             name='cancel_add')
    def handleCancel(self, action):
        nextURL = self.nextURL()
        if nextURL:
            self.request.response.redirect(nextURL)
        return ''
3 голосов
/ 04 марта 2011

Открытый исходный код коллективного коллектива mddle.dancing.browser.portlets.channelsubscribe имеет реализации портлетов, написанных на z3c.form.

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

См. http://dev.plone.org/collective/browser/collective.dancing/trunk/collective/dancing/browser/portlets/channelsubscribe.py или http://pypi.python.org/pypi/collective.dancing

2 голосов
/ 03 марта 2011

Это, безусловно, можно сделать.Мы уже используем это в проекте 4.0 Plone, где коллега создал базовые реализации IPortletAddForm и IPortletEditForm, используя z3c.form.form.AddForm и z3c.form.form.EditForm базовые классы соответственно.

Обратите внимание, что это Plone 4.0, а не3.x, поэтому ваш пробег может варьироваться.

Реализация представляет собой базовое переопределение их оригиналов zope.formlib с простыми обработчиками buttonAndHandler для обработки Add (добавить форму), Save (редактировать форму) и Cancel (оба) кнопки.

Я думаю, у нас есть планы внести базовые реализации обратно в plone.app.portlets, я спрошу его об этом.

1 голос
/ 10 октября 2014

Если вы, как и я, нашли этот вопрос спустя 2 года, возможно, было бы полезно знать, что:

  1. решение ggozad было интегрировано в plone.app.portlets

  2. Вам все еще нужно написать портлет поверх его решения (с которым мне было трудно работать)

  3. Я собрал вариантмоего рабочего кода здесь

  4. Если вы не используете Plone 5, вам нужно будет сохранить plone.app.portlets <3.0 </p>

Большое спасибо автору этого пакета (обратите внимание, что это было написано ДО того, как решение ggozad было интегрировано в plone.app.portlets)

1 голос
/ 03 марта 2011

Я знаю, что это неполный ответ, но я верю, что он укажет вам правильное направление.Продукт plonezohointegration использует z3cforms для своих портлетов, вы можете посмотреть, как он это сделал.

Документация о том, как это делается , содержится в документации разработчика сообщества plone

1 голос
/ 03 марта 2011

Я полагаю, что Дэвид Глик достиг этого с Каруселью .Его документация указывает на известный хороший набор , который работал для меня.

1 голос
/ 03 марта 2011

Я думаю, что теоретически это возможно, да, но я не уверен, что кто-то пробовал это. Вероятно, это то, что нам нужно сделать в Plone в какой-то момент, так что было бы здорово, если бы вам удалось заставить его работать.

Я бы начал с рассмотрения того, что делают существующие базовые классы форм портлетов, и попытался бы подражать этому в z3c.form. Я также, вероятно, пока начну без plone.directives.form и plone.autoform, так как это, вероятно, немного смущает вас для начала. Лучше добавить их позже.

Главное, я подозреваю, будет зарегистрировать новый шаблон по умолчанию для новых форм, а затем добавить несколько хуков для фактических операций добавления и редактирования в соответствии с базовыми формами plone.app.portlets.

...