Hi David,

I'm playing with a simple product called JWFind, derived from Boring
(http://www.zope.org/Members/gtk/Boring) now. The product sits in the
products directory, can be added and removed using ZMI, it seems OK.

Note that Boring is 8.5 years old. I haven't looked at it, but I really doubt it follows current best practice. If you want a starting point, I suggest you install ZopeSkel and use the 'plone' template.

Because I'm willing to use it in Plone, the Zope version is 2.10.6-final.

Now, I'm trying to handle the view of product using form made of
z3c.form. There is a problem. Currently, I'm getting

Traceback (innermost last):
  Module ZPublisher.Publish, line 119, in publish
  Module ZPublisher.mapply, line 88, in mapply
  Module ZPublisher.Publish, line 42, in call_object
  Module Products.JWFind.JWFind, line 55, in index_html
  Module z3c.form.form, line 189, in __call__
  Module z3c.form.form, line 184, in update
  Module z3c.form.form, line 134, in update
  Module z3c.form.form, line 120, in updateWidgets
  Module zope.component._api, line 103, in getMultiAdapter
  Module zope.component._api, line 103, in getMultiAdapter
ComponentLookupError: ((<Products.JWFind.Person.Person object at
0xb5003b2c>, <HTTPRequest, URL=http://localhost:8091/pokus/index_html>,
<JWFind at /pokus>), <InterfaceClass z3c.form.interfaces.IWidgets>, u'')

It looks like oyu haven't wired up z3c.form properly. You need to use plone.z3cform if you're using z3c.form in Plone. Look at its README for details.

I guess, the error tells, that something implementing ``IWidgets``
cannot be found. But, I have no idea, how to deal with it. Maybe, should
I prepare the specific layer and skin to be able to use z3cforms and If
so, how to do it and especially how to register it properly? Or is there
a problem with the form definition itself? Or should I register
something to zope in addition to registration made in __init__?

plone.z3cform takes care of this. The registration is in configure.zcml these days. We tend to keep our __init__.py's empty if we can (AT content types being the big example).

The relevant part of product source JWFind.py:

    def index_html(self, REQUEST=None):
        """JWFind Form"""
        out = Person(self, REQUEST)()
        return out.PersonView

This may work, but it's not really how you're meant to build forms. Please look at the plone.z3cform and z3c.form documentation on pypi.

The form is in separate file Person.py:

from zope import interface, schema
from z3c.form import form, field, button
from plone.app.z3cform.layout import wrap_form

class IPerson(interface.Interface):
    age = schema.Int(
        title=u"Age",
        required=True)

class Person(form.Form):
     fields = field.Fields(IPerson)
     ignoreContext = True # don't use context to get widget data
     label = u"Please enter your age"

     @button.buttonAndHandler(u'Apply')
     def handleApply(self, action):
         data, errors = self.extractData()
         print data['age'] # ... or do stuff

PersonView = wrap_form(Person)

Ah, I see that you *are* using plone.z3cform. In this case, just make sure your PersonView is registered with browser:page and that plone.z3cform's ZCML is loaded. You should then be able to access that. The index_html() thing is almost certainly wrong.

Martin

--
Author of `Professional Plone Development`, a book for developers who
want to work with Plone. See http://martinaspeli.net/plone-book


_______________________________________________
Product-Developers mailing list
[email protected]
http://lists.plone.org/mailman/listinfo/product-developers

Reply via email to