Difference between revisions of "Contribute: Plugins/ExportPluginsList"

From EPrints Documentation
Jump to: navigation, search
m
m (Restructuring)
Line 3: Line 3:
 
In this tutorial you will learn to create a slightly more complex export plugin than the one created in [[User:Tom/Export_Plugins/Hello_World| the previous tutorial]] by overriding the default handling of lists.
 
In this tutorial you will learn to create a slightly more complex export plugin than the one created in [[User:Tom/Export_Plugins/Hello_World| the previous tutorial]] by overriding the default handling of lists.
  
== HelloList.pm ==
+
= HelloList.pm =
 
The code in the section below should be placed in a file called HelloList.pm in the directory created previously, and MyPlugins
 
The code in the section below should be placed in a file called HelloList.pm in the directory created previously, and MyPlugins
 
should be changed to the name of that directory.
 
should be changed to the name of that directory.
Line 55: Line 55:
 
</pre>
 
</pre>
  
== In More Detail ==
+
= In More Detail =
 
The above code is very similar to the HelloExport.pm file in [[User:Tom/Export_Plugins/Hello_World| the previous tutorial]] so only the points where it deviates significantly from that file will be discussed below.
 
The above code is very similar to the HelloExport.pm file in [[User:Tom/Export_Plugins/Hello_World| the previous tutorial]] so only the points where it deviates significantly from that file will be discussed below.
  
=== Housekeeping ===
+
== Housekeeping ==
 
The package name has been changed to reflect the filename.
 
The package name has been changed to reflect the filename.
  
Line 65: Line 65:
 
</pre>
 
</pre>
  
=== Constructor ===
+
== Constructor ==
 
Make sure you give each plugin a unique name.
 
Make sure you give each plugin a unique name.
  
Line 72: Line 72:
 
</pre>
 
</pre>
  
=== Dealing With Lists ===
+
== Dealing With Lists ==
 
In this example we override the output_list method in our export plugin to provide column headers. The original method merely concatenates the output from the output_dataobj subroutine called on every DataObj in the list.
 
In this example we override the output_list method in our export plugin to provide column headers. The original method merely concatenates the output from the output_dataobj subroutine called on every DataObj in the list.
  
Line 99: Line 99:
 
</pre>
 
</pre>
  
=== Filehandles ===
+
== Filehandles ==
 
The command line export tool provides the method with a filehandle for output with the key &quot;fh&quot;, while the cgi export uses a value returned from the method. If you don't deal with the filehandle you will get no output from the command line. In most cases this won't matter, but it is good practice to deal with it.
 
The command line export tool provides the method with a filehandle for output with the key &quot;fh&quot;, while the cgi export uses a value returned from the method. If you don't deal with the filehandle you will get no output from the command line. In most cases this won't matter, but it is good practice to deal with it.
  
Line 144: Line 144:
 
</pre>
 
</pre>
  
== Testing Your Plugin ==
+
= Testing Your Plugin =
  
 
Restart your webserver and test the plugin as in [[User:Tom/Export_Plugins/Hello_World| the previous tutorial]].
 
Restart your webserver and test the plugin as in [[User:Tom/Export_Plugins/Hello_World| the previous tutorial]].

Revision as of 18:55, 14 August 2007

Export Plugin Tutorial 2: Hello, Lists

In this tutorial you will learn to create a slightly more complex export plugin than the one created in the previous tutorial by overriding the default handling of lists.

HelloList.pm

The code in the section below should be placed in a file called HelloList.pm in the directory created previously, and MyPlugins should be changed to the name of that directory.

package EPrints::Plugin::Export::MyPlugins::HelloList;

@ISA = ("EPrints::Plugin::Export");

use strict;

sub new
{
        my ($class, %opts) = @_;

        my $self = $class->SUPER::new(%opts);

        $self->{name} = "Hello, List!";
        $self->{accept} = [ 'dataobj/eprint', 'list/eprint' ];
        $self->{visible} = "all";
        $self->{suffix} = ".txt";
        $self->{mimetype} = "text/plain; charset=utf-8";

        return $self;
}

sub output_dataobj
{
        my ($plugin, $dataobj) = @_;

        return $dataobj->get_id()."\t".$dataobj->get_value("title")."\n";
}

sub output_list
{
        my ($plugin, %opts) = @_;

        my $output = "";

        $output .= "ID\tTitle\n\n";

        foreach my $dataobj ($opts{"list"}->get_records)
        {
                $output .= $plugin->output_dataobj($dataobj, %opts);
        }

        return $output;
}

1;

In More Detail

The above code is very similar to the HelloExport.pm file in the previous tutorial so only the points where it deviates significantly from that file will be discussed below.

Housekeeping

The package name has been changed to reflect the filename.

package EPrints::Plugin::Export::Foo::HelloList;

Constructor

Make sure you give each plugin a unique name.

        $self->{name} = "Hello, List!";

Dealing With Lists

In this example we override the output_list method in our export plugin to provide column headers. The original method merely concatenates the output from the output_dataobj subroutine called on every DataObj in the list.

Note that the method is not provided with a bare array of DataObjs, but a List object is provided within the opts hash. To get an array of DataObjs to loop over you must then call that List object's get_record method.

If you try the plugin using the code below it will work from the web interface, however if you try to use the plugin through the command line export script you won't get any output. The solution is described in the next section.

sub output_list
{
        my ($plugin, %opts) = @_;

        my $output = "";

        $output .= "ID\tTitle\n\n";

        foreach my $dataobj ($opts{"list"}->get_records)
        {
                $output .= $plugin->output_dataobj($dataobj, %opts);
        }

        return $output;
}

1;

Filehandles

The command line export tool provides the method with a filehandle for output with the key "fh", while the cgi export uses a value returned from the method. If you don't deal with the filehandle you will get no output from the command line. In most cases this won't matter, but it is good practice to deal with it.

The way it has been dealt with below is to check if a filehandle has been provided everytime something needs to be output. If a filehandle is provided we print to it, otherwise we save the output for later. At the end of the method we either return undef if a filehandle was provided or we return the saved output otherwise.

Replace the code in output_list above with the code provided below.

sub output_list
{
        my ($plugin, %opts) = @_;

        my $r = [];

        my $header = "ID\tTitle\n\n";
        if (defined $opts{"fh"})
        {
                print {$opts{"fh"}} $header;
        }
        else
        {
                push @{$r}, $header;
        }

        foreach my $dataobj ($opts{"list"}->get_records)
        {
                my $part = $plugin->output_dataobj($dataobj, %opts);
                if (defined $opts{"fh"})
                {
                        print {$opts{"fh"}} $part;
                }
                else
                {
                        push @{$r}, $part;
                }
        }

        if (defined $opts{"fh"})
        {
                return undef;
        }
        return join('', @{$r});
}

Testing Your Plugin

Restart your webserver and test the plugin as in the previous tutorial.