Skip to main content

Version of DataGridField for use with Dexterity / z3c.form

Project description

Introduction

Licence: GNU General Public License

This module provides a z3c.form version of the Products.DataGridField. This product was developed for use with Plone4 and Dexterity.

Requirements

  • Plone 4

  • z3c.forms

  • A browser with javascript support

  • jquery 1.4.3 or later

Installation

Add collective.z3cforms.datagridfield to your buildout eggs.:

eggs=\
    ...
    collective.z3cforms.datagridfield

Example usage

This piece of code demonstrates a schema which has a table within it. The layout of the table is defined by a second schema.:

from zope import schema
from zope import interface
from plone.directives import form

form collective.z3cforms.datagridfield import DataGridFieldFactory, DictRow

class ITableRowSchema(interface.Interface):
    one = schema.TextLine(title=u"One")
    two = schema.TextLine(title=u"Two")
    three = schema.TextLine(title=u"Three")

class IFormSchema(interface.Interface):
    four = schema.TextLine(title=u"Four")
    table = schema.List(title=u"Table"
        value_type=DictRow(title=u"tablerow", schema=ITableRowSchema))

class EditForm(form.EditForm):
    extends(form.EditForm)

    grok.context(IFormSchema)
    grok.require('zope2.View')
    fields = field.Fields(IFormSchema)
    label=u"Demo Usage of DataGridField"

    fields['table'].widgetFactory = DataGridFieldFactory

Storage

The data can be stored as either a list of dicts or a list of objects. If the data is a list of dicts, the value_type is DictRow. Otherwise, the value_type is ‘schema.Object’.

If you are providing an Object content type (as opposed to dicts) you must provide your own conversion class. The default conversion class returns a list of dicts, not of your object class. See the demos.

Configuration

The widget can be customised via the updateWidgets method.

def updateWidgets(self):

super(EditForm, self).updateWidgets() self.widgets[‘table’].allow_insert = False # Enable/Disable the insert button on the right self.widgets[‘table’].allow_delete = False # Enable/Disable the delete button on the right self.widgets[‘table’].auto_append = False # Enable/Disable the auto-append feature

The widget contains an attribute ‘columns’ which is manipulated to hide column titles.

Manipulating the Sub-form

The DataGridField makes use of a subform to build each line. The main DataGridField contains a DataGridFieldObject for each line in the table. The DataGridFieldObject in turn creates the DataGridFieldObjectSubForm to store the fields.

There are two callbacks to your main form:

datagridInitialise(subform, widget)

  • This is called when the subform fields have been initialised, but before the widgets have been created. Field based configuration could occur here.

datagridUpdateWidgets(subform, widgets, widget)

  • This is called when the subform widgets have been created. At this point, you can configure the widgets, e.g. specify the size of a widget.

Notes

I have attempted to keep the markup close to Products.DataGridField, so that the styling approach is the same.

TODO

  • Testing

  • The mechanism to hide/omit columns is cumbersome. This needs to be revisited.

  • Better styling of table in read-only mode. Merge the display and input versions of the layout.

  • Move rows up / down

  • kss validation - highlight the incorrect row, rather than the entire widget. Possibly show the error message in the field cell.

  • hidden mode

Demo

Examples are in the package collective.z3cform.datagridfield_demo.

References

Changelog

0.5 (2011-02-08)

  • Put in the DictRow class (tks Martin Aspeli)

  • Moved the demo code out to a separate package collective.z3cform.datagridfield_demo (tks Laurence Rowe).

  • Removed superfluous lines from setup.py (tks Laurence Rowe).

  • Removed unnessary dependency on dexterity (tks Laurence Rowe).

  • Removed unnessary dependency on grok (tks Laurence Rowe).

0.4 (2011-02-06)

  • Renamed the demo pages. The starting point is now @@demo-collective.z3cform.datagrid .

  • The widget can now be configured via the updateWidgets method. It is no longer necessary to create a custom factory.

  • The columns can now be omitted.

  • Provide a set of demo views for Object access.

0.3 (2011-02-04)

  • The auto-append functionality did not bind correctly for popup forms. I switched to using jQuery.live() instead of binding at document load time.

  • Added a menu to the demo pages

  • Added a display only form option.

  • Fixed the restructured text of the main README.txt so that it will show more friendly in PyPI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

collective.z3cform.datagridfield-0.5.tar.gz (25.4 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page