| 1 | |
| 2 | == IS_ONE_OF_EMPTY() Validator == |
| 3 | |
| 4 | This one has all properties of [wiki:IS_ONE_OF IS_ONE_OF] but one: |
| 5 | it '''does not''' send back to the browser a '''potentially huge''' dropdown with all values.[[BR]] |
| 6 | |
| 7 | Instead, it creates the INPUT box which can carry the corresponding lookup id.[[BR]] |
| 8 | |
| 9 | And when the form gets sent back to the server, the content of this INPUT box gets validated on the server against the corresponding lookup table. |
| 10 | |
| 11 | '''How to use the IS_ONE_OF_EMPTY?''' |
| 12 | |
| 13 | '''In controller.''' |
| 14 | |
| 15 | |
| 16 | Keep in mind that the corresponding model assumes ''default validator'' against the organisation_id. |
| 17 | The working example is [http://bazaar.launchpad.net/~flavour/sahana/sahanapy-trunk/annotate/569/controllers/or.py controllers/or.py]:[[BR]] |
| 18 | |
| 19 | here the organisation_id is not mandatory, but if present, must be validated against the (large) organisation table. |
| 20 | {{{ |
| 21 | def office(): |
| 22 | ... |
| 23 | |
| 24 | # the update forms are not ready. when they will - uncomment this and comment the next one |
| 25 | #if request.args(0) in ('create','update'): |
| 26 | if request.args(0) == 'create': |
| 27 | db[table].organisation_id.requires = IS_NULL_OR(IS_ONE_OF_EMPTY(db, 'or_organisation.id')) |
| 28 | |
| 29 | ... |
| 30 | }}} |
| 31 | |
| 32 | '''Autocomplete - in the view.''' |
| 33 | |
| 34 | And the complimentary view [http://bazaar.launchpad.net/~flavour/sahana/sahanapy-trunk/annotate/569/views/or/office_create.html or/office_create.html] |
| 35 | |
| 36 | {{{ |
| 37 | <script type="text/javascript">//<![CDATA[ |
| 38 | $(function() { |
| 39 | // Hide the real Input Field |
| 40 | $("#or_office_organisation_id").hide(); |
| 41 | // Add a dummy field |
| 42 | $("#or_office_organisation_id").after("<input id='dummy_organisation' class='ac_input' size=50 />"); |
| 43 | {{include 'or/organisation_autocomplete.js'}} |
| 44 | // Populate the real Input when the Dummy is selected |
| 45 | $("#dummy_organisation").result(function(event, data, formatted) { |
| 46 | var newvalue = data.id; |
| 47 | $("#or_office_organisation_id").val(newvalue); |
| 48 | }); |
| 49 | }); |
| 50 | //]]></script> |
| 51 | }}} |