[Checkins] SVN: Sandbox/pcardune/z3cFormJS/trunk/z3c/formjs/README.txt added some doctests for a javascript event system.

Paul Carduner paulcarduner at gmail.com
Wed Jun 6 07:44:49 EDT 2007


Log message for revision 76399:
  added some doctests for a javascript event system.

Changed:
  U   Sandbox/pcardune/z3cFormJS/trunk/z3c/formjs/README.txt

-=-
Modified: Sandbox/pcardune/z3cFormJS/trunk/z3c/formjs/README.txt
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/z3c/formjs/README.txt	2007-06-06 11:28:46 UTC (rev 76398)
+++ Sandbox/pcardune/z3cFormJS/trunk/z3c/formjs/README.txt	2007-06-06 11:44:49 UTC (rev 76399)
@@ -5,7 +5,57 @@
 The z3c.formjs package provides additional support for javascript and
 ajax for the z3c.form package.
 
+  >>> from z3c.formjs import interfaces as jsinterfaces
 
+Events
+======
+
+z3c.formjs.jsevent provides tools for working with javascript events.
+
+  >>> from z3c.formjs import jsevent
+
+There are all the javascript event types reproduced in python:
+
+  >>> jsevent.CLICK
+  "click"
+  >>> jsevent.DBLCLICK
+  "dblclick"
+  >>> jsevent.CHANGED
+  "changed"
+  >>> jsevent.LOAD
+  "load"
+
+These are actually objects that implement IJSEvent.
+
+  >>> jsinterfaces.IJSEvent.providedBy(jsevent.CLICK)
+
+TODO: Find out what all the other javascript events are and stick them
+in here.
+
+These events have javascript handlers which can be dynamically
+generated so we will define a handler using a function.
+
+  >>> def simpleHandler():
+  ...     return 'alert("Some event was called!");'
+
+Another aspect of javascript events is that they get attached to a
+specific dom element using an id.  So let us make an imaginary dom
+element id.
+
+  >>> id = "form-field-age"
+
+Different javascript libraries handle events in different ways, so we
+have to specify which javascript library we want to use to handle the
+events so as to render the javascript correctly.  This is done using
+browser layers.  The formjs framework implements renderers for jquery.
+
+  >>> from jquery.layer import IJQueryJavaScriptBrowserLayer
+  >>> renderer = jsinterfaces.IJSEventRenderer(jsevent.CLICK,
+  ...                                          IJQueryJavaScriptBrowserLayer)
+  >>> renderer.render(simpleHandler, id)
+  '$("#form-field-age").bind("click", function(){alert("Some event was called!");});'
+
+
 Buttons
 =======
 
@@ -14,7 +64,7 @@
 side action using javascript.  z3c.formjs.button provides buttons with
 javascript event hooks.
 
-  >>> from.z3c.formjs import jsbutton
+  >>> from z3c.formjs import jsbutton
 
 JSButton
 --------
@@ -32,7 +82,6 @@
 
   >>> from z3c.form import button
   >>> from z3c.form import interfaces
-  >>> from z3c.formjs import interfaces as jsinterfaces
   >>> class Form(object):
   ...     zope.interface.implements(
   ...         interfaces.IButtonForm, interfaces.IHandlerForm)
@@ -43,7 +92,7 @@
   ...     def apply(self, action):
   ...         return 'alert("You Clicked the Apply Button!");'
   ...
-  ...     @jsbutton.handler(IButtons['cancel'], event=jsbutton.DBLCLICK)
+  ...     @jsbutton.handler(IButtons['cancel'], event=jsevent.DBLCLICK)
   ...     def cancel(self, action):
   ...         return 'alert("You Double Clicked the Cancel Button!");'
 
@@ -57,7 +106,7 @@
 Let' now create an action manager for the button manager in the form. To do
 that we first need a request and a form instance:
 
-  >>> from z3c.form.testing import TestRequest
+  >>> from z3c.formjs.testing import TestRequest
   >>> request = TestRequest()
   >>> form = Form()
 
@@ -146,7 +195,7 @@
   >>> textWidgetTemplate = tempfile.mktemp('text.pt')
   >>> open(textWidgetTemplate, 'w').write('''\
   ... <input type="text" name="" value=""
-  ...        tal:attributes="name view/name; value view/value;" />\
+  ...        tal:attributes="id view/name; name view/name; value view/value;" />\
   ... ''')
 
   >>> from z3c.form.widget import WidgetTemplateFactory
@@ -166,7 +215,7 @@
   >>> def ageClickHandler():
   ...     return 'alert("This Widget was Clicked!");'
 
-  >>> jsinterfaces.IJSEventWidget(age).addEvent("click", ageClickHandler)
+  >>> jsinterfaces.IJSEventWidget(age).addEvent(jsevent.CLICK, ageClickHandler)
 
 Now we can update and render this widget.
 
@@ -178,16 +227,13 @@
 However, we can render it using the IJSEventWidget adapter to have the
 event attached.
 
-  >>> IJSEventWidget(age).render()
-  <input type="text" name="age" value="39" />
+  >>> jsinterfaces.IJSEventWidget(age).render()
+  <input type="text" id="age" name="age" value="39" />
   <script type="javascript">
-    $('[name=age]').bind("click", function(){alert("This Widget was Clicked!");});
+    $('#age').bind("click", function(){alert("This Widget was Clicked!");});
   </script>
 
-This uses the jquery API to bind the event, so be sure to have jquery
-in the rendered page.
 
-
 Rendering Widgets with Attached Events
 --------------------------------------
 
@@ -221,7 +267,7 @@
   >>> class PersonAddForm(form.AddForm):
   ...
   ...     fields = field.Fields(IPerson)
-  ...     prefix = form
+  ...     prefix = "form"
   ...     def create(self, data):
   ...         return Person(**data)
   ...
@@ -235,7 +281,7 @@
   ...     def ageClickEvent(self):
   ...         return 'alert("The Age was Clicked!");'
   ...
-  ...     @eventHandler('gender', event=jsbutton.CHANGED)
+  ...     @eventHandler('gender', event=jsevent.CHANGED)
   ...     def genderChangeEvent(self):
   ...         return 'alert("The Gender was Changed!");'
 
@@ -246,8 +292,8 @@
   >>> add = PersonAddForm(root, request)
   >>> add.update()
 
-  >>> IJSEventWidgetManager(add.widgets).renderEvents()
+  >>> jsinterfaces.IJSEventWidgetManager(add.widgets).renderEvents()
   <script type="javascript">
-    $('[name=formage]').bind("click", function(){alert("The Age was Clicked!");});
-    $('[name=formgender]').bind("dblclick", function(){alert("The Gender was Changed!");});
+    $("#form-age").bind("click", function(){alert("The Age was Clicked!");});
+    $("#form-gender").bind("dblclick", function(){alert("The Gender was Changed!");});
   </script>



More information about the Checkins mailing list