bug 2867 [1/2]: Move basic editing to main system preferences screen

This allows the user to edit system preferences from the main system
preferences screen, rather than having to dig down into each
preference.

[This patch includes some modifications by Galen Charlton
 to fix XHTML validation errors and a couple errors that
 would crop up under warnings.]

Signed-off-by: Galen Charlton <galen.charlton@liblime.com>
This commit is contained in:
Jesse Weaver 2008-12-17 09:53:37 -06:00 committed by Henri-Damien LAURENT
parent d658c36445
commit abfd5ba2c1
3 changed files with 258 additions and 152 deletions

View File

@ -317,31 +317,17 @@ sub StringSearch {
my $count=@data;
my @results;
my $cnt=0;
my $sth;
# used for doing a plain-old sys-pref search
if ($type eq 'all' ){
my $sth=$dbh->prepare("SELECT * FROM systempreferences
WHERE variable LIKE ? OR explanation LIKE ?
ORDER BY VARIABLE");
$sth->execute("%$searchstring%", "%$searchstring%");
while (my $data=$sth->fetchrow_hashref){
$data->{value} =~ s/</&lt;/g;
$data->{value} =~ s/>/&gt;/g;
$data->{value}=substr($data->{value},0,60)."..." if length($data->{value}) >60;
push(@results,$data);
$cnt++;
}
$sth->finish;
} elsif ($type){
if ($type && $type ne 'all') {
foreach my $syspref (sort { lc $a cmp lc $b } keys %tabsysprefs){
if ($tabsysprefs{$syspref} eq $type){
my $sth=$dbh->prepare("Select variable,value,explanation,type,options from systempreferences where (variable like ?) order by variable");
$sth->execute($syspref);
while (my $data=$sth->fetchrow_hashref){
$data->{value} =~ s/</&lt;/g;
$data->{value} =~ s/>/&gt;/g;
$data->{value}=substr($data->{value},0,60)."..." if length($data->{value}) >60;
$data->{shortvalue} = $data->{value};
$data->{shortvalue} = substr($data->{value},0,60)."..." if length($data->{value}) >60;
push(@results,$data);
$cnt++;
}
@ -349,28 +335,145 @@ sub StringSearch {
}
}
} else {
my $strsth ="Select variable,value,explanation,type,options from systempreferences where variable not in (";
foreach my $syspref (keys %tabsysprefs){
$strsth .= $dbh->quote($syspref).",";
my $sth;
if ($type eq 'all' ){
$sth=$dbh->prepare("
SELECT *
FROM systempreferences
WHERE variable LIKE ? OR explanation LIKE ?
ORDER BY VARIABLE");
$sth->execute("%$searchstring%", "%$searchstring%");
} else {
my $strsth ="Select variable,value,explanation,type,options from systempreferences where variable not in (";
foreach my $syspref (keys %tabsysprefs){
$strsth .= $dbh->quote($syspref).",";
}
$strsth =~ s/,$/) /;
$strsth .= " order by variable";
$sth=$dbh->prepare($strsth);
$sth->execute();
}
$strsth =~ s/,$/) /;
$strsth .= " order by variable";
my $sth=$dbh->prepare($strsth);
$sth->execute();
while (my $data=$sth->fetchrow_hashref){
$data->{value}=substr($data->{value},0,60);
push(@results,$data);
$cnt++;
}
$sth->finish;
}
while (my $data=$sth->fetchrow_hashref){
$data->{shortvalue} = $data->{value};
$data->{shortvalue} = substr($data->{value},0,60)."..." if length($data->{value}) >60;
push(@results,$data);
$cnt++;
}
$sth->finish;
}
return ($cnt,\@results);
}
sub GetPrefParams {
my $data = shift;
my $params = $data;
my @options;
if (defined $data->{'options'}) {
foreach my $option (split(/\|/, $data->{'options'})) {
my $selected='0';
$option eq $data->{'value'} and $selected=1;
push @options, { option => $option, selected => $selected };
}
}
$params->{'prefoptions'} = $data->{'options'};
if ($data->{'type'} eq 'Choice') {
$params->{'type-choice'} = 1;
} elsif ($data->{'type'} eq 'YesNo') {
$params->{'type-yesno'} = 1;
$data->{'value'}=C4::Context->boolean_preference($data->{'variable'});
if ($data->{'value'} eq '1') {
$params->{'value-yes'} = 1;
} else {
$params->{'value-no'} = 1;
}
} elsif ($data->{'type'} eq 'Integer' || $data->{'type'} eq 'Float') {
$params->{'type-free'} = 1;
$params->{'fieldlength'} = $data->{'options'}>0 ? $data->{'options'} : 10;
} elsif ($data->{'type'} eq 'Textarea') {
$params->{'type-textarea'} = 1;
$data->{options} =~ /(.*)\|(.*)/;
$params->{'cols'} = $1;
$params->{'rows'} = $2;
} elsif ($data->{'type'} eq 'Themes') {
$params->{'type-choice'} = 1;
my $type='';
($data->{'variable'}=~m#opac#i) ? ($type='opac') : ($type='intranet');
@options=();
my $currently_selected_themes;
my $counter=0;
foreach my $theme (split /\s+/, $data->{'value'}) {
push @options, { option => $theme, counter => $counter };
$currently_selected_themes->{$theme}=1;
$counter++;
}
foreach my $theme (getallthemes($type)) {
my $selected='0';
next if $currently_selected_themes->{$theme};
push @options, { option => $theme, counter => $counter };
$counter++;
}
} elsif ($data->{'type'} eq 'ClassSources') {
$params->{'type-choice'} = 1;
my $type='';
@options=();
my $sources = GetClassSources();
my $counter=0;
foreach my $cn_source (sort keys %$sources) {
if ($cn_source eq $data->{'value'}) {
push @options, { option => $cn_source, counter => $counter, selected => 1 };
} else {
push @options, { option => $cn_source, counter => $counter };
}
$counter++;
}
} elsif ($data->{'type'} eq 'Languages') {
my $currently_selected_languages;
foreach my $language (split /\s+/, $data->{'value'}) {
$currently_selected_languages->{$language}=1;
}
# current language
my $lang = $params->{'lang'};
my $theme;
my $interface;
if ($data->{'variable'} =~ /opac/) {
# this is the OPAC
$interface = 'opac';
$theme = C4::Context->preference('opacthemes');
}
else {
# this is the staff client
$interface = 'intranet';
$theme = C4::Context->preference('template');
}
my $languages_loop = getTranslatedLanguages($interface,$theme,$lang,$currently_selected_languages);
$params->{'languages_loop'} = $languages_loop;
$params->{'type-langselector'} = 1;
} else {
$params->{'type-free'} = 1;
$params->{'fieldlength'} = $data->{'options'}>0 ? $data->{'options'} : 30;
}
if ( $params->{'type-choice'} || $params->{'type-free'} || $params->{'type-yesno'} ) {
$params->{'oneline'} = 1;
}
$params->{'preftype'} = $data->{'type'};
$params->{'options'} = \@options;
return $params;
}
my $input = new CGI;
my $searchfield = $input->param('searchfield');
my $Tvalue = $input->param('Tvalue');
my $offset = $input->param('offset');
my $offset = $input->param('offset') || 0;
my $script_name="/cgi-bin/koha/admin/systempreferences.pl";
my ($template, $borrowernumber, $cookie)
@ -436,7 +539,6 @@ if ($op eq 'update_and_reedit') {
my $sth=$dbh->prepare("update systempreferences set value=?,explanation=?,type=?,options=? where variable=?");
$sth->execute($value, $input->param('explanation'), $input->param('variable'), $input->param('preftype'), $input->param('prefoptions'));
$sth->finish;
warn "logaction !! mod ";
logaction('SYSTEMPREFERENCE','MODIFY',undef, $input->param('variable') . " | " . $value );
}
} else {
@ -444,7 +546,6 @@ if ($op eq 'update_and_reedit') {
my $sth=$dbh->prepare("insert into systempreferences (variable,value,explanation) values (?,?,?,?,?)");
$sth->execute($input->param('variable'), $input->param('value'), $input->param('explanation'), $input->param('preftype'), $input->param('prefoptions'));
$sth->finish;
warn "logaction !! add ";
logaction('SYSTEMPREFERENCE','ADD',undef, $input->param('variable') . " | " . $input->param('value') );
}
}
@ -469,94 +570,11 @@ if ($op eq 'add_form') {
$template->param(return_tab => $tabsysprefs{$searchfield});
}
my @options;
foreach my $option (split(/\|/, $data->{'options'})) {
my $selected='0';
$option eq $data->{'value'} and $selected=1;
push @options, { option => $option, selected => $selected };
}
if ($data->{'type'} eq 'Choice') {
$template->param('type-choice' => 1);
} elsif ($data->{'type'} eq 'YesNo') {
$template->param('type-yesno' => 1);
$data->{'value'}=C4::Context->boolean_preference($data->{'variable'});
($data->{'value'} eq '1') ? ($template->param('value-yes'=>1)) : ($template->param('value-no'=>1));
} elsif ($data->{'type'} eq 'Integer') {
$template->param('type-free' => 1);
$template->param('fieldlength' => $data->{'options'});
} elsif ($data->{'type'} eq 'Textarea') {
$template->param('type-textarea' => 1);
$data->{options} =~ /(.*)\|(.*)/;
$template->param('cols' => $1, 'rows' => $2);;
} elsif ($data->{'type'} eq 'Float') {
$template->param('type-free' => 1);
$template->param('fieldlength' => $data->{'options'});
} elsif ($data->{'type'} eq 'Themes') {
$template->param('type-choice' => 1);
my $type='';
($data->{'variable'}=~m#opac#i) ? ($type='opac') : ($type='intranet');
@options=();
my $currently_selected_themes;
my $counter=0;
foreach my $theme (split /\s+/, $data->{'value'}) {
push @options, { option => $theme, counter => $counter };
$currently_selected_themes->{$theme}=1;
$counter++;
}
foreach my $theme (getallthemes($type)) {
my $selected='0';
next if $currently_selected_themes->{$theme};
push @options, { option => $theme, counter => $counter };
$counter++;
}
} elsif ($data->{'type'} eq 'ClassSources') {
$template->param('type-choice' => 1);
my $type='';
@options=();
my $sources = GetClassSources();
my $counter=0;
foreach my $cn_source (sort keys %$sources) {
if ($cn_source eq $data->{'value'}) {
push @options, { option => $cn_source, counter => $counter, selected => 1 };
} else {
push @options, { option => $cn_source, counter => $counter };
}
$counter++;
}
} elsif ($data->{'type'} eq 'Languages') {
my $currently_selected_languages;
foreach my $language (split /\s+/, $data->{'value'}) {
$currently_selected_languages->{$language}=1;
}
# current language
my $lang = $template->param('lang');
my $theme;
my $interface;
if ($data->{'variable'} =~ /opac/) {
# this is the OPAC
$interface = 'opac';
$theme = C4::Context->preference('opacthemes');
}
else {
# this is the staff client
$interface = 'intranet';
$theme = C4::Context->preference('template');
}
my $languages_loop = getTranslatedLanguages($interface,$theme,$lang,$currently_selected_languages);
$data->{'lang'} = $template->param('lang');
$template->param('languages_loop' => $languages_loop);
$template->param('type-langselector' => 1);
} else {
$template->param('type-free' => 1);
$template->param('fieldlength' => $data->{'options'}>0?$data->{'options'}:60);
}
$template->param(explanation => $data->{'explanation'},
value => $data->{'value'},
type => $data->{'type'},
options => \@options,
preftype => $data->{'type'},
prefoptions => $data->{'options'},
searchfield => $searchfield);
$template->param( GetPrefParams( $data ) );
$template->param( searchfield => $searchfield );
################## ADD_VALIDATE ##################################
# called by add_form, used to insert/modify data in DB
@ -568,7 +586,8 @@ if ($op eq 'add_form') {
my $value;
# handle multiple value strings (separated by ',')
my $params = $input->Vars;
my @values = split("\0",$params->{'value'}) if $params->{'value'};
my @values = ();
@values = split("\0",$params->{'value'}) if $params->{'value'};
for my $vl (@values) {
$value .= "$vl,";
}
@ -629,16 +648,13 @@ if ($op eq 'add_form') {
} else {
$toggle=0;
}
my %row_data; # get a fresh hash for the row data
$row_data{variable} = $results->[$i]{'variable'};
$row_data{value} = $results->[$i]{'value'};
$row_data{yes} = 1 if ($results->[$i]{'value'} == 1);
$row_data{yesno} = 1 if ($results->[$i]{'type'} eq 'YesNo');
$row_data{explanation} = $results->[$i]{'explanation'};
$row_data{toggle} = $toggle;
$row_data{edit} = "$script_name?op=add_form&amp;searchfield=".$results->[$i]{'variable'};
$row_data{delete} = "$script_name?op=delete_confirm&amp;searchfield=".$results->[$i]{'variable'};
push(@loop_data, \%row_data);
my $row_data = $results->[$i];
$row_data->{'lang'} = $template->param('lang');
$row_data = GetPrefParams( $row_data ); # get a fresh hash for the row data
$row_data->{toggle} = $toggle;
$row_data->{edit} = "$script_name?op=add_form&amp;searchfield=".$results->[$i]{'variable'};
$row_data->{delete} = "$script_name?op=delete_confirm&amp;searchfield=".$results->[$i]{'variable'};
push(@loop_data, $row_data);
}
$tab=($tab?$tab:"Local Use");
$template->param(loop => \@loop_data, $tab => 1);

View File

@ -362,6 +362,10 @@ div#reserves,div#checkouts {
color : Gray;
}
.single-line {
white-space: nowrap;
}
.ex {
font-family : "Courier New", Courier, fixed-width;
font-weight : bold;

View File

@ -63,6 +63,13 @@
alert(alertString2);
}
}
$( function() {
$( '#sysprefst .expand-textarea' ).show().click( function () {
$( this ).hide().nextAll( 'textarea, input[type=submit]' ).show( 'slow' );
return false;
} ).nextAll( 'textarea, input[type=submit]' ).hide();
} );
//]]>
</script>
</head>
@ -111,9 +118,9 @@
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="type-langselector" -->
<!-- TMPL_IF NAME="languages_loop" -->
<table>
<table>
<!-- TMPL_LOOP NAME="languages_loop" -->
<tr><td>
<tr><td>
<!-- TMPL_IF NAME="plural" -->
<!-- TMPL_IF NAME="native_description" --><!-- TMPL_VAR NAME="native_description" --><!-- TMPL_ELSE --><!-- TMPL_VAR NAME="rfc4646_subtag" --><!-- /TMPL_IF -->
<!-- TMPL_LOOP NAME="sublanguages_loop" --><table><tr><td>
@ -136,18 +143,23 @@
<input value="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" name="value" id="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" type="checkbox" <!-- TMPL_IF NAME="group_enabled" -->checked="checked"<!-- /TMPL_IF --> /> </label>
<!-- /TMPL_IF -->
<!-- /TMPL_IF -->
</td></tr>
</td></tr>
<!-- /TMPL_LOOP -->
</table>
</table>
<!-- /TMPL_IF -->
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="type-yesno" -->
<!-- TMPL_IF NAME="value-yes" -->
<input type="radio" name="value" id="value" value="1" checked="checked" /><!-- TMPL_ELSE --><input type="radio" name="value" id="value" value="1" /><!-- /TMPL_IF --> <label for="value" class="yesno">ON</label>
<!-- TMPL_IF NAME="value-no" -->
<input type="radio" name="value" id="value-no" value="0" checked="checked" /><!-- TMPL_ELSE --><input type="radio" name="value" id="value-no" value="0" /><!-- /TMPL_IF --> <label for="value-no" class="yesno">OFF</label><!-- /TMPL_IF -->
<input type="radio" name="value" id="value" value="1" checked="checked" /><!-- TMPL_ELSE --><input type="radio" name="value" id="value" value="1" />
<!-- /TMPL_IF -->
<label for="value" class="yesno">ON</label>
<!-- TMPL_IF NAME="value-no" -->
<input type="radio" name="value" id="value-no" value="0" checked="checked" /><!-- TMPL_ELSE --><input type="radio" name="value" id="value-no" value="0" />
<!-- /TMPL_IF -->
<label for="value-no" class="yesno">OFF</label>
<!-- /TMPL_IF -->
</li>
</ol></fieldset>
<fieldset class="action"><input type="submit" value="Save" />
@ -195,11 +207,11 @@
<!-- TMPL_VAR NAME="Tvalue" -->
</td></tr></table>
<form class="inline" action="<!-- TMPL_VAR NAME="script_name" -->" method="post">
<input type="hidden" name="op" value="delete_confirmed" />
<input type="hidden" name="searchfield" value="<!-- TMPL_VAR NAME="searchfield" -->" />
<input type="hidden" name="Tvalue" value="<!-- TMPL_VAR NAME="Tvalue" -->" />
<input type="hidden" name="op" value="delete_confirmed" />
<input type="hidden" name="searchfield" value="<!-- TMPL_VAR NAME="searchfield" -->" />
<input type="hidden" name="Tvalue" value="<!-- TMPL_VAR NAME="Tvalue" -->" />
<input type="submit" value="Yes, Delete" /></form>
<form class="inline" action="<!-- TMPL_VAR NAME="script_name" -->" method="post"><input type="submit" value="No, Do not Delete" /></form>
<form class="inline" action="<!-- TMPL_VAR NAME="script_name" -->" method="post"><input type="submit" value="No, Do not Delete" /></form>
<!-- /TMPL_IF -->
@ -215,16 +227,16 @@
<!-- TMPL_IF NAME="else" -->
<div id="toolbar">
<script type="text/javascript" src="<!-- TMPL_VAR name="themelang" -->/lib/jquery/plugins/jquery.tablesorter.min.js"></script>
<script type="text/javascript" src="<!-- TMPL_VAR name="themelang" -->/lib/jquery/plugins/jquery.tablesorter.min.js"></script>
<script type="text/javascript">
//<![CDATA[
// prepare DOM for YUI Toolbar
$(document).ready(function() {
yuiToolbar();
<!-- TMPL_IF NAME="loop" -->$("#sysprefst").tablesorter({
sortList: [[0,0]],
headers: { 1: {sorter:false},2: { sorter: false },3: { sorter: false },4: { sorter: false }}
});<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="loop" -->$("#sysprefst").tablesorter({
sortList: [[0,0]],
headers: { 1: {sorter:false},2: { sorter: false },3: { sorter: false },4: { sorter: false }}
});<!-- /TMPL_IF -->
});
// YUI Toolbar Functions
function yuiToolbar() {
@ -250,9 +262,83 @@
<!-- TMPL_IF NAME="toggle" --><tr class="highlight"><!-- TMPL_ELSE --><tr><!-- /TMPL_IF -->
<td><strong><a href="<!-- TMPL_VAR NAME="edit" -->"><!-- TMPL_VAR NAME="variable" --></a></strong></td><td> <!-- TMPL_VAR NAME="explanation" ESCAPE="HTML" --></td>
<td><!-- TMPL_IF NAME="yesno" -->
<!-- TMPL_IF NAME="yes" -->ON<!-- TMPL_ELSE -->OFF<!-- /TMPL_IF -->
<!-- TMPL_ELSE --><!-- TMPL_VAR NAME="value" --><!-- /TMPL_IF --></td>
<!-- TMPL_IF NAME="oneline" -->
<td class="single-line">
<!-- TMPL_ELSE -->
<td>
<!-- /TMPL_IF -->
<form action="/cgi-bin/koha/admin/systempreferences.pl" method="post">
<!-- TMPL_IF NAME="type-free" -->
<input type="text" name="value" size="<!-- TMPL_VAR NAME="fieldlength" -->" value="<!-- TMPL_VAR NAME="value" escape="HTML" -->" />
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="type-textarea" -->
<a class="expand-textarea" style="display: none" href="#">Click to Edit</a>
<textarea name="value" rows="<!--TMPL_VAR NAME="rows" -->" cols="<!-- TMPL_VAR NAME="cols" -->"><!-- TMPL_VAR NAME="value" escape="HTML" --></textarea>
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="type-choice" -->
<select name="value">
<!-- TMPL_LOOP NAME="options" -->
<!-- TMPL_IF NAME="selected" -->
<option value="<!-- TMPL_VAR NAME="option" -->" selected="selected">
<!-- TMPL_ELSE -->
<option value="<!-- TMPL_VAR NAME="option" -->">
<!-- /TMPL_IF --><!-- TMPL_VAR NAME="option" --></option>
<!-- /TMPL_LOOP -->
</select>
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="type-langselector" -->
<!-- TMPL_IF NAME="languages_loop" -->
<table>
<!-- TMPL_LOOP NAME="languages_loop" -->
<tr><td>
<!-- TMPL_IF NAME="plural" -->
<!-- TMPL_IF NAME="native_description" --><!-- TMPL_VAR NAME="native_description" --><!-- TMPL_ELSE --><!-- TMPL_VAR NAME="rfc4646_subtag" --><!-- /TMPL_IF -->
<!-- TMPL_LOOP NAME="sublanguages_loop" --><table><tr><td>
<!-- TMPL_IF NAME="sublanguage_current" -->
<label for="<!-- TMPL_VAR NAME="rfc4646_subtag" -->"><!-- TMPL_VAR NAME="native_description" --> <!-- TMPL_VAR NAME="script_description" --> <!-- TMPL_VAR NAME="region_description" --> <!-- TMPL_VAR NAME="variant_description" -->(<!-- TMPL_VAR NAME="rfc4646_subtag" -->)
<input value="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" name="value" id="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" type="checkbox" <!-- TMPL_IF NAME="enabled" -->checked="checked"<!-- /TMPL_IF --> /> </label>
<!-- TMPL_ELSE -->
<label for="<!-- TMPL_VAR NAME="rfc4646_subtag" -->"><!-- TMPL_VAR NAME="native_description" --> <!-- TMPL_VAR NAME="script_description" --> <!-- TMPL_VAR NAME="region_description" --> <!-- TMPL_VAR NAME="variant_description" -->(<!-- TMPL_VAR NAME="rfc4646_subtag" -->)
<input value="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" name="value" id="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" type="checkbox" <!-- TMPL_IF NAME="enabled" -->checked="checked"<!-- /TMPL_IF --> /> </label>
<!-- /TMPL_IF --></td></tr></table>
<!-- /TMPL_LOOP -->
<!-- TMPL_ELSE -->
<!-- TMPL_IF NAME="current" -->
<label for="<!-- TMPL_VAR NAME="rfc4646_subtag" -->"><!-- TMPL_VAR NAME="native_description" -->(<!-- TMPL_VAR NAME="rfc4646_subtag" -->)
<input value="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" name="value" id="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" type="checkbox" <!-- TMPL_IF NAME="group_enabled" -->checked="checked"<!-- /TMPL_IF --> /> </label>
<!-- TMPL_ELSE -->
<label for="<!-- TMPL_VAR NAME="rfc4646_subtag" -->"><!-- TMPL_VAR NAME="native_description" -->(<!-- TMPL_VAR NAME="rfc4646_subtag" -->)
<input value="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" name="value" id="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" type="checkbox" <!-- TMPL_IF NAME="group_enabled" -->checked="checked"<!-- /TMPL_IF --> /> </label>
<!-- /TMPL_IF -->
<!-- /TMPL_IF -->
</td></tr>
<!-- /TMPL_LOOP -->
</table>
<!-- /TMPL_IF -->
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="type-yesno" -->
<!-- TMPL_IF NAME="value-yes" -->
<input type="radio" name="value" value="1" checked="checked" /><!-- TMPL_ELSE --><input type="radio" name="value" value="1" />
<!-- /TMPL_IF -->
<label for="value" class="yesno">ON</label>
<!-- TMPL_IF NAME="value-no" -->
<input type="radio" name="value" value="0" checked="checked" /><!-- TMPL_ELSE --><input type="radio" name="value" value="0" />
<!-- /TMPL_IF -->
<label for="value-no" class="yesno">OFF</label>
<!-- /TMPL_IF -->
<input type="hidden" name="op" value="add_validate" />
<input type="hidden" name="variable" value="<!-- TMPL_VAR NAME="variable" -->" />
<input type="hidden" name="prefoptions" value="<!-- TMPL_VAR NAME="prefoptions" escape="HTML" -->" />
<input type="hidden" name="preftype" value="<!-- TMPL_VAR NAME="type" -->" />
<input type="hidden" name="explanation" value="<!-- TMPL_VAR NAME="explanation" escape="HTML" -->" />
<input type="submit" value="Save" />
</form>
</td>
<td><a href="<!-- TMPL_VAR NAME="edit" -->">Edit </a></td>
<td><a href="<!-- TMPL_VAR NAME="delete" -->">Delete</a></td>