# 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:
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),
{{=A(I('',_class='icon-remove icon-white'), _class='btn btn-mini btn-danger',
_href=URL('phone_numbers_form', extension='load', args=request.args(0),
</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