Bug 9202 - TT plugin to allow direct display of MARC::Records
Summary: TT plugin to allow direct display of MARC::Records
Status: CLOSED INVALID
Alias: None
Product: Koha
Classification: Unclassified
Component: Templates (show other bugs)
Version: Main
Hardware: All All
: P5 - low new feature
Assignee: Jared Camins-Esakov
QA Contact:
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-12-03 23:23 UTC by Jared Camins-Esakov
Modified: 2014-12-07 20:03 UTC (History)
3 users (show)

See Also:
Change sponsored?: ---
Patch complexity: Medium patch
Documentation contact:
Documentation submission:
Text to go in the release notes:
Version(s) released in:
Circulation function:


Attachments
Bug 9202: Add a MARC plugin for Template::Toolkit (19.75 KB, patch)
2012-12-03 23:38 UTC, Jared Camins-Esakov
Details | Diff | Splinter Review
Bug 9202: Add a MARC plugin for Template::Toolkit (19.76 KB, patch)
2012-12-07 18:37 UTC, Jared Camins-Esakov
Details | Diff | Splinter Review
Bug 9202: Add a MARC plugin for Template::Toolkit (19.76 KB, patch)
2012-12-07 19:02 UTC, Jared Camins-Esakov
Details | Diff | Splinter Review
Bug 9202: Add a MARC plugin for Template::Toolkit (19.82 KB, patch)
2012-12-09 00:18 UTC, Mirko Tietgen
Details | Diff | Splinter Review

Note You need to log in before you can comment on or make changes to this bug.
Description Jared Camins-Esakov 2012-12-03 23:23:12 UTC
Given how central MARC is to Koha, it would be useful to be able to display MARC records directly in Template::Toolkit.
Comment 1 Jared Camins-Esakov 2012-12-03 23:38:12 UTC Comment hidden (obsolete)
Comment 2 Kyle M Hall (khall) 2012-12-07 14:25:10 UTC
09:24 ~/kohaclone ((0573727...) $%)$ perl t/Template_Plugin_MARC.t
1..21
not ok 1 - use Koha::Template::Plugin::MARC;
#   Failed test 'use Koha::Template::Plugin::MARC;'
#   at t/Template_Plugin_MARC.t line 25.
#     Tried to use 'Koha::Template::Plugin::MARC'.
#     Error:  Type of arg 1 to push must be array (not hash element) at /home/koha/kohaclone/Koha/Template/Plugin/MARC.pm line 225, near "$fieldobj;"
# Type of arg 1 to push must be array (not hash element) at /home/koha/kohaclone/Koha/Template/Plugin/MARC.pm line 227, near "$fieldobj;"
# Type of arg 1 to push must be array (not hash element) at /home/koha/kohaclone/Koha/Template/Plugin/MARC.pm line 228, near "$fieldobj;"
# BEGIN not safe after errors--compilation aborted at /home/koha/kohaclone/Koha/Template/Plugin/MARC.pm line 296.
# Compilation failed in require at (eval 12) line 2.
# BEGIN failed--compilation aborted at (eval 12) line 2.
ok 2 - load method returns correct class name
ok 3 - Created expected object
Undefined subroutine &Koha::Template::Plugin::MARC::marc called at t/Template_Plugin_MARC.t line 52.
# Looks like you planned 21 tests but ran 3.
# Looks like you failed 1 test of 3 run.
# Looks like your test exited with 255 just after 3.
Comment 3 Jared Camins-Esakov 2012-12-07 18:37:27 UTC Comment hidden (obsolete)
Comment 4 Jared Camins-Esakov 2012-12-07 19:02:37 UTC Comment hidden (obsolete)
Comment 5 Mirko Tietgen 2012-12-09 00:18:58 UTC
Created attachment 13964 [details] [review]
Bug 9202: Add a MARC plugin for Template::Toolkit

A Template::Toolkit plugin which given a MARC::Record object parses it into a
hash that can be accessed directly in Template::Toolkit.

