[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