Simplest possible form

This page describes the most basic form you can build with Kanso

You must be logged in to edit this page
### Note Kanso requieres at least Couchdb 1.1. If you have older version, you must update it first. ### Files it relies on ``` SimplestPossibleForms/ |-- lib/ |-- shows.js |-- updates.js |-- templates/ |-- form.html |-- base.html ``` The simplest possible form relies on four files. `shows.js`,`updates.js` and `base.html` can be downloaded using git: ``https://github.com/Spredzy/SimplestPossibleForm``: ```bash $ git clone git://github.com/Spredzy/SimplestPossibleForm.git $ cd SimplestPossibleForm $ kanso install $ kanso createdb simplestpossibleform ``` ### kanso.json ```javascript { "name": "my_form", "version": "0.0.1", "description": "My new CouchApp", "load": "lib/app", "modules": "lib", "attachments": "static", "dust": { "templates": "templates" }, "duality": { "base_template": "base.html" }, "dependencies": { "modules": null, "properties": null, "attachments": null, "settings": null, "duality": null, "dust": null, "duality-dust": null, "couchtypes": null } } ``` ### templates/form.html ```xml <h1>{form_title}</h1> <form method="{method}" action="{action}"> <table> {form|s} </table> <input type="submit" value="{button}" /> </form> ``` The `form.html` page aims to handle the form we will be generating. ### templates/base.html ```xml <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>{title}</title> </head> <body> <div id="content"> {content|s} </div> <script src="{baseURL}/static/js/jquery-1.5.2.min.js"></script> <script src="{baseURL}/static/js/json2.js"></script> <script src="{baseURL}/modules.js"></script> <script src="{baseURL}/kanso.js"></script> </body> </html> ``` ### lib/shows.js ```javascript /** * Show functions to be exported from the design doc. */ var templates = require('duality/templates'), fields = require('couchtypes/fields'), Form = require('couchtypes/forms').Form; exports.welcome = function (doc, req) { return { title: 'It worked!', content: templates.render('welcome.html', req, {}) }; }; exports.not_found = function (doc, req) { return { title: '404 - Not Found', content: templates.render('404.html', req, {}) }; }; exports.my_form = function (doc, req) { var myForm = new Form ({first_name: fields.string(), last_name: fields.string()}); return { title : 'My First Form', content: templates.render('form.html', req, { form_title : 'My Form', method : 'POST', action : '../_update/update_my_form', form : myForm.toHTML(req), button: 'Validate'}) } }; exports.my_form_content = function(doc, req) { return { title: 'Content of my Form', content: templates.render('base.html', req, {content : '<b>First Name</b> : ' + doc.first_name + '<br/><b>Last Name</b> : ' + doc.last_name}) }; }; ``` We've declared two functions : * my\_form: my\_form function creates the form and renders it. We've instantiated a form with two string elements (`first_name` and `last_name`) then rendered it with the attributes we wanted. * my\_form\_content: my\_form\_content function simply displays the content of a document previously saved via the form. Notes. `couchtypes/fields` and `couchtypes/forms` needs to be required. ### lib/updates.js ```javascript /** * Update functions to be exported from the design doc. */ var templates = require('duality/templates'), fields = require('couchtypes/fields'), Form = require('couchtypes/forms').Form; exports.update_my_form = function (doc, req) { var form = new Form({first_name: fields.string(), last_name: fields.string()}); form.validate(req); /** * We do that because we are not using CouchType * CouchType takes care of generating a uuid */ form.values._id = req.uuid; if (form.isValid()) { return [form.values, {content: 'Hello ' + form.values.first_name +', '+ form.values.last_name , title: 'Result'}]; } else { var content = templates.render('form.html', req, { form_title: 'My Form', method: 'POST', action: '../_update/update_my_form', form: form.toHTML(req), input: 'Validate' }); return [null, {content: content, title: 'My First Form'}]; } }; ``` The update\_my\_form function, creates a new instance of Form with the exact same pattern as the one instantiated in the `shows.js` file, runs it against validation function and if the form is valid the content is added (and the content shown) else the form is rerendered. For more informations about CouchDb _updates function see [CouchDb Wiki](http://wiki.apache.org/couchdb/Document_Update_Handlers). ### Extra (optional) In order for the URL kanso gives you after pushing to match the URL form edit `lib/rewrites.js` Change ```javascript {from: '/', to: '_show/welcome'}, ``` To ```javascript {from: '/', to: '_show/my_form'}, ``` ### Bottom line ``` kanso install kanso push http://127.0.0.1:5984/simplestpossibleform ``` Admiting that the name of your app defined in kanso.json is `simplestpossibleform` : * If you haven't edited the file : Go to `http://127.0.0.1:5984/simplestpossibleform/_design/my_form/_show/my_form` * If you have edited the `lib/rewrites.js` file : Go to `http://127.0.0.1:5984/simplestpossibleform/_design/simplestpossibleform/_rewrite/` There you go ! You made it through your first form. ### Next Use CouchTypes instead of plain fields : [[CouchTypes_forms]]