=== SYNOPSIS ===

[% USE record = MARC(mymarc) %] <!-- translate MARC::Record to T::T hash -->
<h1>[% record.f245.sa %]</h1> <!-- subfield 245$a -->
[% record.f245.all %] <!-- all subfields concatenated together -->
[% FOREACH link IN record.f856s %] <!-- process each 856 field -->
    <a href="whatever/[% link.su %]">[% link.sy %]</a> <!-- create a link on 856$y -->
[% END %] <!-- /FOREACH link IN record.856s -->
[% FOREACH contents IN record.f505s %] <!-- process each 505 field -->
    [% FOREACH subf IN contents.subfields %] <!-- process each subfield -->
        [% SWITCH subf.code %]
        [% CASE 'a' %]
            <span class='contents'>[% subf.value %]</span>
        [% CASE 't' %]
            <span class='title'>[% subf.value %]</span>
        [% CASE 'r' %]
            <span class='responsibility'>[% subf.value %]</span>
        [% END %]
    [% END %] <!-- /FOREACH contents.subfields -->
[% END %] <!-- /FOREACH contents IN record.f505s -->
[% FOREACH subj IN record.f6xxs %]
    <a href="whatever/[% subj.s9 %]">[% subj.sa %]</a> <!-- create a link on 6[0-9]{2}$a -->
[% END %]
[% FOREACH field IN record.fields %]
    [% SWITCH field.tag %]
    [% CASE '600' %]
        Subject: [% field.all %] is what we are all about
    [% CASE '700' %]
        Co-author: [% field.all %], I presume?
    [% END %]
[% END %]

=== ACCESSORS ===

By using some clever AUTOLOAD acrobatics, this plugin offers the user six
types of accessors.

==== Direct accessors ====

    [% record.f245.sa %]

    print $record->f245->sa;

By prefixing field numbers with an 'f' and subfield codes with an 's', the first
field/subfield with a given tag/code can be accessed.

==== Concatenated accessors ====

    [% record.f245.all %]

    print $record->f245->all;

A string consisting of all subfields concatenated together is accessible through
the all member of field objects.

==== Subfield iterators ====

    [% FOREACH subfield IN record.f245.subfields %]
        [% subfield.code %] = [% subfield.value %]
    [% END %]

    foreach my $subfield ($record->f245) {
        print $subfield->code, ' = ', $subfield->value;
    }

Subfield iterators are accessible through the subfields member of field objects.

==== Field iterators ====

    [% FOREACH field IN record.f500s %]
        [% field.all %]
    [% END %]

    foreach my $field ($record->f500s) {
        print $field->all;
    }

Field iterators are accessible by adding an 's' to the end of field names:
f500s, etc.

==== Section iterators ====

    [% FOREACH field IN record.f5xxs %]
        [% field.all %]
    [% END %]

    foreach my $field ($record->f5xxs) {
        print $field->all;
    }

All the fields in a section (identified by the first digit of the tag) can
be accessed with 'fNxxs' and then iterated through.

==== Complete field list ====

    [% FOREACH field IN record.fields %]
        [% field.all %]
    [% END %]

    foreach my $field ($record->fields) {
        print $field->all;
    }

All the fields in a record can be accessed via the fields object method.

Signed-off-by: Mirko Tietgen <mirko@abunchofthings.net>
Comment 6 Jared Camins-Esakov 2012-12-21 00:05:47 UTC
After discussion with Chris and some folks on the #evergreen IRC channel, I have decided that this feature is better as a standalone CPAN module and not built directly into Koha. I am in the process of uploading it, and will package it for Debian as well.
Comment 7 Magnus Enger 2013-02-09 11:03:03 UTC
Just for the record, the module is now on CPAN as  Template::Plugin::MARC:
http://search.cpan.org/dist/Template-Plugin-MARC/lib/Template/Plugin/MARC.pm