Sure. Note, you don't need to replace the whole widget -- just update the attribute directly:
form.element('input', _id='%s_%s' % (table_name, field.name)).update( data={'show-trigger': '%s_%s' % (table_name, field.show_if.first.name)}) Anthony On Saturday, July 12, 2014 4:38:58 PM UTC-4, Louis Amon wrote: > > I think a framework like web2py shouldn't break by default, and work only > if you know which parameter to set. > > > Anyway here's a better example: > > db.define_table('person', Field('name')) > db.define_table('other', Field('show_trigger', 'boolean')) > > db.person.name.show_if = (db.other.show_trigger == True) > > form=SQLFORM.factory(db.person, db.other) > > > If I do as you suggest and add table_name='person' during form > definition, web2py.js won't be able to match the data-show-trigger : > other_show_trigger > > > The code I suggested fixes this though. > > On Saturday, July 12, 2014 9:12:22 PM UTC+2, Anthony wrote: >> >> Instead, you can just do this: >> >> form = SQLFORM.factory(db.person, table_name='person') >> >> Anthony >> >> On Saturday, July 12, 2014 2:02:45 PM UTC-4, 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, 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.