History for ZPTwithFormulatorPartII
??changed:- Formulator with ZPT: Part 2 This is a followup to "beno":http://www.zope.org/Members/beno 's most excellent "ZPT tutorial":http://www.zope.org/Members/beno/HowTo/Formulator_With_ZPT Introduction In the documentation for the Formulator product, there is a section that discusses how to retrieve Formulator data and objects automatically, without haveing to type all your elements, one-by-one. This How-To shows how to do this with ZPT, and as an extra bonus, we show how to do this utilizing the groups you can setup in the Formulator admin interface. For this HowTo, we will use a registration form as an example. Display: Data Entry (Zope Page Templates) Create a form object and populate it in your base directory:: forms/regsitration which will be access like this:: here/portal_url/forms/registration Once you have created a Forumator object and have your form elements defined, create a new "Page Template" wherever you want. For this example, we created one called 'reggroups' in the portal base directory. Here is the content of the ZPT:: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US" metal:use-macro="here/main_template/macros/master"> <body> <div metal:fill-slot="main" tal:define="thisform here/portal_url/forms/registration"> <form tal:attributes="action thisform/action; method thisform/method; name thisform/name; encoding thisform/enctype; "> <h3><span tal:replace="thisform/title" /></h3> <table> <tr tal:define="elements thisform/get_fields" tal:repeat="element elements "> <tal:bloc tal:define="display element/title_or_id; field element/id; value python:element.get_value('default'); "> <td> <span tal:content="display" />: </td> <td> <span tal:replace="structure element/render" /> <br> </td> </tal:bloc> </tr> </table> </form> </div> </body> </html> The form attributes are pulled from the form object, so we don't need to touch this code if those change - we just have to make the changes in the ZMI under the "Settings" tab for your form. Now, to spice things up (and make life much faster/easier, check out the "Order" tab in the ZMI, and build some neat groups. Now, we need to rewrite our page template so that we can take advantage of this:: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US" metal:use-macro="here/main_template/macros/master"> <body> <div metal:fill-slot="main" tal:define="thisform here/portal_url/forms/registration"> <form tal:attributes="action thisform/action; method thisform/method; name thisform/name; encoding thisform/enctype; "> <h3><span tal:replace="thisform/title" /></h3> <table tal:define="groups thisform/get_groups" tal:repeat="group groups "> <tr> <td colspan="2"> <h4><span tal:replace="group/title" /></h4> </td> </tr> <tr tal:define="elements python:thisform.get_fields_in_group(group)" tal:repeat="element elements "> <tal:bloc tal:define="display element/title_or_id; field element/id; value python:element.get_value('default'); "> <td> <span tal:content="display" />: </td> <td> <span tal:replace="structure element/render" /> <br> </td> </tal:bloc> </tr> <tr> <td> <p> </p> </td> </tr> </table> </form> </div> </body> </html> Logic: Data Parsing/Insertion (Python External Method) We are using a MySQL database for this example, with data that will be inserted into multiple tables. We also want to make this easily maintainable, without any reference to a particular particlar fields. This way, if we change the table structure, we don't have to worry about going back and changing ourcode. Given these requirements, an external method seemed the best choice. Here's what we came up with :: import Display: Confirmation Page (Zope Page Templates) Here we want to present the end user with something friednly after they have hit the submit button and their data hase been inserted into the appropriate place.