From 4dc85d2f0a7b8fb682fb0f492cc06c8f1a16bc31 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Demians?= Date: Tue, 13 Jul 2010 20:49:25 +0200 Subject: [PATCH] Bug 3756 Difference between original and local sysprefs Amend Chris N. patch in order to display local sysprefs as the difference between DB sysprefs and .pref files sysprefs. As a side effect, local sysprefs editor displays also deprecated sysprefs which is a feature from my point of view. For example, GranularPermissions is displayed as a local syspref because it has been removed recently from admin.pref but hasn't been yet removed from DB (could be done later with a DB update). Signed-off-by: Galen Charlton --- admin/systempreferences.pl | 90 +++++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 5 deletions(-) diff --git a/admin/systempreferences.pl b/admin/systempreferences.pl index 9191ecf450..24d83d9cd6 100755 --- a/admin/systempreferences.pl +++ b/admin/systempreferences.pl @@ -52,6 +52,8 @@ use C4::Languages qw(getTranslatedLanguages); use C4::ClassSource; use C4::Log; use C4::Output; +use YAML::Syck qw( Dump LoadFile ); + # use Smart::Comments; @@ -458,12 +460,14 @@ sub StringSearch { 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) . ","; + my $strsth = "Select variable,value,explanation,type,options from systempreferences where variable in ("; + my $first = 1; + for my $name ( get_local_prefs() ) { + $strsth .= ',' unless $first; + $strsth .= "'$name'"; + $first = 0; } - $strsth =~ s/,$/) /; - $strsth .= " order by variable"; + $strsth .= ") order by variable"; $sth = $dbh->prepare($strsth); $sth->execute(); } @@ -810,3 +814,79 @@ if ( $op eq 'add_form' ) { $template->param( tab => $tab, ); } #---- END $OP eq DEFAULT output_html_with_http_headers $input, $cookie, $template->output; + + +# Return an array containing all preferences defined in current Koha instance +# .pref files. + +sub get_prefs_from_files { + my $context = C4::Context->new(); + my $path_pref_en = $context->config('intrahtdocs') . + '/prog/en/modules/admin/preferences'; + # Get all .pref file names + opendir ( my $fh, $path_pref_en ); + my @pref_files = grep { /.pref/ } readdir($fh); + close $fh; + + my @names = (); + my $append = sub { + my $prefs = shift; + for my $pref ( @$prefs ) { + for my $element ( @$pref ) { + if ( ref( $element) eq 'HASH' ) { + my $name = $element->{pref}; + next unless $name; + push @names, $name; + last; + } + } + } + }; + for my $file (@pref_files) { + my $pref = LoadFile( "$path_pref_en/$file" ); + for my $tab ( keys %$pref ) { + my $content = $pref->{$tab}; + if ( ref($content) eq 'ARRAY' ) { + $append->($content); + next; + } + for my $section ( keys %$content ) { + my $syspref = $content->{$section}; + $append->($syspref); + } + } + } + return @names; +} + + +# Return an array containg all preferences defined in DB + +sub get_prefs_from_db { + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("SELECT variable FROM systempreferences"); + $sth->execute; + my @names = (); + while ( (my $name) = $sth->fetchrow_array ) { + push @names, $name if $name; + } + return @names; +} + + +# Return an array containing all local preferences: those which are defined in +# DB and not defined in Koha .pref files. + +sub get_local_prefs { + my @prefs_file = get_prefs_from_files(); + my @prefs_db = get_prefs_from_db(); + + my %prefs_file = map { $_ => 1 } @prefs_file; + my @names = (); + foreach my $name (@prefs_db) { + push @names, $name unless $prefs_file{$name}; + } + + return @names; +} + -- 2.39.5