[Zope3-Users] sequence of custom widgets

Frank Burkhardt fbo2 at gmx.net
Fri May 12 08:21:04 EDT 2006


Hi,

On Fri, May 12, 2006 at 10:48:52AM +0200, Marco Mariani wrote:
> 
> I've got a form which contains an object widget given by
> CustomWidgetFactory(ObjectWidget, MyClass)
> 
> Now, how can I render a Sequence widget to store a list of MyClass
> instances?

some months ago, Phillip von Weitershausen wrote such a widget for me. I'm
not using it anymore and I don't know, if it's still working. But maybe it
will help:




<configure.zcml>
	<!--
		A widget for rendering objects that are usually used
		in "lists of records" structures.
	-->
	<zope:view type="zope.publisher.interfaces.browser.IBrowserRequest"
		for="zope.schema.interfaces.IObject"
		provides="zope.app.form.interfaces.IInputWidget"
		factory=".widgets.ObjectInputWidget"
		permission="zope.Public" />
	<!--
		A template based widget for rendering edit forms out of sequences
		(eg. Lists) that are a bit more user friendly than the defaults.
	-->
	<zope:view type="zope.publisher.interfaces.browser.IBrowserRequest"
		for="zope.schema.interfaces.IList zope.schema.interfaces.IObject"
		provides="zope.app.form.interfaces.IInputWidget"
		factory=".widgets.TemplateSequenceWidget"
		permission="zope.Public" />
</configure.zcml>





<widgets.py>
from zope.app.form.browser import ObjectWidget, ListSequenceWidget
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
from zope.interface import implements
from zope.app import zapi
from zope.app.form.browser.objectwidget import ObjectWidgetView
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
from zope.app.form.browser.widget import BrowserWidget
from zope.app.form.interfaces import IDisplayWidget, IInputWidget
from zope.app.form import InputWidget
from zope.app.form.interfaces import WidgetInputError, MissingInputError
from zope.schema.interfaces import ValidationError, InvalidValue
from zope.app.i18n import MessageFactory
_=MessageFactory('mpgsite')
from zope.i18n import translate
from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
from zope.app.form.browser.textwidgets import TextWidget
from zope.app.form.browser.widget import renderElement

def ObjectInputWidget(context, request):
	"""Dispatch widget for Object schema field to widget that is
	registered for (Object, schema) where schema is the schema of the
	object."""
	class Obj(object):
		implements(context.schema)

	return zapi.getMultiAdapter((context, Obj(), request), IInputWidget)

class TemplateObjectWidget(ObjectWidget):
	"""A Widget that uses a page template"""
	def __init__(self, context, request, factory, template_, **kw):
		super(TemplateObjectWidget, self).__init__(context, request, factory, **kw)
		class TemplateObjectWidgetView(ObjectWidgetView):
			template = ViewPageTemplateFile(template_)
		self.view = TemplateObjectWidgetView(self, request)

class TemplateSequenceWidget(ListSequenceWidget):
	def __init__(self, context, field, request, template_='sequencewidget.pt', subwidget=None):
		super(TemplateSequenceWidget, self).__init__(
		    context, field, request, subwidget)
		class TemplateObjectWidgetView(ObjectWidgetView):
			template = ViewPageTemplateFile(template_)
		self.view = TemplateObjectWidgetView(self, request)

	def __call__(self):
		return self.view()
</widgets.py>




<sequencewidget.pt>
<div tal:define="sequence   context/_getRenderedValue;
                 num_items  python:len(sequence);
                 min_length context/context/min_length;
                 max_length context/context/max_length"
     i18n:domain="mpgsite"
	  tal:attributes="class context/classes"
	>
	<div class="itemstable">
	<div class="items">
  <div tal:repeat="i python:range(num_items)">
    <tal:block define="value  python:sequence[i];
                       widget python:context._getWidget(i);
                       nix    python:widget.setRenderedValue(value)">
        <input class="editcheck" type="checkbox"
               tal:attributes="name string:${context/name}.remove_${i}" />
        <tal:widget replace="structure widget" />
    </tal:block>
  </div>
  </div>
  </div>

  <input type="submit" value="Remove selected items"
			  tal:condition="python:sequence and num_items > min_length"
           tal:attributes="name string:${context/name}.remove"
           i18n:domain="zope"
           i18n:attributes="value remove-selected-items"/>

    <input type="submit" value="Add item"
           tal:attributes="name string:${context/name}.add"
			  tal:condition="python:max_length is None or num_items < max_length"
           i18n:attributes="value"
           i18n:domain="zope"/>

  <input type="hidden"
         tal:attributes="name  string:${context/name}.count;
                         value num_items" />

</div>
</sequencewidget.pt>



> I'm using formlib

Me, too :-)

Regards,

Frank


More information about the Zope3-users mailing list