<& elements/edit.html, 'name' => 'RADIUS Group', 'table' => 'radius_group', 'labels' => { 'groupnum' => 'Group', 'groupname' => 'RADIUS Group', 'description' => 'Description', 'attrnum' => 'Attribute', 'priority' => 'Priority', 'speed_down' => 'Download speed', 'speed_up' => 'Upload speed', }, 'viewall_dir' => 'browse', 'menubar' => \@menubar, 'edit_callback' => $edit_callback, 'error_callback' => $edit_callback, 'fields' => [ { 'field' => 'groupname', 'type' => 'text', 'size' => 20, 'colspan' => 6, # just to not interfere with radius_attr columns }, { 'field' => 'description', 'type' => 'text', 'size' => 40, 'colspan' => 6, }, { 'field' => 'priority', 'type' => 'text', 'size' => 2, 'colspan' => 6, # just to not interfere with radius_attr columns }, { 'field' => 'speed_down', 'type' => 'text', 'size' => 8, 'colspan' => 6, }, { 'field' => 'speed_up', 'type' => 'text', 'size' => 8, 'colspan' => 6, }, { 'field' => 'attrnum', 'type' => 'radius_attr', 'o2m_table' => 'radius_attr', 'm2_label' => 'Attribute', 'm2_error_callback' => $m2_error_callback, }, ], #debug => 1 &> <%init> die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Configuration'); my @menubar = ('View all RADIUS Groups' => $p.'browse/radius_group.html'); my $edit_callback = sub { my ($cgi, $object) = @_; if ( $object->groupnum ) { my $link = $p.'misc/delete-radius_group.html?'.$object->groupnum; push @menubar, 'Delete this Group', $link; } }; my $m2_error_callback = sub { # reconstruct the list my ($cgi, $object) = @_; my @fields = qw(attrname attrtype op value); map { my $k = $_; next if !length($cgi->param($k.'_attrname')); new FS::radius_attr { 'groupnum' => $object->groupnum, 'attrnum' => scalar( $cgi->param($k) ), map { $_ => scalar( $cgi->param($k.'_'.$_) ) } @fields, }; } grep /^attrnum\d+$/, ($cgi->param); };