Thanks to all the responders. It gave me some ideas, but alas no luck. To clarify, I am not trying to do everything in one request. Request one generates the page, a user event (selecting an option from a form) fires another request via javascript. like: <script tal:content="python:'function getFormats() { var widget = document.getElementById('orgs'); var chosen_org = widget.options[widget.selectedIndex].value; var formats = %s; // build selection 2 options from formats ' % here.getDataFormats(chosen_org)" /> And then a user event (onChange) calls getFormats. Even with generating the script with a Python script or DTML, the problem remains (for me at least) to get a value from the DOM passed as an argument to a Python script that queries my database. If my Python script didn't take an argument, I'd have no problem. I could do this and use javascript to build the select options from the appropriate values. But I'd like to cut down on what the browser has to handle. What the user chooses in the first selection can reduce what they get to choose in selection two from 3000 choices to hundreds. I'd prefer to have the backend reduce the result set rather than having the browser do the work. I thought about AJAX (no experience), but given time constraints, looks like I'll have to load everything on the page and go from there. Rob ____________________________________________________ Yahoo! Sports Rekindle the Rivalries. Sign up for Fantasy Football http://football.fantasysports.yahoo.com
Rob Boyd wrote:
Thanks to all the responders. It gave me some ideas, but alas no luck.
To clarify, I am not trying to do everything in one request. Request one generates the page, a user event (selecting an option from a form) fires another request via javascript.
I do not see it creating another request. I see a DOM event. DOM events do not touch the server.
like: <script tal:content="python:'function getFormats() { var widget = document.getElementById('orgs'); var chosen_org = widget.options[widget.selectedIndex].value; var formats = %s; // build selection 2 options from formats ' % here.getDataFormats(chosen_org)" />
And then a user event (onChange) calls getFormats.
Even with generating the script with a Python script or DTML, the problem remains (for me at least) to get a value from the DOM passed as an argument to a Python script that queries my database.
Again, as I understand you, this is impossible. Zope has no access to the DOM. Only to request parameters. This simply cannot work. ZPT can only insert values during page rendering, and the value for 'chosen_org' is decided after the page is rendered and in a browser. Unless you can invent a special time-traveling Javascript, this cannot work. What would work is:: <script tal:content="python:'function getFormats() { var widget = document.getElementById('orgs'); var chosen_org = widget.options[widget.selectedIndex].value; var formats = xmlrpcserver.getDataFormats(chosen_org);'" /> This would actually create another request to Zope, running a script with you're dynamically generated value. Note: I don't know how xml-rpc is done in JavaScript, so I just made something up. Presumably 'xmlrpcserver' is a handle on your Zope server. Also note that every time someone fires off this method, it's a request to the server. (Also note: it doesn't have to be XML-RPC, just some way of asking the server. There are various methods used for this.) You might also make the widget that you chose from be part of a form, and when a value is chosen, the form is submitted. This will get the 'chosen_org' in a request, and your template can then render your second select list with the values from:: 'here.getDataFormats(request.chosen_org)' This is the common 'old-school' way of doing this. --jcc -- "Building Websites with Plone" http://plonebook.packtpub.com/ Enfold Systems, LLC http://www.enfoldsystems.com
----- Original Message ----- From: "Rob Boyd" <boydrobh@yahoo.com>
Thanks to all the responders. It gave me some ideas, but alas no luck.
Even with generating the script with a Python script or DTML, the problem remains (for me at least) to get a value from the DOM passed as an argument to a Python script that queries my database. If my Python script didn't take an argument, I'd have no problem. I could do this and use javascript to build the select options from the appropriate values. But I'd like to cut down on what the browser has to handle. What the user chooses in the first selection can reduce what they get to choose in selection two from 3000 choices to hundreds. I'd prefer to have the backend reduce the result set rather than having the browser do the work.
We do this a lot... a few key concepts to get you going: 1) You can embed dtml tags within javascript, eg: hiddenframe.location.href = '<dtml-var baseurl>Sub_GetPresentorPage?confid=<dtml-var login_id>&SessUpd=1' This allows you to write scripts which generate javascript code that is specific to the situation (when zope processes the dtml tags, the tags will be replaced with 'data' which then becomes part of the javascript code). 2) You can set javascript variables from dtml/scripts, eg: parent.presentorpage= '<dtml-var "temp_folder.getProperty(confid+'_CurrSlide')">' This allows you to store zope objects/fields/etc in variables that javascript can then use. 3) We use hidden html frames to provide a location that javascript can reload in order to make 'invisible' (not really, but close enough) calls from the browser to the server hth Jonathan
participants (3)
-
J Cameron Cooper -
Jonathan -
Rob Boyd