package Catalyst::Helper::Controller::Scaffold::Mason; use strict; use Path::Class; our $VERSION = '0.03'; =head1 NAME Catalyst::Helper::Controller::Scaffold::Mason - Helper for Scaffolding =head1 SYNOPSIS # Imagine you want to generate a scaffolding controller MyApp::C::SomeTable # for a CDBI table class MyApp::M::CDBI::SomeTable script/myapp_create.pl controller SomeTable Scaffold::Mason CDBI::SomeTable =head1 DESCRIPTION Helper for Scaffolding. Templates are Mason so you'll need a Mason View Component and a forward in your end action too, or the DefaultEnd plugin. Note that you have to add these lines to your CDBI class... use Class::DBI::AsForm; use Class::DBI::FromForm; for L you can do that by adding this additional_base_classes => [qw/Class::DBI::AsForm Class::DBI::FromForm/], to the component config. Also, change your application class like this: use Catalyst qw/-Debug FormValidator/; =head1 METHODS =over 4 =item mk_compclass Does the actual work. Called from helper api. =cut sub mk_compclass { my ( $self, $helper, $table_class ) = @_; $helper->{table_class} = $helper->{app} . '::M::' . $table_class; my $file = $helper->{file}; my $dir = dir( $helper->{base}, 'root', $helper->{prefix} ); $helper->mk_dir($dir); $helper->render_file( 'compclass', $file ); $helper->render_file( 'add', file( $dir, 'add.mhtml' ) ); $helper->render_file( 'edit', file( $dir, 'edit.mhtml' ) ); $helper->render_file( 'list', file( $dir, 'list.mhtml' ) ); $helper->render_file( 'view', file( $dir, 'view.mhtml' ) ); } =back =head1 AUTHOR Sebastian Riedel =head1 LICENSE This library is free software . You can redistribute it and/or modify it under the same terms as perl itself. =cut 1; __DATA__ __compclass__ package [% class %]; use strict; use base 'Catalyst::Base'; =head1 NAME [% class %] - Scaffolding Controller Component =head1 SYNOPSIS See L<[% app %]> =head1 DESCRIPTION Scaffolding Controller Component. =head1 METHODS =over 4 =item add Sets a template. =cut sub add : Local { my ( $self, $c ) = @_; $c->stash->{template} = '[% prefix %]/add.mhtml'; } =item default Forwards to list. =cut sub default : Private { my ( $self, $c ) = @_; $c->forward('list'); } =item destroy Destroys a row and forwards to list. =cut sub destroy : Local { my ( $self, $c, $id ) = @_; [% table_class %]->retrieve($id)->delete; $c->forward('list'); } =item do_add Adds a new row to the table and forwards to list. =cut sub do_add : Local { my ( $self, $c ) = @_; $c->form( optional => [ [% table_class %]->columns ] ); if ($c->form->has_missing) { $c->stash->{message}='You have to fill in all fields. '. 'The following are missing: '. join(', ',$c->form->missing()).''; } elsif ($c->form->has_invalid) { $c->stash->{message}='Some fields are correctly filled in. '. 'The following are invalid: '. join(', ',$c->form->invalid()).''; } else { [% table_class %]->create_from_form( $c->form ); return $c->forward('list'); } $c->forward('add'); } =item do_edit Edits a row and forwards to edit. =cut sub do_edit : Local { my ( $self, $c, $id ) = @_; $c->form( optional => [ [% table_class %]->columns ] ); if ($c->form->has_missing) { $c->stash->{message}='You have to fill in all fields.'. 'the following are missing: '. join(', ',$c->form->missing()).''; } elsif ($c->form->has_invalid) { $c->stash->{message}='Some fields are correctly filled in.'. 'the following are invalid: '. join(', ',$c->form->invalid()).''; } else { [% table_class %]->retrieve($id)->update_from_form( $c->form ); $c->stash->{message}='Updated OK'; } $c->forward('edit'); } =item edit Sets a template. =cut sub edit : Local { my ( $self, $c, $id ) = @_; $c->stash->{item} = [% table_class %]->retrieve($id); $c->stash->{template} = '[% prefix %]/edit.mhtml'; } =item list Sets a template. =cut sub list : Local { my ( $self, $c ) = @_; $c->stash->{template} = '[% prefix %]/list.mhtml'; } =item view Fetches a row and sets a template. =cut sub view : Local { my ( $self, $c, $id ) = @_; $c->stash->{item} = [% table_class %]->retrieve($id); $c->stash->{template} = '[% prefix %]/view.mhtml'; } =back =head1 AUTHOR [% author %] =head1 LICENSE This library is free software . You can redistribute it and/or modify it under the same terms as perl itself. =cut 1; __add__ <%args> $message=>undef

<%$message%>

%foreach my $column ([%table_class%]->columns) { %next if ($column eq [%table_class%]->primary_column); <% $column %>
<% [%table_class%]->to_field($column)->as_XML %>
%}
List __edit__ <%args> $message=>undef $item

<%$message%>

%for my $column ($item->columns) { %next if ($column eq $item->primary_column); <% $column %>
<% $item->to_field($column)->as_XML %>
%}
List __list__ %for my $column ([%table_class%]->columns) { %next if ($column eq [%table_class%]->primary_column); %} %for my $object ([%table_class%]->retrieve_all) { % for my $column ([%table_class%]->columns) { % next if ($column eq [%table_class%]->primary_column); % } %}
<% $column %>
<% $object->$column %> View Edit Destroy
Add __view__ <%args> $item %for my $column ($item->columns) { % next if $column eq $item->primary_column; <% $column %>
<% $item->$column %>

%} List