2011-03-02 7 views

Respuesta

7

Sí, se puede hacer eso, lo que necesita es las formas Agregar/Editar ...Esto es lo que hice para un proyecto de Jarnés, puede utilizar AddForm y EditForm la misma manera que usarían su equvalent 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 '' 
+0

Más información en: http: // plone .org/documentation/manual/plone-community-developer-documentation/forms/z3c.form # embedding-z3c-form-forms-in-portlets-viewlets-and-views – marcosfromero

+0

La información que señala marcosfromero trata sobre hacer algo diferente, es decir, incrustando un formulario en un viewlet. – ggozad

+0

No solo viewlets, sino también portlets, como se lee: > A continuación se muestra un ejemplo de cómo poner el formulario basado en z3c.form en un portlet. – marcosfromero

1

Creo que es teóricamente posible, sí, pero no estoy seguro de que alguien lo haya intentado. Probablemente sea algo que tendremos que hacer en Plone en algún momento, por lo que sería genial si lograras que funcione.

Comenzaría por ver qué hacen las clases base de las clases base de los portlet existentes y trataré de emular eso en z3c.form. Probablemente también comenzaría sin plone.directives.form y plone.autoform por ahora, ya que eso probablemente te confunda un poco para empezar. Es mejor agregarlos más tarde.

Lo principal, sospecho, será registrar una nueva plantilla predeterminada para los nuevos formularios, y luego agregar algunos ganchos para las operaciones reales de "agregar" y "editar" según los formularios base de plone.app.portlets.

1

Creo que David Glick ha logrado esto con Carousel. Su documentación apunta a un known-good set que funcionó para mí.

+0

Creo que debe estar equivocado; Carrusel no proporciona ningún portlet. –

+0

¡De hecho! Lo mezclé en mi mente porque estaba trabajando en el uso de Carrusel en un portlet. – SteveM

2

Esto sin duda se puede hacer. Ya usamos esto en un proyecto 4.0 Plone, donde un colega creó una base de implementaciones IPortletAddForm y IPortletEditForm usando z3c.form.form.AddForm y z3c.form.form.EditForm clases base, respectivamente.

Tenga en cuenta que esto es Plone 4.0, no 3.x, por lo que su kilometraje puede variar.

La implementación es una reimplementación básica de sus originales zope.formlib, con simples controladores buttonandhandler para manejar los botones Agregar (agregar formulario), Guardar (editar formulario) y Cancelar (ambos).

Creo que tenemos planes de contribuir con las implementaciones de formularios base a plone.app.portlets, le preguntaré al respecto.

+0

Dicho colega ahora ha publicado el código en sí. :-) –

3

El código abierto collective.dancing.browser.portlets.channelsubscribe moudle tiene implementaciones de portlets escritos en z3c.form.

Sin embargo, es un gran desastre. Yo recomendaría no hacer nada elegante con los portlets Plone debido a su complejidad que explotará en tu cara a lo grande.

Ver http://dev.plone.org/collective/browser/collective.dancing/trunk/collective/dancing/browser/portlets/channelsubscribe.py o http://pypi.python.org/pypi/collective.dancing

+1

Acabo de ver la respuesta del usuario642276 que apunta a documentos que explican cómo funciona, http: //plone.org/documentation/manual/plone-community-developer-documentation/forms/z3c.form#embedding-z3c-form- forms-in-portlets-viewlets-and-views –

+0

actualizar el enlace de arriba http://docs.plone.org/develop/plone/forms/z3c.form.html#id68 – Dek4nice

1

Si como yo, has encontrado esta pregunta 2 años más tarde, entonces podría ser útil saber que: solución

  1. de ggozad se ha integrado en plone.app.portlets

  2. todavía es necesario escribir el portlet en la parte superior de su solución (que me encontré difícil averiguar)

  3. He creado una variación de mi código de trabajo here

  4. menos que esté utilizando Plone 5 tendrá que mantener plone.app.portlets < 3,0

Un mucho crédito para el autor de this package (tenga en cuenta que esto fue escrito ANTES de que la solución de ggozad se haya integrado en plone.app.portlets)

Cuestiones relacionadas