Wiki source code of ERPrototaculous
Version 285.1 by Ravi Mendis on 2009/07/17 01:57
Hide last authors
author | version | line-number | content |
---|---|---|---|
![]() |
100.1 | 1 | == Introduction == |
2 | |||
![]() |
209.1 | 3 | ERPrototaculous was developed to provide the ajax functionality in ERDivaLook. |
4 | |||
5 | === What is ERPrototaculous? === | ||
6 | |||
![]() |
233.1 | 7 | Features include: |
![]() |
209.1 | 8 | |
![]() |
233.1 | 9 | * 'Organic' support for Prototype and Scriptaculous in WebObjects. |
![]() |
283.1 | 10 | ** Light-weight dynamic elements to support Prototype |
11 | ** No custom patches to Prototype | ||
12 | ** Sans the need to extend Prototype | ||
![]() |
261.1 | 13 | * Use of [[Unobtrusive Javascript>>http://en.wikipedia.org/wiki/Unobtrusive_JavaScript]]. |
14 | * Pseudo-stateless ajax responses | ||
![]() |
245.1 | 15 | * A set of widgets in the Prototype + Scriptaculous family. |
![]() |
233.1 | 16 | |
17 | ==== Unobtrusive Javascript in ERPrototaculous ==== | ||
18 | |||
19 | Unobtrusive javascript is used in contrast to on-demand style of ajax programming. | ||
![]() |
283.1 | 20 | By including Javascript as well as CSS globally in the page wrapper, CSS and Javascript don't have to load inside each and every ajax requests. |
21 | This keeps the ajax responses compact and granular. | ||
![]() |
233.1 | 22 | |
![]() |
283.1 | 23 | The result is **faster** and more **reliable** ajax in WebObjects. |
![]() |
233.1 | 24 | |
![]() |
259.1 | 25 | ==== Prototype WebObjects Elements ==== |
![]() |
253.1 | 26 | |
![]() |
259.1 | 27 | ##Ajax.Updater## and ##Ajax.Request## have been implemented as WebObjects dynamic elements. |
28 | |||
![]() |
253.1 | 29 | ===== Ajax.Updater ===== |
30 | |||
31 | Support for Prototype's [[Ajax.Updater>>http://www.prototypejs.org/api/ajax/updater]] is in the form of three components: | ||
32 | |||
![]() |
261.1 | 33 | * AjaxUpdaterLink |
34 | * AjaxUpdaterButton | ||
35 | * AjaxUpdaterForm (with ##onsubmit## for ajax form submission) | ||
![]() |
253.1 | 36 | |
![]() |
285.1 | 37 | These components will update a **container** on the page. |
![]() |
261.1 | 38 | |
39 | ===== Ajax.Request ===== | ||
40 | |||
41 | Prototype's [[Ajax.Request>>http://www.prototypejs.org/api/ajax/request]] is in the form of: | ||
42 | |||
43 | * AjaxRequestLink | ||
44 | * AjaxRequestButton | ||
45 | |||
![]() |
285.1 | 46 | These are used for strictly **background** ajax communication. |
![]() |
261.1 | 47 | |
![]() |
229.1 | 48 | ==== Prototype + Scriptaculous Widgets ==== |
![]() |
211.1 | 49 | |
![]() |
209.1 | 50 | * Accordion |
51 | * LightWindow | ||
52 | * ModalBox | ||
53 | * CalendarDateSelect | ||
54 | * FileUpload | ||
![]() |
233.1 | 55 | |
56 | == Forms in ERPrototaculous == | ||
57 | |||
58 | Differences from using forms in WebObjects. i.e ##WOForm##: | ||
59 | |||
![]() |
261.1 | 60 | 1. All form controls must be named. This includes text fields, selects and buttons. |
![]() |
233.1 | 61 | (WebObjects dynamically assigned names are not compatible with ERPrototaculous). |
![]() |
261.1 | 62 | 1. All forms in an ERPrototaculous app are instances of ##AjaxUpdaterForm##. |
![]() |
283.1 | 63 | 1. Form submit buttons can be the form of a: |
![]() |
261.1 | 64 | |
65 | * | ||
![]() |
283.1 | 66 | ** Static ##<button>##. |
67 | ** WOSubmitButton (if the result is to update whole page/app). | ||
![]() |
233.1 | 68 | ** AjaxUpdaterButton (to update a **container**). Or |
![]() |
283.1 | 69 | ** AjaxRequestButton (for a **background** ajax request). |
![]() |
261.1 | 70 | |
71 | == Ajax Page Caching in ERPrototaculous == | ||
72 | |||
73 | One notable difference in the ERPrototaculous and Ajax.framework is in the ajax responses. | ||
![]() |
283.1 | 74 | In ERPrototaculous, updates and actions break with "The WebObjects Way" by being pseudo-stateless. |
![]() |
261.1 | 75 | |
![]() |
283.1 | 76 | Instead of returning a fresh response, an ajax update just returns the same (instance of the) page fragment. |
![]() |
261.1 | 77 | |
![]() |
283.1 | 78 | The reason returning a fresh response is not necessary is because a client never travels back or forwards through the ajax application history - unlike in a typical WebObjects app. |
79 | Here the current state of the page fragment is all that is necessary. | ||
80 | |||
81 | == Actions in ERPrototaculous == | ||
82 | |||
83 | Typically, in a WebObjects application, an action would return the contents of the entire page. | ||
84 | |||
85 | Ajax responses are typically page fragments or part of a page. | ||
86 | So you should make sure the actions in ERPrototaculous (or AjaxUpdaterButton and AjaxRequestButton) return the proper page fragment as opposed to the entire page. | ||
87 | This breaks with WO-tradition, so this is where you need to be careful. | ||
88 | |||
89 | {{note title="Actions"}} | ||
90 | |||
91 | ERPrototaculous actions *differ* from Ajax.framework actions - _They must return only the page fragment_. | ||
92 | |||
93 | {{/note}} | ||
94 | |||
95 | To assist with page fragments inside **forms**, you can make your ajax action responses a subclass of **WXPageFragment** (a utility to handle the forms processing between Prototype and WebObjects). |