# Controller
def phone_numbers_form():
user_id = None
if request.args(0) is not None:
try:
user_id = int(request.args(0))
except ValueError:
user_id = db(db.auth_user.username == request.args(0)).select(
db.auth_user.id).first().id
if user_id is None:
user_id = auth.user_id
if request.vars.remove_phone_number_id is not None:
db(db.phone_number.id ==
int(request.vars.remove_phone_number_id)).delete()
record_to_modify = request.vars.request_modify_phone_id
phone_numbers = db(db.phone_number.user_id == user_id).select()
db.phone_number.user_id.default = user_id
db.phone_number.user_id.update = user_id
if record_to_modify is None:
buttons = [
TAG.button(I('', _class='icon-ban-circle icon-white'),
_type='button',
_onClick='web2py_component("%s","phone_number_component");' %
URL(c='directory',
f='phone_numbers_form',
extension='load',
args=request.args(0)),
_class='btn btn-mini btn-inverse'),
TAG.button((I('', _class='icon-ok icon-white'), CAT(' '),
STRONG(T('Add'))), _type='submit',
_class='btn btn-mini btn-primary')]
else:
buttons = [
TAG.button(I('', _class='icon-ban-circle icon-white'),
_type='button',
_onClick='web2py_component("%s","phone_number_component");' %
URL(c='directory',
f='phone_numbers_form',
extension='load',
args=request.args(0)),
_class='btn btn-mini btn-inverse'),
TAG.button((I('', _class='icon-ok icon-white'), CAT(' '),
T('Ok')), _type='submit',
_class='btn btn-mini btn-primary')]
# form.element(_type='submit')['_value'] = T('ok')
# form.element(_type='submit')['_class'] = 'btn btn-mini pull-right'
form = SQLFORM(db.phone_number, record=None if record_to_modify is None
else int(record_to_modify), buttons=buttons)
if form.process().accepted:
if record_to_modify is not None:
response.flash = T('Successfully inserted')
else:
response.flash = T('Successfully updated')
response.js =
'web2py_component("%(URL)s","phone_number_component");' % {'URL':
URL(c='directory',
f='phone_numbers_form',
extension='load',
args=request.args(0))}
elif form.errors:
response.flash = T('Errors...')
return dict(phone_numbers=phone_numbers, form=form)
# View - COMPONENT
<strong>{{=T('Phone numbers')}}</strong>
{{=form.custom.begin}}
<table class="table table-condensed table-hover">
<tbody>
{{for phone_number in phone_numbers:}}
<tr>
{{if request.vars.request_modify_phone_id is not None and
phone_number.id == int(request.vars.request_modify_phone_id):}}
<td>{{=form.custom.widget.phone_number_kind_id}}</td>
<td>{{=form.custom.widget.phone_number}}</td>
<td>
<span style="display:
none;">{{=form.custom.widget.user_id}}</span>
{{=form.custom.widget.extension}}
<div class="pull-right">
{{=A(I('', _class='icon-ban-circle icon-white'),
_class='btn btn-mini btn-inverse',
_href=URL('phone_numbers_form',
extension='load', args=request.args(0)), cid=request.cid)}}
{{=BUTTON(I('', _class='icon-ok icon-white'),
_class='btn btn-mini btn-primary', _type='submit')}}
</div>
</td>
{{else:}}
<td>{{=db.phone_number_kind[phone_number.phone_number_kind_id].phone_number_kind}}</td>
<td>{{=phone_number.phone_number}}</td>
<td>
{{if phone_number.extension is not None and
phone_number.extension != '':}}
({{=phone_number.extension}})
{{pass}}
<div class="pull-right">
{{=A(I('',_class='icon-edit'), _class='btn
btn-mini',
_href=URL('phone_numbers_form',
extension='load', args=request.args(0),
vars=dict(request_modify_phone_id=
phone_number.id)), cid=request.cid)}}
{{=A(I('',_class='icon-remove icon-white'),
_class='btn btn-mini btn-danger',
_href=URL('phone_numbers_form',
extension='load', args=request.args(0),
vars=dict(remove_phone_number_id=
phone_number.id)), cid=request.cid)}}
</div>
</td>
{{pass}}
</tr>
{{pass}}
{{if request.vars.request_modify_phone_id == None:}}
<tr id="input_new_phone_number">
<td>{{=form.custom.widget.phone_number_kind_id}}</td>
<td>{{=form.custom.widget.phone_number}}</td>
<td>{{=form.custom.widget.extension}}
<span style="display:
none;">{{=form.custom.widget.user_id}}</span>
<span class='pull-right'>{{=form.custom.submit}}</span>
</td>
</tr>
{{pass}}
</tbody>
</table>
{{=form.custom.end}}
<script>
$(document).ready(function() {
var add_phone_number_translation = '{{=T('Add a phone number')}}'
$("tr#input_new_phone_number").children().hide();
$("tr#input_new_phone_number").append('<td colspan="3"
id="new_phone_number"><button type="button" class="btn btn-small
pull-right" onclick="$(\'tr#input_new_phone_number\').children().show();
$(\'td#new_phone_number\').hide();"><strong>' +
add_phone_number_translation + '</strong></button></td>');
});
</script>
The view is a component so you have a form in the main view for your
contact and this component for adding phone numbers.
Richard
On Sat, Aug 16, 2014 at 9:44 AM, Кирилл Шаталаев <[email protected]> wrote:
>
> Hello.
>
> This is just a simple example, my actual model is more complex, but I
> think I can explain the main idea.
>
> Model:
>
> db.define_table('users',
> Field('name', 'string'))
>
> db.define_table('contacts',
> Field('user', db.users),
> Field('phone', 'string'))
>
>
> Well, each user can have from 1 to infinite phone numbers.
> I want user entering all his numbers while registering.
>
> So, what are the ways to realize it?
>
> 1) Split registration process to steps, step one - enter name, step two -
> add phones one by one. Ugly.
> 2) Use smartgrid. Have "parent-children" out of the box. Being, may be,
> cool tool for admin purposes, it is absolutely unintuitive and unusable for
> end-users.
> 3) Make custom form with jquery: form have button "add another phone
> number", user press the button and another text field adding dynamicaly for
> the "infinite" form. Excellent way. But. This is theoretically. And I cant
> find any practical examples.
>
> So, testing I can see that inputs with same name processing by web2py as a
> list, its fine! For example, there is a duplicated inputs in the form:
>
> <input name="phone" type="text">
> <input name="phone" type="text">
>
> after submitting, I have ['123456','345678'] on form.vars.phone. Cool.
> Cycle and do "db.insert()" voila, you say!
>
> No.
>
> Linked table "contacts" actually is more more complex. It have "address"
> string, "state" string, "postal", validators and another linked tables such
> "postals", "cities", etc, etc...
>
> And I have no idea how build my form and how to process my form vars
> within controller with all "contact" table validators?
> Is there any elegant way doing this?
>
> Found this:
> http://www.web2pyslices.com/slice/show/1427/single-form-for-linked-tables
> not so helpful.
>
> --
> 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 [email protected].
> For more options, visit https://groups.google.com/d/optout.
>
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.