[Checkins] SVN: z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/ Add an example of a custom event with a ClientEvent object. May turn into something more useful.

Paul Carduner paulcarduner at gmail.com
Thu Jul 10 17:48:57 EDT 2008


Log message for revision 88217:
  Add an example of a custom event with a ClientEvent object.  May turn into something more useful.

Changed:
  U   z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/configure.zcml
  U   z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/interfaces.py
  U   z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/jsclientevent.py
  U   z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/jsclientevent.txt

-=-
Modified: z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/configure.zcml
===================================================================
--- z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/configure.zcml	2008-07-10 21:34:12 UTC (rev 88216)
+++ z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/configure.zcml	2008-07-10 21:48:56 UTC (rev 88217)
@@ -165,5 +165,10 @@
       handler=".jsclientevent.serverToClientEventLoader"
       />
 
+  <subscriber
+      for=".interfaces.IClientEvent"
+      handler=".jsclientevent.serverToClientEventLoader"
+      />
 
+
 </configure>

Modified: z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/interfaces.py
===================================================================
--- z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/interfaces.py	2008-07-10 21:34:12 UTC (rev 88216)
+++ z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/interfaces.py	2008-07-10 21:48:56 UTC (rev 88217)
@@ -19,6 +19,7 @@
 import zope.interface
 import zope.schema
 from zope.viewlet.interfaces import IViewletManager
+from zope.component.interfaces import IObjectEvent
 
 from z3c.form.interfaces import IButton, IButtonHandler, IManager, IWidget
 from z3c.form.interfaces import ISelectionManager, IForm
@@ -426,6 +427,8 @@
         title=u"Event Injections",
         description=u"The javascript code to be injected that handles events.")
 
+class IClientEvent(IObjectEvent):
+    """Marker interface for an event that has an effect on the client."""
 
 class IEventRenderer(zope.interface.Interface):
     """A representation of an event for a client side framework.

Modified: z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/jsclientevent.py
===================================================================
--- z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/jsclientevent.py	2008-07-10 21:34:12 UTC (rev 88216)
+++ z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/jsclientevent.py	2008-07-10 21:48:56 UTC (rev 88217)
@@ -21,6 +21,7 @@
 import zope.interface
 from zope.interface import adapter
 from zope.viewlet import viewlet
+from zope.component.interfaces import ObjectEvent
 
 from zope.security.management import getInteraction
 from zope.publisher.interfaces.browser import IBrowserRequest
@@ -119,12 +120,15 @@
         return '<%s>' % (self.__class__.__name__)
 
 
+class ClientEvent(ObjectEvent):
+    zope.interface.implements(interfaces.IClientEvent)
+
+
 @zope.component.adapter(zope.component.interfaces.IObjectEvent)
 def serverToClientEventLoader(event):
     """Event handler that listens for server side events
     and stores the event in the request to be picked up by
     the form and rendered as a client side function call."""
-
     # Step 1: Get the interaction.
     try:
         interaction = getInteraction()

Modified: z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/jsclientevent.txt
===================================================================
--- z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/jsclientevent.txt	2008-07-10 21:34:12 UTC (rev 88216)
+++ z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/jsclientevent.txt	2008-07-10 21:48:56 UTC (rev 88217)
@@ -8,7 +8,7 @@
 injected JavaScript code.  This is not to be confused with "action
 events" that occur on the client such as "onClick".
 
-  >>> from z3c.formjs import jsclientevent
+  >>> from z3c.formjs import interfaces, jsclientevent
 
 There are several components that must work together to propagate the
 events to the client:
@@ -337,14 +337,21 @@
 well.  In order to avoid a full page reload, the rendered
 viewlets can update themselves by listening for these events.
 
-Let's create another view that sends event notifications to the client.
+Let's create another view that sends event notifications to the
+client.  One notification will be for object modified events, and
+another notification will be for a generic ClientEvent, which will get
+notified when changes are applied.
 
   >>> class ArticleEditForm(jsclientevent.ClientEventsForm,
   ...                       form.EditForm):
   ...     fields = field.Fields(IArticle)
   ...     jsClientListeners = jsclientevent.ClientEventHandlers(
-  ...         ((Interface, IObjectModifiedEvent,), jsclientevent.NotifyClientHandler())
+  ...         ((Interface, IObjectModifiedEvent,), jsclientevent.NotifyClientHandler()),
+  ...         ((Interface, interfaces.IClientEvent,), jsclientevent.NotifyClientHandler()),
   ...         )
+  ...     def applyChanges(self, data):
+  ...         super(ArticleEditForm, self).applyChanges(data)
+  ...         notify(jsclientevent.ClientEvent(self))
 
 Now we will instantiate the form and modify the object.
 
@@ -358,6 +365,8 @@
   >>> print editform.eventInjections
   $() .trigger("zope.lifecycleevent.interfaces.IObjectModifiedEvent", {})
       .trigger("zope.component.interfaces.IObjectEvent", {});
+  $() .trigger("z3c.formjs.interfaces.IClientEvent", {})
+      .trigger("zope.component.interfaces.IObjectEvent", {});
 
 
 Lets not forget to end the interaction we created.
@@ -377,4 +386,6 @@
   <script type="text/javascript">
     $() .trigger("zope.lifecycleevent.interfaces.IObjectModifiedEvent", {})
         .trigger("zope.component.interfaces.IObjectEvent", {});
+    $() .trigger("z3c.formjs.interfaces.IClientEvent", {})
+        .trigger("zope.component.interfaces.IObjectEvent", {});
   </script>



More information about the Checkins mailing list