En even better solution.

Drop this code in your model somewhere:

def ajax_create(field,
                value='create',
                title='Add a new organizaiton',
                height=100, width=600):
    if not field.type.startswith('reference'):
        raise SyntaxError, "can only be used with a reference field"
    if not hasattr(field.requires,'options'):
        raise SyntaxError, "cannot determine options from field
validator"
    key = str(field).replace('.','_')
    if request.get_vars._ajax_add==str(field):
        def update_select(form):
            options = TAG['']
(*[OPTION(v,_value=k,_selected=str(form.vars.id)==str(k)) \
                                    for (k,v) in
field.requires.options()])
            command = "jQuery('#
%s').html('%s');jQuery('#TB_closeWindowButton').click()" \
                % (key,options.xml().replace("'","\'"))
            response.headers['web2py-component-command'] = command
        table = field._db[field.type[10:]]
        raise
HTTP(200,crud.create(table,onaccept=update_select).xml(),**response.headers)
    response.files.append('http://jquery.com/demo/thickbox/thickbox-
code/thickbox.js')
    response.files.append('http://jquery.com/demo/thickbox/thickbox-
code/thickbox.css')
    return TAG[''](
        A(value,_class='thickbox',_title=title,
          _href='#TB_inline?height=%s&width=%s&inlineId=TB_%s' %
(height,width,key)),
        DIV(LOAD(request.controller,request.action,args=request.args,
                 vars=dict(_ajax_add=field),ajax=True),_id='TB_%s' %
key,_class='hidden'))

Then you just do:

db.define_table('organization',Field('name',notnull=True,unique=True),format='%
(name)s')
db.define_table('person',Field('name'),Field('organization',db.organization))

db.person.organization.comment = ajax_create(db.person.organization,
title='Add an Org.')

def index():
    return dict(form=crud.create(db.person,request.args(0)))

Will work with any table/field that you already have.

On Feb 20, 12:10 am, mdipierro <mdipie...@cs.depaul.edu> wrote:
> Reposted here since there are some indentation issues with google:
>
> http://www.web2py.com/AlterEgo/default/show/258
>
> On Feb 20, 12:01 am, mdipierro <mdipie...@cs.depaul.edu> wrote:
>
> > Here is a little better with a title in the modal and some comments of
> > explanation
>
> > # create a model
> > db.define_table('organization',Field('name',notnull=True,unique=True),format='%
> > (name)s')
> > db.define_table('person',Field('name'),Field('organization',db.organization))
>
> > # create link that open a modal window and calls
> > # add_organization via ajax using web2py ajax trapping
> > # forms will be processed and stay in the modal window if errors
> > db.person.organization.comment = \
> >     SPAN(A('add',_class='thickbox',
> >            _title='Add a new organizaiton',
> >            _href='#TB_inline?
> > height=100&width=600&inlineId=modal_content'),
> >          DIV(LOAD('default','add_organization',ajax=True),
> >              _id='modal_content',_class='hidden'))
>
> > # load required ajax libraries
> > response.files.append('http://jquery.com/demo/thickbox/thickbox-code/
> > thickbox.js')
> > response.files.append('http://jquery.com/demo/thickbox/thickbox-code/
> > thickbox.css')
>
> > # this is your main action (nothing special here)
> > def index():
> >     return dict(form=crud.create(db.person,request.args(0)))
>
> > # this is the ajax callback
> > def add_organization():
> >     def update_select(form):
> >         # this function updates the content of the select dropdown
> > (web2py trick)
> >         # and closes the modal
> >         organizations =
> > db(db.organization.id>0).select(orderby=db.organization.name)
> >         options = TAG['']
> > (*[OPTION(o.name,_value=o.id,_selected=form.vars.id==o.id) for o in
> > organizations])
> >         response.headers['web2py-component-command'] =
> > "jQuery('#person_organization').html('%s');jQuery('#TB_closeWindowButton').click()"
> > % options
> >     return crud.create(db.organization,onaccept=update_select)
>
> > On Feb 19, 11:52 pm, mdipierro <mdipie...@cs.depaul.edu> wrote:
>
> > > On Feb 19, 8:54 pm, Jose <jjac...@gmail.com> wrote:
>
> > > > how to this [1] with webpy?
>
> > > > [1]http://www.vimeo.com/9526668
>
> > > Here is complete code:
>
> > > db.define_table('organization',Field('name',notnull=True,unique=True),format='%
> > > (name)s')
> > > db.define_table('person',Field('name'),Field('organization',db.organization))
>
> > > db.person.organization.comment = \
> > >     SPAN(A('add',_class='thickbox',
> > >            _href="#TB_inline?
> > > height=200&width=600&inlineId=modal_content"),
> > >          DIV(LOAD('default','add_organization',ajax=True),
> > >              _id='modal_content',_class='hidden'))
>
> > > response.files.append('http://jquery.com/demo/thickbox/thickbox-code/
> > > thickbox.js')
> > > response.files.append('http://jquery.com/demo/thickbox/thickbox-code/
> > > thickbox.css')
>
> > > def index():
> > >     return dict(form=crud.create(db.person,request.args(0)))
>
> > > def add_organization():
> > >     def update_select(form):
> > >         organizations =
> > > db(db.organization.id>0).select(orderby=db.organization.name)
> > >         options = TAG['']
> > > (*[OPTION(o.name,_value=o.id,_selected=form.vars.id==o.id) for o in
> > > organizations])
> > >         response.headers['web2py-component-command'] =
> > > "jQuery('#person_organization').html('%s');jQuery('#TB_closeWindowButton').click()"
> > > % options
> > >     return crud.create(db.organization,onaccept=update_select)

-- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To post to this group, send email to web...@googlegroups.com.
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en.

Reply via email to