Thanks Derek,
I've tried a few approaches and can't get a good scenario to work.
If I add an onchange event using:
form=SQLFORM(db.msg, fields=['msg_typ'])
mt = form.element(_name='msg_typ')
mt['_onchange'] = XML("ajax('get_msg_vars', ['msg_typ'],
'send_msg_form');")
I then added the div to the form using:
dv = DIV('', _id='send_msg_form')
mtvars = form.element(_id='msg_msg_typ__row')
mtvars.append(dv)
and then have the function get_msg_vars retrieve the list:string and add
the input fields to the div, I can't get the form to validate the fields.
I tried also tried using a LOAD component for the entire form but then the
onchange event doesn't work. This was my alternate approach:
def send_msg():
return dict(form=LOAD(url=URL(r=request,f='get_msg_vars.load'),
ajax=True, target='send_msg_form'))
def get_msg_vars():
fields = []
fields.append(db.msg.msg_typ)
if form.vars['msg_typ']:
db.msg.msg_typ.default = request.vars['msg_typ']
msg_typ = db.msg_typ(form.vars['msg_typ'])
for var in msg_typ.msg_typ_vars:
msg_typ_var_lbl = ' '.join(x.capitalize() for x in
var.split('_'))
fields.append(Field(var, label=msg_typ_var_lbl,
requires=IS_NOT_EMPTY()))
form=SQLFORM.factory(*fields)
mt = form.element(_name='msg_typ')
mt['_onchange'] = XML("ajax('auxiliary', ['msg_typ'],
'send_msg_form');")
if form.accepts(request.vars):
response.flash = 'ok'
return dict(message="Hello %s" % form.vars.name)
return dict(form=form)
I read some other posts that indicate there may be problems with the hidden
form fields that are generated if I try to replace the entire form using
ajax and the load as above.
My only other option that I can think of is to not use ajax or a component
and recreate the form each postback but this would require setting the
msg_type to read only and having a reset button. I'm going to try that
next unless anybody has a better idea.
Is there something I'm missing about using ajax/load to dynamically add
fields to the form?
Thanks.
On Monday, August 5, 2013 7:00:17 PM UTC-4, Derek wrote:
>
> Rig up the onchange of the message type dropdown to the load function...
>
> On Monday, August 5, 2013 1:00:45 PM UTC-7, Michael Beller wrote:
>>
>> I have a requirement to create a message based on the user selecting a
>> message type. Each message type has a fixed text component and a set of
>> zero, one, or more variable components.
>>
>> Ideally, I'd like the user to select the message type from a list and
>> have the form dynamically display zero, one, or more fields for entering
>> each variable component without posting back the entire page. I've
>> researched LOAD and Ajax options in the book, along with using a field type
>> of list:string, but I haven't defined a good approach. I've also read
>> about the conditional fields but not how to have a dynamic set of
>> conditional fields.
>>
>> Worst case, I could just postback the form and display a page with the
>> new form for that message type (and make the message type read only).
>>
>> Any ideas? Thanks.
>>
>> Here is the base model ...
>>
>> db.define_table('msg_typ',
>> Field('msg_typ_id'),
>> Field('msg_typ_name'),
>> Field('msg_typ_body'),
>> Field('msg_typ_vars', type='list:string'),
>> format='%(msg_typ_name)s',
>> migrate=True)
>>
>> db.define_table('msg',
>> Field('msg_typ', type='reference msg_typ'),
>> Field('msg_vars', type='list:string'), # ideally, this would be a
>> dictionary with the vars from the msg_typ table along with their values
>> migrate=True)
>>
>>
>>
--
---
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.