Bugzilla – Attachment 48224 Details for
Bug 15774
Additional fields for baskets
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 15774: Add additional fields to order baskets
Bug-15774-Add-additional-fields-to-order-baskets.patch (text/plain), 45.19 KB, created by
Jesse Weaver
on 2016-02-18 23:07:43 UTC
(
hide
)
Description:
Bug 15774: Add additional fields to order baskets
Filename:
MIME Type:
Creator:
Jesse Weaver
Created:
2016-02-18 23:07:43 UTC
Size:
45.19 KB
patch
obsolete
>From f1a6a32b7c4a726f572009b9c90a630a19096861 Mon Sep 17 00:00:00 2001 >From: Jesse Weaver <jweaver@bywatersolutions.com> >Date: Wed, 10 Feb 2016 12:29:06 -0700 >Subject: [PATCH] Bug 15774: Add additional fields to order baskets > >This also moves the admin page for additional fields for all tables to a >single common screen, and factors out display/input parsing logic. > >Test plan: > 1. Create an additional field for a subscription (under Serials -> Add > subscription fields). > 2. Apply patch. > 3. Visit Additional fields under administration, and verify that > the field created above still shows under the list for the > subscription table. > 4. Create at least four fields for aqbasket for each combination of > searchable/not-searchable and with/without an authorized value. > 5. Create an order basket, and verify that all fields are visible and > correctly save. > 6. Edit the basket, verifying that changes to these additional fields > are saved. > 7. Add an order to the basket (contents are irrelevant). > 8. Go to advanced search within acquisitions. > 9. Verify that only the searchable fields show in the form, and that > their contents may be searched. >--- > C4/Acquisition.pm | 12 ++ > Koha/AdditionalField.pm | 98 +++++++++++ > acqui/basket.pl | 7 + > acqui/basketheader.pl | 16 ++ > acqui/histsearch.pl | 9 + > .../add_fields.pl => admin/additional-fields.pl | 14 +- > .../prog/en/includes/additional-fields-display.inc | 11 ++ > .../prog/en/includes/additional-fields-entry.inc | 33 ++++ > .../intranet-tmpl/prog/en/includes/admin-menu.inc | 1 + > .../prog/en/includes/serials-menu.inc | 1 - > .../intranet-tmpl/prog/en/modules/acqui/basket.tt | 1 + > .../prog/en/modules/acqui/basketheader.tt | 5 + > .../prog/en/modules/acqui/histsearch.tt | 3 + > .../prog/en/modules/admin/additional-fields.tt | 194 +++++++++++++++++++++ > .../prog/en/modules/admin/admin-home.tt | 2 + > .../prog/en/modules/serials/add_fields.tt | 176 ------------------- > .../prog/en/modules/serials/serials-search.tt | 16 +- > .../prog/en/modules/serials/subscription-add.tt | 33 +--- > serials/serials-search.pl | 21 +-- > serials/subscription-add.pl | 48 ++--- > 20 files changed, 424 insertions(+), 277 deletions(-) > rename serials/add_fields.pl => admin/additional-fields.pl (88%) > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/additional-fields-display.inc > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/additional-fields-entry.inc > create mode 100755 koha-tmpl/intranet-tmpl/prog/en/modules/admin/additional-fields.tt > delete mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/serials/add_fields.tt > >diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm >index 4044556..4c7d274 100644 >--- a/C4/Acquisition.pm >+++ b/C4/Acquisition.pm >@@ -2161,6 +2161,7 @@ sub GetHistory { > my $ordernumber = $params{ordernumber}; > my $search_children_too = $params{search_children_too} || 0; > my $created_by = $params{created_by} || []; >+ my $additional_fields = $params{additional_fields} // []; > > my @order_loop; > my $total_qty = 0; >@@ -2302,6 +2303,17 @@ sub GetHistory { > push @query_params, @$created_by; > } > >+ if ( @$additional_fields ) { >+ my $matching_record_ids_for_additional_fields = Koha::AdditionalField->get_matching_record_ids( { >+ fields => $additional_fields, >+ tablename => 'aqbasket', >+ exact_match => 0, >+ } ); >+ return [] unless @$matching_record_ids_for_additional_fields; >+ >+ # No parameterization because record IDs come directly from DB >+ $query .= ' AND aqbasket.basketno IN ( ' . join( ',', @$matching_record_ids_for_additional_fields ) . ' )'; >+ } > > if ( C4::Context->preference("IndependentBranches") ) { > unless ( C4::Context->IsSuperLibrarian() ) { >diff --git a/Koha/AdditionalField.pm b/Koha/AdditionalField.pm >index 563a7f3..7c4903a 100644 >--- a/Koha/AdditionalField.pm >+++ b/Koha/AdditionalField.pm >@@ -265,6 +265,63 @@ sub get_matching_record_ids { > ] > } > >+sub update_fields_from_query { >+ my ( $class, $args ) = @_; >+ die "BAD CALL: Don't use update_fields_from_query as an instance method" >+ if ref $class and UNIVERSAL::can($class,'can'); >+ >+ my $query = $args->{query}; >+ my $additional_fields = Koha::AdditionalField->all( { tablename => $args->{tablename} } ); >+ for my $field ( @$additional_fields ) { >+ my $af = Koha::AdditionalField->new({ id => $field->{id} })->fetch; >+ if ( $af->{marcfield} ) { >+ my ( $field, $subfield ) = split /\$/, $af->{marcfield}; >+ $af->{values} = undef; >+ if ( $args->{marc_record} and $field and $subfield ) { >+ my $value = $args->{marc_record}->subfield( $field, $subfield ); >+ $af->{values} = { >+ $args->{record_id} => $value >+ }; >+ } >+ } else { >+ $af->{values} = { >+ $args->{record_id} => $query->param( 'additional_field_' . $field->{id} ) >+ } if defined $query->param( 'additional_field_' . $field->{id} ); >+ } >+ $af->insert_values; >+ } >+} >+ >+sub get_filters_from_query { >+ my ( $class, $args ) = @_; >+ die "BAD CALL: Don't use get_filters_from_query as an instance method" >+ if ref $class and UNIVERSAL::can($class,'can'); >+ >+ my $query = $args->{query}; >+ my $additional_fields = Koha::AdditionalField->all( { tablename => $args->{tablename}, searchable => 1 } ); >+ my @additional_field_filters; >+ for my $field ( @$additional_fields ) { >+ my $filter_value = $query->param( 'additional_field_' . $field->{id} ); >+ if ( defined $filter_value and $filter_value ne q|| ) { >+ push @additional_field_filters, { >+ name => $field->{name}, >+ value => $filter_value, >+ authorised_value_category => $field->{authorised_value_category}, >+ }; >+ } >+ } >+ >+ return \@additional_field_filters; >+} >+ >+sub get_filters_as_values { >+ my ( $class, $filters ) = @_; >+ die "BAD CALL: Don't use get_filters_as_values as an instance method" >+ if ref $class and UNIVERSAL::can($class,'can'); >+ >+ return { map { $_->{name} => $_->{value} } @$filters }; >+} >+ > 1; > > __END__ >@@ -414,6 +471,47 @@ This is a static method. > } > ); > >+=head2 update_fields_from_query >+ >+Updates fields based on user input (best paired with additional-fields-entry.pl) and optionally a MARC record. >+ >+This is a static method. >+ >+ Koha::AdditionalField->update_fields_from_query( { >+ tablename => 'aqbasket', >+ input => $input, >+ record_id => $basketno, >+ marc_record => GetBiblio( $biblionumber ), >+ } ); >+ >+=head2 get_filters_from_query >+ >+Extracts a list of search filters from user input, to be used with C<get_matching_record_ids> and >+C<get_filters_as_values>. >+ >+This is a static method. >+ >+ my $filters = Koha::AdditionalField->get_filters_from_query( { >+ tablename => 'aqbasket', >+ input => $input, >+ } ); >+ >+=head2 get_filters_as_values >+ >+Transforms the result of C<get_filters_from_query> into a hashref of C<name> => C<value>, so >+user-entered filters can be redisplayed. >+ >+ $template->param( >+ additional_field_values => Koha::AdditionalField->get_filters_as_values( >+ $filters >+ ), >+ ); >+ >+ [% INCLUDE 'additional-field-entry.inc' >+ values=additional_field_values >+ available=available_additional_fields >+ %] >+ > =head1 AUTHOR > > Jonathan Druart <jonathan.druart at biblibre.com> >diff --git a/acqui/basket.pl b/acqui/basket.pl >index 5fa94f8..c620bbd 100755 >--- a/acqui/basket.pl >+++ b/acqui/basket.pl >@@ -37,6 +37,8 @@ use C4::Items; > use C4::Suggestions; > use Date::Calc qw/Add_Delta_Days/; > >+use Koha::AdditionalField; >+ > =head1 NAME > > basket.pl >@@ -392,6 +394,11 @@ if ( $op eq 'delete_confirm' ) { > unclosable => @orders ? 0 : 1, > has_budgets => $has_budgets, > duplinbatch => $duplinbatch, >+ available_additional_fields => Koha::AdditionalField->all( { tablename => 'aqbasket' } ), >+ additional_field_values => Koha::AdditionalField->fetch_all_values( { >+ tablename => 'aqbasket', >+ record_id => $basketno, >+ } )->{$basketno}, > ); > } > >diff --git a/acqui/basketheader.pl b/acqui/basketheader.pl >index a4ef0b9..1ddea7c 100755 >--- a/acqui/basketheader.pl >+++ b/acqui/basketheader.pl >@@ -56,6 +56,7 @@ use C4::Acquisition qw/GetBasket NewBasket ModBasketHeader/; > use C4::Contract qw/GetContracts/; > > use Koha::Acquisition::Bookseller; >+use Koha::AdditionalField; > > my $input = new CGI; > my ( $template, $loggedinuser, $cookie ) = get_template_and_user( >@@ -77,6 +78,8 @@ my $basket; > my $op = $input ->param('op'); > my $is_an_edit= $input ->param('is_an_edit'); > >+$template->param( available_additional_fields => scalar Koha::AdditionalField->all( { tablename => 'aqbasket' } ) ); >+ > if ( $op eq 'add_form' ) { > my @contractloop; > if ( $basketno ) { >@@ -97,6 +100,12 @@ if ( $op eq 'add_form' ) { > } > } > $template->param( is_an_edit => 1); >+ $template->param( >+ additional_field_values => Koha::AdditionalField->fetch_all_values( { >+ tablename => 'aqbasket', >+ record_id => $basketno, >+ } )->{$basketno}, >+ ); > } else { > #new basket > my $basket; >@@ -161,6 +170,13 @@ if ( $op eq 'add_form' ) { > $input->param('billingplace'), > ); > } >+ >+ Koha::AdditionalField->update_fields_from_query( { >+ tablename => 'aqbasket', >+ record_id => $basketno, >+ query => $input, >+ } ); >+ > print $input->redirect('basket.pl?basketno='.$basketno); > exit 0; > } >diff --git a/acqui/histsearch.pl b/acqui/histsearch.pl >index efb9468..f8c502e 100755 >--- a/acqui/histsearch.pl >+++ b/acqui/histsearch.pl >@@ -58,6 +58,7 @@ use C4::Acquisition; > use C4::Debug; > use C4::Branch; > use C4::Koha; >+use Koha::AdditionalField; > use Koha::DateUtils; > > my $input = new CGI; >@@ -95,6 +96,12 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( > } > ); > >+$template->param( available_additional_fields => scalar Koha::AdditionalField->all( { tablename => 'aqbasket', searchable => 1 } ) ); >+my $additional_field_filters = Koha::AdditionalField->get_filters_from_query( { >+ tablename => 'aqbasket', >+ query => $input, >+} ); >+ > my $order_loop; > # If we're supplied any value then we do a search. Otherwise we don't. > if ($do_search) { >@@ -114,6 +121,7 @@ if ($do_search) { > ordernumber => $ordernumber, > search_children_too => $search_children_too, > created_by => \@created_by, >+ additional_fields => $additional_field_filters, > ); > } > >@@ -146,6 +154,7 @@ $template->param( > budget_id => $budget, > bp_loop => $bp_loop, > search_done => $do_search, >+ additional_field_filters => Koha::AdditionalField->get_filters_as_values( $additional_field_filters ), > debug => $debug || $input->param('debug') || 0, > uc(C4::Context->preference("marcflavour")) => 1 > ); >diff --git a/serials/add_fields.pl b/admin/additional-fields.pl >similarity index 88% >rename from serials/add_fields.pl >rename to admin/additional-fields.pl >index 9451a1b..a01f71a 100755 >--- a/serials/add_fields.pl >+++ b/admin/additional-fields.pl >@@ -27,16 +27,17 @@ my $input = new CGI; > > my ( $template, $loggedinuser, $cookie ) = get_template_and_user( > { >- template_name => "serials/add_fields.tt", >+ template_name => "admin/additional-fields.tt", > query => $input, > type => "intranet", > authnotrequired => 0, >- flagsrequired => { serials => '*' }, >+ flagsrequired => { parameters => 1 }, > debug => 1, > } > ); > >-my $op = $input->param('op') // 'list'; >+my $tablename = $input->param('tablename'); >+my $op = $input->param('op') // ( $tablename ? 'list' : 'list_tables' ); > my $field_id = $input->param('field_id'); > my @messages; > >@@ -65,7 +66,7 @@ if ( $op eq 'add' ) { > my $inserted = 0; > eval { > my $af = Koha::AdditionalField->new({ >- tablename => 'subscription', >+ tablename => $tablename, > name => $name, > authorised_value_category => $authorised_value_category, > marcfield => $marcfield, >@@ -107,6 +108,8 @@ if ( $op eq 'add_form' ) { > $field = Koha::AdditionalField->new( { id => $field_id } )->fetch; > } > >+ $tablename = $field->{tablename}; >+ > $template->param( > field => $field, > categories => $categories, >@@ -114,12 +117,13 @@ if ( $op eq 'add_form' ) { > } > > if ( $op eq 'list' ) { >- my $fields = Koha::AdditionalField->all( { tablename => 'subscription' } ); >+ my $fields = Koha::AdditionalField->all( { tablename => $tablename } ); > $template->param( fields => $fields ); > } > > $template->param( > op => $op, >+ tablename => $tablename, > messages => \@messages, > ); > >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/additional-fields-display.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/additional-fields-display.inc >new file mode 100644 >index 0000000..41771a8 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/additional-fields-display.inc >@@ -0,0 +1,11 @@ >+[% USE AuthorisedValues %] >+[% FOR field IN available %] >+ <li> >+ <span class="label"> [% field.name %]: </span> >+ [% IF field.authorised_value_category %] >+ [% AuthorisedValues.GetByCode( field.authorised_value_category, values.${field.name} ) %] >+ [% ELSE %] >+ [% values.${field.name} %] >+ [% END %] >+ </li> >+[% END %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/additional-fields-entry.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/additional-fields-entry.inc >new file mode 100644 >index 0000000..a961e55 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/additional-fields-entry.inc >@@ -0,0 +1,33 @@ >+[% USE AuthorisedValues %] >+[% IF wrap_fieldset != 0 %] >+<fieldset class="rows"> >+ <legend>Additional fields</legend> >+ <ol> >+[% END %] >+ [% FOR field IN available %] >+ <li> >+ <label for="additional_field_[% field.id %]"> [% field.name %]: </label> >+ [% IF field.authorised_value_category %] >+ <select name="additional_field_[% field.id %]" id="additional_field_[% field.id %]"> >+ [% FOREACH av IN AuthorisedValues.Get( field.authorised_value_category, values.${field.name} ) %] >+ [% IF av.selected %] >+ <option value="[% av.authorised_value %]" selected="selected">[% av.lib %]</option> >+ [% ELSE %] >+ <option value="[% av.authorised_value %]">[% av.lib %]</option> >+ [% END %] >+ [% END %] >+ </select> (Authorised values for [% field.authorised_value_category %]) >+ [% ELSE %] >+ [% IF field.marcfield %] >+ <input type="text" value="[% values.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" readonly="readonly" /> >+ This value will be filled with the [% field.marcfield %] subfield of the selected biblio. >+ [% ELSE %] >+ <input type="text" value="[% values.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" /> >+ [% END %] >+ [% END %] >+ </li> >+ [% END %] >+[% IF wrap_fieldset != 0 %] >+ </ol> >+</fieldset> >+[% END %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc >index 6e6fa49..d57a141 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc >@@ -72,6 +72,7 @@ > <li><a href="/cgi-bin/koha/admin/didyoumean.pl">Did you mean?</a></li> > <li><a href="/cgi-bin/koha/admin/columns_settings.pl">Columns settings</a></li> > <li><a href="/cgi-bin/koha/admin/audio_alerts.pl">Audio alerts</a></li> >+ <li><a href="/cgi-bin/koha/admin/additional-fields.pl">Additional fields</a></li> > </ul> > </div> > </div> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc >index 21dff3a..b6c4b32 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc >@@ -30,5 +30,4 @@ > Manage numbering patterns > </a> > </li> >- <li><a href="/cgi-bin/koha/serials/add_fields.pl">Add subscription fields</a></li> > </ul> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt >index 3b3e1b1..f8b4710 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt >@@ -306,6 +306,7 @@ > [% IF ( creationdate ) %]<li><span class="label">Opened on:</span> [% creationdate | $KohaDates %]</li>[% END %] > [% IF ( closedate ) %]<li><span class="label">Closed on:</span> [% closedate | $KohaDates %]</li>[% END %] > [% IF ( estimateddeliverydate ) %]<li><span class="label">Estimated delivery date:</span> [% estimateddeliverydate | $KohaDates %]</li>[% END %] >+ [% INCLUDE 'additional-fields-display.inc' available=available_additional_fields values=additional_field_values %] > > </ol> > </div> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketheader.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketheader.tt >index 84b318c..18ce2b5 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketheader.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketheader.tt >@@ -115,6 +115,11 @@ > [% END %] > </ol> > </fieldset> >+ >+ [% IF available_additional_fields %] >+ [% INCLUDE 'additional-fields-entry.inc' available=available_additional_fields values=additional_field_values %] >+ [% END %] >+ > <fieldset class="action"> > <input type="hidden" name="op" value="add_validate" /> > <input type="submit" value="Save" /> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/histsearch.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/histsearch.tt >index 988fd27..fa2d88e 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/histsearch.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/histsearch.tt >@@ -70,6 +70,9 @@ var MSG_REMOVE_PATRON = _("Remove"); > <label for="basketgroupname">Basket group:</label> > <input type="text" name="basketgroupname" id="basketgroupname" value="[% basketgroupname %]" /> > </li> >+ >+ [% INCLUDE 'additional-fields-entry.inc' available=available_additional_fields values=additional_field_filters wrap_fieldset=0 %] >+ > <li> > <label for="ordernumber">Order line:</label> > <input type="text" name="ordernumber" id="ordernumber" value="[% ordernumber %]" /> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/additional-fields.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/additional-fields.tt >new file mode 100755 >index 0000000..68aa704 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/additional-fields.tt >@@ -0,0 +1,194 @@ >+[% INCLUDE 'doc-head-open.inc' %] >+<title>Koha › Administration › >+ [% SWITCH op %] >+ [% CASE 'add_form' %][% IF field %]Modify additional field '[% field.name %]'[% ELSE %]Add additional field[% END %] >+ [% CASE %]Manage additional fields >+ [% END %] >+</title> >+[% INCLUDE 'doc-head-close.inc' %] >+<link rel="stylesheet" type="text/css" href="[% themelang %]/css/datatables.css" /> >+[% INCLUDE "datatables.inc" %] >+<script type="text/javascript"> >+//<![CDATA[ >+ $(document).ready(function(){ >+ $('#selecttable').find(":submit").hide(); >+ $('#selecttable select').change(function() { >+ $('#selecttable').submit(); >+ }); >+ >+ $("#fieldst").dataTable($.extend(true, {}, dataTablesDefaults, { >+ 'bAutoWidth': false, >+ 'sDom': 't<"bottom pager"ilpf>', >+ 'sPaginationType': 'four_button', >+ 'aLengthMenu': [[10, 20, 50, 100, -1], [10, 20, 50, 100, "All"]], >+ 'iDisplayLength': 20, >+ 'aaSorting': [[ 0, "asc" ]], >+ })); >+ >+ $(".confirmdelete").click(function(){ >+ return confirm(_("Are you sure you want to delete this field?")); >+ }); >+ >+ $("#add_field").on('submit', function(){ >+ if ( $("#marcfield").val().length > 0 >+ && $("select[name='authorised_value_category']" ).val().length > 0 ) { >+ alert("You cannot select an authorised value category and a marcfield"); >+ return false; >+ } >+ return true; >+ }); >+ }); >+//]]> >+</script> >+</head> >+ >+<body id="ser_add_fields" class="ser"> >+ [% INCLUDE 'header.inc' %] >+ [% INCLUDE 'cat-search.inc' %] >+ >+ <div id="breadcrumbs"> >+ <a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/admin/admin-home.pl">Administration</a> › >+ [% SWITCH op %] >+ [% CASE 'add_form' %]<a href="/cgi-bin/koha/admin/additional-fields.pl">Manage additional fields</a> › [% IF field %]Modify field '[% field.name %]'[% ELSE %]Add field[% END %] >+ [% CASE 'list' %]<a href="/cgi-bin/koha/admin/additional-fields.pl">Manage additional fields</a> › Modify fields for '[% tablename %]' >+ [% CASE %]Manage additional fields >+ [% END %] >+ </div> >+ >+ <div id="doc3" class="yui-t2"> >+ <div id="bd"> >+ <div id="yui-main"> >+ <div class="yui-b"> >+ [% IF op == 'list' %] >+ <div id="toolbar" class="btn-toolbar"> >+ <a class="btn btn-small" id="newfields" href="?op=add_form&tablename=[% tablename %]"><i class="fa fa-plus"></i> Create field</a> >+ </div> >+ [% END %] >+ >+ [% IF messages %] >+ [% FOR message IN messages %] >+ [% IF message.code == 'insert' %] >+ [% IF message.number > 0 %] >+ <div class="dialog message">The field has been inserted</div> >+ [% ELSE %] >+ <div class="dialog alert">The field has not been inserted (name still exist?)</div> >+ [% END %] >+ [% ELSIF message.code == 'update' %] >+ [% IF message.number > 0 %] >+ <div class="dialog message">The field has been updated</div> >+ [% ELSE %] >+ <div class="dialog alert">The field has not been updated (name still exist?)</div> >+ [% END %] >+ [% ELSIF message.code == 'delete' %] >+ [% IF message.number > 0 %] >+ <div class="dialog message">The field has been deleted</div> >+ [% ELSE %] >+ <div class="dialog alert">The field has not been deleted</div> >+ [% END %] >+ [% END %] >+ [% END %] >+ [% END %] >+ >+ [% IF op == 'list_tables' %] >+ <h3>Additional fields</h3> >+ <p>Select a table:</p> >+ [% BLOCK table_option %] >+ <li><a href="?tablename=[% value %]">[% content %] (<tt>[% value %]</tt>)</a></li> >+ [% END %] >+ <ul> >+ [% WRAPPER table_option value="aqbasket" %]Order baskets[% END %] >+ [% WRAPPER table_option value="subscription" %]Subscriptions[% END %] >+ </ul> >+ [% ELSIF op == 'list' %] >+ <h3>Additional fields for '[% tablename %]'</h3> >+ [% IF fields %] >+ <table id="fieldst"> >+ <thead> >+ <tr> >+ <th>Name</th> >+ <th>Authorised value category</th> >+ <th>MARC field</th> >+ <th>Searchable</th> >+ <th>Actions</th> >+ </tr> >+ </thead> >+ <tbody> >+ [% FOR field IN fields %] >+ <tr> >+ <td>[% field.name %]</td> >+ <td>[% field.authorised_value_category %]</td> >+ <td>[% field.marcfield %]</td> >+ <td> >+ [% IF field.searchable %]Yes[% ELSE %]No[% END %] >+ </td> >+ <td> >+ <a href="?op=add_form&field_id=[% field.id %]" title="Edit this field">Edit</a> >+ <a class="confirmdelete" href="?op=delete&field_id=[% field.id %]" title="Delete this field">Delete</a> >+ </td> >+ </tr> >+ [% END %] >+ </tbody> >+ </table> >+ [% ELSE %] >+ [% IF tablename %]There are no additional fields defined for this table.[% END %] >+ [% END %] >+ [% ELSIF op == 'add_form' %] >+ [% IF field %] >+ <h3>Modify field</h3> >+ [% ELSE %] >+ <h3>Add field</h3> >+ [% END %] >+ <form action="" name="add_form" id="add_field" method="post"> >+ <fieldset class="rows"> >+ <ol> >+ <li> >+ <label for="name" class="required">Name: </label> >+ <input type="text" name="name" id="name" value="[% field.name %]" /> >+ </li> >+ <li> >+ <label for="av">Authorised value category: </label> >+ <select name="authorised_value_category"> >+ <option value="">None</option> >+ [% FOR category IN categories %] >+ [% IF field.authorised_value_category == category %] >+ <option value="[% category %]" selected="selected">[% category %]</option> >+ [% ELSE %] >+ <option value="[% category %]">[% category %]</option> >+ [% END %] >+ [% END %] >+ </select> >+ </li> >+ <li> >+ <label for="marcfield">MARC field: </label> >+ <input type="text" name="marcfield" id="marcfield" value="[% field.marcfield %]" /> >+ </li> >+ <li> >+ <label for="searchable">Searchable: </label> >+ [% IF field.searchable %] >+ <input type="checkbox" name="searchable" id="searchable" checked="checked" /> >+ [% ELSE %] >+ <input type="checkbox" name="searchable" id="searchable" /> >+ [% END %] >+ </li> >+ </ol> >+ </fieldset> >+ <fieldset class="action"> >+ [% IF field %] >+ <input type="hidden" name="field_id" value="[% field.id %]" /> >+ [% END %] >+ <input type="hidden" name="tablename" value="[% tablename %]" /> >+ <input type="hidden" name="op" value="add" /> >+ <input type="submit" value="Save" /> >+ <a href="?tablename=[% tablename %]" class="cancel">Cancel</a> >+ </fieldset> >+ </form> >+ [% END %] >+ >+ </div> >+ </div> >+ >+<div class="yui-b"> >+[% INCLUDE 'admin-menu.inc' %] >+</div> >+</div> >+[% INCLUDE 'intranet-bottom.inc' %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt >index d0f65f2..95ed880 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt >@@ -115,6 +115,8 @@ > <dt><a href="/cgi-bin/koha/admin/sms_providers.pl">SMS cellular providers</a></dt> > <dd>Define a list of cellular providers for sending SMS messages via email.</dd> > [% END %] >+ <dt><a href="/cgi-bin/koha/admin/additional-fields.pl">Additional fields</a></dt> >+ <dd>Add additional fields to certain tables</dd> > </dl> > </div> > </div> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/add_fields.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/add_fields.tt >deleted file mode 100644 >index a7f847b..0000000 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/add_fields.tt >+++ /dev/null >@@ -1,176 +0,0 @@ >-[% INCLUDE 'doc-head-open.inc' %] >-<title>Koha › Serials › Manage new fields for subscriptions >- [% IF op == "list" %] › List of fields >- [% ELSIF op == "add_form" %] >- [% IF field %] › Modify field >- [% ELSE %] › Add field >- [% END %] >- [% END %] >-</title> >-[% INCLUDE 'doc-head-close.inc' %] >-<link rel="stylesheet" type="text/css" href="[% themelang %]/css/datatables.css" /> >-[% INCLUDE "datatables.inc" %] >-<script type="text/javascript"> >-//<![CDATA[ >- $(document).ready(function(){ >- >- $("#fieldst").dataTable($.extend(true, {}, dataTablesDefaults, { >- 'bAutoWidth': false, >- 'sDom': 't<"bottom pager"ilpf>', >- 'sPaginationType': 'four_button', >- 'aLengthMenu': [[10, 20, 50, 100, -1], [10, 20, 50, 100, "All"]], >- 'iDisplayLength': 20, >- 'aaSorting': [[ 0, "asc" ]], >- })); >- >- $(".confirmdelete").click(function(){ >- return confirm(_("Are you sure you want to delete this field?")); >- }); >- >- $("#add_field").on('submit', function(){ >- if ( $("#marcfield").val().length > 0 >- && $("select[name='authorised_value_category']" ).val().length > 0 ) { >- alert("You cannot select an authorised value category and a marcfield"); >- return false; >- } >- return true; >- }); >- }); >-//]]> >-</script> >-</head> >- >-<body id="ser_add_fields" class="ser"> >- [% INCLUDE 'header.inc' %] >- [% INCLUDE 'serials-search.inc' %] >- >- <div id="breadcrumbs"> >- <a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/serials/serials-home.pl">Serials</a> › Manage new fields for subscriptions >- </div> >- >- <div id="doc3" class="yui-t2"> >- <div id="bd"> >- <div id="yui-main"> >- <div class="yui-b"> >- [% IF op == 'list' %] >- <div id="toolbar" class="btn-toolbar"> >- <a class="btn btn-small" id="newfields" href="/cgi-bin/koha/serials/add_fields.pl?op=add_form"><i class="fa fa-plus"></i> New fields</a> >- </div> >- [% END %] >- >- [% IF messages %] >- [% FOR message IN messages %] >- [% IF message.code == 'insert' %] >- [% IF message.number > 0 %] >- <div class="dialog message">The field has been inserted</div> >- [% ELSE %] >- <div class="dialog alert">The field has not been inserted (name still exist?)</div> >- [% END %] >- [% ELSIF message.code == 'update' %] >- [% IF message.number > 0 %] >- <div class="dialog message">The field has been updated</div> >- [% ELSE %] >- <div class="dialog alert">The field has not been updated (name still exist?)</div> >- [% END %] >- [% ELSIF message.code == 'delete' %] >- [% IF message.number > 0 %] >- <div class="dialog message">The field has been deleted</div> >- [% ELSE %] >- <div class="dialog alert">The field has not been deleted</div> >- [% END %] >- [% END %] >- [% END %] >- [% END %] >- >- [% IF op == 'list' %] >- <h3>Additional fields for subscriptions</h3> >- [% IF fields %] >- <table id="fieldst"> >- <thead> >- <tr> >- <th>Name</th> >- <th>Authorised value category</th> >- <th>Marc field</th> >- <th>Searchable</th> >- <th>Actions</th> >- </tr> >- </thead> >- <tbody> >- [% FOR field IN fields %] >- <tr> >- <td>[% field.name %]</td> >- <td>[% field.authorised_value_category %]</td> >- <td>[% field.marcfield %]</td> >- <td> >- [% IF field.searchable %]Yes[% ELSE %]No[% END %] >- </td> >- <td> >- <a href="/cgi-bin/koha/serials/add_fields.pl?op=add_form&field_id=[% field.id %]" title="Edit this field">Edit</a> >- <a class="confirmdelete" href="/cgi-bin/koha/serials/add_fields.pl?op=delete&field_id=[% field.id %]" title="Delete this field">Delete</a> >- </td> >- </tr> >- [% END %] >- </tbody> >- </table> >- [% ELSE %] >- There is no field defined. >- [% END %] >- [% ELSIF op == 'add_form' %] >- [% IF field %] >- <h3>Modify field</h3> >- [% ELSE %] >- <h3>Add field</h3> >- [% END %] >- <form action="/cgi-bin/koha/serials/add_fields.pl" name="add_form" id="add_field" method="post"> >- <fieldset class="rows"> >- <ol> >- <li> >- <label for="name" class="required">Name: </label> >- <input type="text" name="name" id="name" value="[% field.name | html %]" /> >- </li> >- <li> >- <label for="av">Authorised value category: </label> >- <select name="authorised_value_category"> >- <option value="">None</option> >- [% FOR category IN categories %] >- [% IF field.authorised_value_category == category %] >- <option value="[% category %]" selected="selected">[% category %]</option> >- [% ELSE %] >- <option value="[% category %]">[% category %]</option> >- [% END %] >- [% END %] >- </select> >- </li> >- <li> >- <label for="marcfield">Marc field: </label> >- <input type="text" name="marcfield" id="marcfield" value="[% field.marcfield| html %]" /> >- </li> >- <li> >- <label for="searchable">Searchable: </label> >- [% IF field.searchable %] >- <input type="checkbox" name="searchable" id="searchable" checked="checked" /> >- [% ELSE %] >- <input type="checkbox" name="searchable" id="searchable" /> >- [% END %] >- </li> >- </ol> >- </fieldset> >- <fieldset class="action"> >- [% IF field %] >- <input type="hidden" name="field_id" value="[% field.id %]" /> >- [% END %] >- <input type="hidden" name="op" value="add" /> >- <input type="submit" value="Save" /> >- <a href="/cgi-bin/koha/serials/add_fields.pl" class="cancel">Cancel</a> >- </fieldset> >- </form> >- [% END %] >- >- </div> >- </div> >- >-<div class="yui-b"> >-[% INCLUDE 'serials-menu.inc' %] >-</div> >-</div> >-[% INCLUDE 'intranet-bottom.inc' %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt >index be67cfa..aafe43d 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt >@@ -117,21 +117,7 @@ > <label for="to">Expires before:</label> > <input type="text" id="to" name="expiration_date_filter" value="[% expiration_date_filter | $KohaDates %]" size="10" maxlength="10" class="datepickerto" /> > </li> >- [% FOR field IN additional_fields_for_subscription %] >- <li> >- <label for="additional_field_[% field.id %]"> [% field.name %]: </label> >- [% IF field.authorised_value_choices %] >- <select id="additional_field_[% field.id %]" name="additional_field_[% field.id %]_filter"> >- <option value="">All</option> >- [% FOREACH av IN field.authorised_value_choices %] >- <option value="[% av.authorised_value %]">[% av.lib %]</option> >- [% END %] >- </select> >- [% ELSE %] >- <input id="additional_field_[% field.id %]" type="text" value="[% additional_fields.${field.name} %]" name="additional_field_[% field.id %]_filter" /> >- [% END %] >- </li> >- [% END %] >+ [% INCLUDE 'additional-fields-entry.inc' available=additional_fields_for_subscription values=additional_field_filters wrap_fieldset=0 %] > </ol> > <input type="hidden" name="searched" value="1" /> > <fieldset class="action"> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/subscription-add.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/subscription-add.tt >index 39c809c..89b5ad5 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/subscription-add.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/subscription-add.tt >@@ -856,36 +856,9 @@ $(document).ready(function() { > </fieldset> > > [% IF additional_fields_for_subscription %] >- <div id="subscription_additional_fields"> >- <fieldset class="rows"> >- <legend>Additional fields</legend> >- <ol> >- [% FOR field IN additional_fields_for_subscription %] >- <li> >- <label for="additional_field_[% field.id %]"> [% field.name %]: </label> >- [% IF field.authorised_value_choices %] >- <select name="additional_field_[% field.id %]" id="additional_field_[% field.id %]"> >- [% FOREACH av IN field.authorised_value_choices %] >- [% IF av.authorised_value == additional_fields.${field.name} %] >- <option value="[% av.authorised_value %]" selected="selected">[% av.lib %]</option> >- [% ELSE %] >- <option value="[% av.authorised_value %]">[% av.lib %]</option> >- [% END %] >- [% END %] >- </select> (Authorised values for [% field.authorised_value_category %]) >- [% ELSE %] >- [% IF field.marcfield %] >- <input type="text" value="[% additional_fields.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" readonly="readonly" /> >- This value will be filled with the [% field.marcfield %] subfield of the selected biblio. >- [% ELSE %] >- <input type="text" value="[% additional_fields.${field.name} %]" id="additional_field_[% field.id %]" name="additional_field_[% field.id %]" /> >- [% END %] >- [% END %] >- </li> >- [% END %] >- </ol> >- </fieldset> >- </div> >+ <div id="subscription_additional_fields"> >+ [% INCLUDE 'additional-fields-entry.inc' available=additional_fields_for_subscription values=additional_fields %] >+ </div> > [% END %] > > <fieldset class="action"> >diff --git a/serials/serials-search.pl b/serials/serials-search.pl >index 3e73c56..54fdeeb 100755 >--- a/serials/serials-search.pl >+++ b/serials/serials-search.pl >@@ -79,19 +79,10 @@ if ( $op and $op eq "close" ) { > > > my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription', searchable => 1 } ); >-my $additional_field_filters; >-for my $field ( @$additional_fields ) { >- my $filter_value = $query->param('additional_field_' . $field->{id} . '_filter'); >- if ( defined $filter_value and $filter_value ne q|| ) { >- $additional_field_filters->{ $field->{name} } = { >- value => $filter_value, >- authorised_value_category => $field->{authorised_value_category}, >- }; >- } >- if ( $field->{authorised_value_category} ) { >- $field->{authorised_value_choices} = GetAuthorisedValues( $field->{authorised_value_category} ); >- } >-} >+my $additional_field_filters = Koha::AdditionalField->get_filters_from_query( { >+ tablename => 'subscription', >+ query => $query, >+} ); > > my $expiration_date_dt = $expiration_date ? dt_from_string( $expiration_date ) : undef; > my @subscriptions; >@@ -106,7 +97,7 @@ if ($searched){ > publisher => $publisher, > bookseller => $bookseller, > branch => $branch, >- additional_fields => [ map{ { name => $_, value => $additional_field_filters->{$_}{value}, authorised_value_category => $additional_field_filters->{$_}{authorised_value_category} } } keys %$additional_field_filters ], >+ additional_fields => $additional_field_filters, > location => $location, > expiration_date => $expiration_date_dt, > } >@@ -160,7 +151,7 @@ $template->param( > branches_loop => \@branches_loop, > done_searched => $searched, > routing => $routing, >- additional_field_filters => $additional_field_filters, >+ additional_field_filters => Koha::AdditionalField->get_filters_as_values( $additional_field_filters ), > additional_fields_for_subscription => $additional_fields, > marcflavour => (uc(C4::Context->preference("marcflavour"))) > ); >diff --git a/serials/subscription-add.pl b/serials/subscription-add.pl >index 31a1e35..d9da294 100755 >--- a/serials/subscription-add.pl >+++ b/serials/subscription-add.pl >@@ -152,14 +152,7 @@ $template->param(branchloop => $branchloop, > locations_loop=>$locations_loop, > ); > >- >-my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription' } ); >-for my $field ( @$additional_fields ) { >- if ( $field->{authorised_value_category} ) { >- $field->{authorised_value_choices} = GetAuthorisedValues( $field->{authorised_value_category} ); >- } >-} >-$template->param( additional_fields_for_subscription => $additional_fields ); >+$template->param( additional_fields_for_subscription => scalar Koha::AdditionalField->all( { tablename => 'subscription' } ) ); > > # prepare template variables common to all $op conditions: > if ($op!~/^mod/) { >@@ -346,8 +339,12 @@ sub redirect_add_subscription { > $skip_serialseq > ); > >- my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription' } ); >- insert_additional_fields( $additional_fields, $biblionumber, $subscriptionid ); >+ Koha::AdditionalField->update_fields_from_query( { >+ tablename => 'subscription', >+ record_id => $subscriptionid, >+ query => $query, >+ marc_record => GetMarcBiblio( $biblionumber, 1 ) >+ } ); > > print $query->redirect("/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=$subscriptionid"); > return; >@@ -428,32 +425,13 @@ sub redirect_mod_subscription { > $skip_serialseq > ); > >- my $additional_fields = Koha::AdditionalField->all( { tablename => 'subscription' } ); >- insert_additional_fields( $additional_fields, $biblionumber, $subscriptionid ); >+ Koha::AdditionalField->update_fields_from_query( { >+ tablename => 'subscription', >+ record_id => $subscriptionid, >+ query => $query, >+ marc_record => GetMarcBiblio( $biblionumber, 1 ) >+ } ); > > print $query->redirect("/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=$subscriptionid"); > return; > } >- >-sub insert_additional_fields { >- my ( $additional_fields, $biblionumber, $subscriptionid ) = @_; >- my $record = GetMarcBiblio( $biblionumber, 1 ); >- for my $field ( @$additional_fields ) { >- my $af = Koha::AdditionalField->new({ id => $field->{id} })->fetch; >- if ( $af->{marcfield} ) { >- my ( $field, $subfield ) = split /\$/, $af->{marcfield}; >- $af->{values} = undef; >- if ( $field and $subfield ) { >- my $value = $record->subfield( $field, $subfield ); >- $af->{values} = { >- $subscriptionid => $value >- }; >- } >- } else { >- $af->{values} = { >- $subscriptionid => $query->param('additional_field_' . $field->{id}) >- } if defined $query->param('additional_field_' . $field->{id}); >- } >- $af->insert_values; >- } >-} >-- >2.7.0
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 15774
:
48224
|
53608
|
53609
|
72078
|
72079
|
72085
|
72086
|
75083
|
75084
|
75085
|
75086
|
75336
|
75354
|
75361
|
79976
|
79977
|
79978
|
79979
|
79980
|
79981
|
79982
|
80060
|
80061
|
80062
|
80063
|
80064
|
80065
|
80066
|
80680
|
81490
|
81491
|
81492
|
81493
|
81494
|
81495
|
81496
|
81497
|
81833
|
81837
|
81838
|
81839
|
81840
|
81841
|
81842
|
81843
|
81844
|
81845
|
81846
|
81847
|
81848
|
81849
|
81850
|
81851
|
81852
|
83349
|
83350
|
83351
|
83352
|
83353
|
83354
|
83355
|
83356
|
83357
|
83358
|
83359
|
83360
|
83361
|
83362
|
83363
|
83364
|
83444
|
83445
|
83446
|
83447
|
83448
|
83449
|
83450
|
83451
|
83452
|
83453
|
83454
|
83455
|
83456
|
83457
|
83458
|
83459
|
85333
|
85334
|
85335
|
85336
|
85337
|
85338
|
85339
|
85340
|
85341
|
85342
|
85343
|
85344
|
85345
|
85346
|
85347
|
85348
|
85792
|
85806
|
85807
|
85808
|
85809
|
85810
|
85811
|
85812
|
85813
|
85814
|
85815
|
85816
|
85817
|
85818
|
85819
|
85820
|
85821
|
85822
|
85823
|
85824
|
86411