please submit a bug report and we'll fix it.

On Saturday, 12 July 2014 13:02:45 UTC-5, Louis Amon wrote:
>
> Not sure if somebody noticed before, but the show_if syntax (backed by 
> web2py.js) is actually breaking if you use SQLFORM.factory to generate your 
> form.
>
>
> Example:
>
> db.define_table('person', Field('name', 'string'), Field('show_trigger', 
>> 'boolean'))
>> db.person.name.show_if = (db.person.show_trigger == True)
>
>
>
> When show_if is processed, special attributes are added to inputs.
> data-show-trigger is among them, and is used in the javascript code to 
> determine the id of the element that triggers display.
>
> In our previous example, the data-show-trigger generated by our model is 
> person_show_trigger, and web2py.js will try to match this id.
>
> *In a factory form, the tablename of a field is either specified or 
> hard-coded ('no_table').*
>
> Example:
>
>> form = SQLFORM.factory(db.person)
>
>
> The generated input for the field "person.name" willl have the following 
> id : no_table_name.
>
> *The mismatch between SQLFORM.factory's input and and data-show-trigger 
> produces a javascript error, which of course blocks any further javascript 
> code from being executed.*
>
>
>
> *Here is the modification I suggest in order to fix this :*
>
> In *gluon.sqlhtml.py <http://gluon.sqlhtml.py>*, replace the last line :
>
> return SQLFORM(DAL(None).define_table(table_name, *fields), **attributes)
>
> With the following code:
>
>     # Generate SQLFORM
>    form = SQLFORM(DAL(None).define_table(table_name, *fields), 
> **attributes)
>
>         
>    # Replace data-show-trigger (cf. 'show_if') since we changed the table 
> name
>    def replace_triggers(fields):
>        for field in fields:
>            if isinstance(field, Field) and getattr(field, 'show_if', None
> ):
>                form.element('input', _id='%s_%s' % (table_name, field.name
> ),
>                             replace=lambda t: t.update(**{
> '_data-show-trigger':'%s_%s' % (table_name, field.show_if.first.name)}))
>            elif isinstance(field, Table):
>                table = field
>                # recursive call
>                replace_trigger([field for field in table])
>    replace_triggers(fields)
>
>
>       return form
>
>
> This way, the hard-coded tablename in SQLFORM.factory is also applied to 
> any show_if in the form.
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to