Catalyst-View-CSV
view release on metacpan or search on metacpan
lib/Catalyst/View/CSV.pm view on Meta::CPAN
script/create.pl view CSV CSV
# Create MyApp::View::CSV manually:
package MyApp::View::CSV;
use base qw ( Catalyst::View::CSV );
__PACKAGE__->config ( sep_char => ",", suffix => "csv" );
1;
# Return a CSV view from a controller:
$c->stash ( columns => [ qw ( Title Date ) ],
cursor => $c->model ( "FilmDB::Film" )->cursor,
current_view => "CSV" );
# or
$c->stash ( columns => [ qw ( Title Date ) ],
data => [
[ "Dead Poets Society", "1989" ],
[ "Stage Beauty", "2004" ],
...
],
current_view => "CSV" );
=head1 DESCRIPTION
L<Catalyst::View::CSV> provides a L<Catalyst> view that generates CSV
files.
You can use either a Perl array of arrays, an array of hashes, an
array of objects, or a database cursor as the source of the CSV data.
For example:
my $data = [
[ "Dead Poets Society", "1989" ],
[ "Stage Beauty", "2004" ],
...
];
$c->stash ( data => $data );
or
my $resultset = $c->model ( "FilmDB::Film" )->search ( ... );
$c->stash ( cursor => $resultset->cursor );
The CSV file is generated using L<Text::CSV>.
=head1 FILENAME
The filename for the generated CSV file defaults to the last segment
of the request URI plus a C<.csv> suffix. For example, if the request
URI is C<http://localhost:3000/report> then the generated CSV file
will be named C<report.csv>.
lib/Catalyst/View/CSV.pm view on Meta::CPAN
Film->new ( Title => "Stage Beauty", Date => 2004 ),
];
$c->stash ( data => $data, columns => $columns );
will all (assuming the default configuration parameters) generate the
CSV file body:
"Dead Poets Society",1989
"Stage Beauty",2004
You must specify either C<data> or C<cursor>.
=head2 cursor
A database cursor providing access to the data to be included in the
generated CSV file. If you are using L<DBIx::Class>, then you can
obtain a cursor from any result set using the C<cursor()> method. For
example:
my $resultset = $c->model ( "FilmDB::Film" )->search ( ... );
$c->stash ( cursor => $resultset->cursor );
You must specify either C<data> or C<cursor>. For large data sets,
using a cursor may be more efficient since it avoids copying the whole
data set into memory.
=head2 columns
An optional list of column headings. For example:
$c->stash ( columns => [ qw ( Title Date ) ] );
will produce the column heading row:
Title,Date
If no column headings are provided, the CSV file will be generated
without a header row (and the MIME type attributes will indicate that
no header row is present).
If you are using literal data in the form of an B<array of hashes> or
an B<array of objects>, then you must specify C<columns>. You do not
need to specify C<columns> when using literal data in the form of an
B<array of arrays>, or when using a database cursor.
Extracting the column names from a L<DBIx::Class> result set is
surprisingly non-trivial. The closest approximation is
$c->stash ( columns => $resultset->result_source->columns );
This will use the column names from the primary result source
associated with the result set. If you are doing anything even
remotely sophisticated, then this will not be what you want. There
does not seem to be any supported way to properly extract a list of
lib/Catalyst/View/CSV.pm view on Meta::CPAN
( my $self, my $c ) = @_;
# Extract instance parameters
my $charset = $self->charset;
my $suffix = $self->suffix;
my $csv = $self->csv;
my $content_type = $self->content_type;
# Extract stash parameters
my $columns = $c->stash->{columns};
die "No cursor or inline data provided\n"
unless exists $c->stash->{data} || exists $c->stash->{cursor};
my $data = $c->stash->{data};
my $cursor = $c->stash->{cursor};
my $filename = $c->stash->{filename};
# Determine resulting CSV filename
if ( ! defined $filename ) {
$filename = ( [ $c->req->uri->path_segments ]->[-1] ||
[ $c->req->uri->path_segments ]->[-2] );
if ( $suffix ) {
$filename =~ s/\.[^.]*$//;
$filename .= ".".$suffix;
}
lib/Catalyst/View/CSV.pm view on Meta::CPAN
# No futher processing required
} elsif ( ref $row eq "HASH" ) {
$row = [ @$row{@$columns} ];
} else {
$row = [ map { $row->$_ } @$columns ];
}
$csv->print ( $response, $row )
or die "Could not generate row data: ".$csv->error_diag."\n";
}
} else {
while ( ( my @row = $cursor->next ) ) {
$csv->print ( $response, \@row )
or die "Could not generate row data: ".$csv->error_diag."\n";
}
}
return 1;
}
=head1 AUTHOR
t/lib/TestApp/Controller/Root.pm view on Meta::CPAN
current_view => "CSV" );
}
sub db :Local {
( my $self, my $c ) = @_;
my $resultset = $c->model ( "TestDB::Person" )->search ( undef, {
select => [ qw ( name age ) ],
order_by => [ qw ( name age ) ],
} );
$c->stash ( cursor => $resultset->cursor,
columns => [ qw ( Name Age ) ],
current_view => "CSV" );
}
sub noheader :Local {
( my $self, my $c ) = @_;
my $resultset = $c->model ( "TestDB::Person" )->search ( undef, {
select => [ qw ( name age ) ],
order_by => [ qw ( name age ) ],
} );
$c->stash ( cursor => $resultset->cursor,
current_view => "CSV" );
}
sub tsv :Local {
( my $self, my $c ) = @_;
my $resultset = $c->model ( "TestDB::Person" )->search ( undef, {
select => [ qw ( name age ) ],
order_by => [ qw ( age name ) ],
} );
$c->stash ( cursor => $resultset->cursor,
columns => [ qw ( Name Age ) ],
current_view => "TSV" );
}
sub filename :Local {
( my $self, my $c ) = @_;
my $resultset = $c->model ( "TestDB::Person" )->search ( undef, {
select => [ qw ( name age ) ],
order_by => [ qw ( age name ) ],
} );
$c->stash ( cursor => $resultset->cursor,
columns => [ qw ( Name Age ) ],
filename => "explicit.txt",
current_view => "CSV" );
}
sub end :ActionClass("RenderView") {
}
1;
( run in 0.339 second using v1.01-cache-2.11-cpan-4d50c553e7e )