Bigtop
view release on metacpan or search on metacpan
lib/Bigtop/Backend/Control/Gantry.pm view on Meta::CPAN
#-----------------------------------------------------------------
# $self->namespace() or Apps::Checkbook->namespace()
#-----------------------------------------------------------------
sub namespace {
return '[% package_name %]';
}
[% END %]
1;
[% gen_pod %]
[% END %]
[% BLOCK use_stub %]
use [% module -%]
[%- IF imports -%] qw(
[% imports.join("\n ") %]
);
[%- ELSE -%];
[% END %]
[% END %]
[% BLOCK explicit_use_stub %]
use [% module %][% IF import_list %] [% import_list %][% END %];
[% END %]
[% BLOCK export_array %]
our @EXPORT = qw(
[% FOREACH exported_sub IN exported_subs %]
[% exported_sub +%]
[% END %]
);
[% END %]
[% BLOCK dbix_uses %]
[% use_my_model %]
use [% base_model %];
sub schema_base_class { return '[% base_model %]'; }
use Gantry::Plugins::DBIxClassConn qw( get_schema );
[% END %]
[% BLOCK get_orm_helper %]
#-----------------------------------------------------------------
# get_orm_helper( )
#-----------------------------------------------------------------
sub get_orm_helper {
return '[% helper %]';
}
[% END %]
[% BLOCK class_access %]
#-----------------------------------------------------------------
# get_model_name( )
#-----------------------------------------------------------------
sub get_model_name {
return $[% model_alias %];
}
[% END %]
[% BLOCK text_description %]
#-----------------------------------------------------------------
# text_descr( )
#-----------------------------------------------------------------
sub text_descr {
return '[% description %]';
}
[% END %]
[% BLOCK controller_method +%]
#-----------------------------------------------------------------
# $self->[% method_name %]( [% child_output.doc_args.join( ', ' ) %] )
#-----------------------------------------------------------------
# This method inherited from [% gen_package_name %]
[% END %]
[% BLOCK gen_controller_method +%]
#-----------------------------------------------------------------
# $self->[% method_name %]( [% child_output.doc_args.join( ', ' ) %] )
#-----------------------------------------------------------------
sub [% method_name %] {
[% child_output.body %]
} # END [% method_name %]
[% END %]
[% BLOCK init_method_body %]
[% arg_capture %]
# process SUPER's init code
$self->SUPER::init( $r );
[% FOREACH config IN configs %]
$self->set_[% config %]( $self->fish_config( '[% config %]' ) || '' );
[% END %]
[% END %]
[% BLOCK config_accessors %]
[% FOREACH config IN configs %]
#-----------------------------------------------------------------
# $self->set_[% config %]( $new_value )
#-----------------------------------------------------------------
sub set_[% config %] {
my ( $self, $value ) = @_;
$self->{ __[% config %]__ } = $value;
}
#-----------------------------------------------------------------
# $self->[% config %]( )
#-----------------------------------------------------------------
sub [% config %] {
my $self = shift;
return $self->{ __[% config %]__ };
}
[% END %]
[% END %]
[% BLOCK arg_capture %]
[% FOREACH arg IN args %]
my [% arg %] = shift;
[% END %]
[% END %]
[% BLOCK arg_capture_st_nick_style %]
my ( [% args.join( ', ' ) %] ) = @_;
[% END %]
[% BLOCK self_setup %]
$self->stash->view->template( '[% template %]' );
$self->stash->view->title( '[% title %]' );
[% IF with_real_loc %]
my $real_location = $self->location() || '';
if ( $real_location ) {
$real_location =~ s{/+$}{};
$real_location .= '/';
}
[% END %]
[% END %]
[% BLOCK main_links %]
$self->stash->view->data( { pages => $self->site_links() } );
[% END %]
[% BLOCK site_links %]
return [
[% FOREACH page IN pages %]
{ link => [% page.link %], label => '[% page.label %]' },
[% END %]
];
[% END %]
[% BLOCK main_heading %]
[% IF limit_by %]
my $header_option_suffix = ( $[% limit_by %] ) ? "/$[% limit_by %]" : '';
[% END %]
my @header_options = (
[% FOREACH option IN header_options %]
{
text => '[% option.text %]',
link => [% option.location +%],
type => '[% option.type %]',
},
[% END %]
);
my $retval = {
headings => [
[% FOREACH heading IN headings %]
[% IF heading.simple %]
[% IF heading.simple.match( "'" ) %]q[[% heading.simple %]][% ELSE %]'[% heading.simple %]'[% END %],
[% ELSIF heading.href %]
'<a href=' . [% heading.href.link %] . [% IF heading.href.text.match( "'" ) %]q[>[% heading.href.text %]</a>][% ELSE %]'>[% heading.href.text %]</a>'[% END %],
[% END %]
[% END %]
],
};
[% END %]
[% BLOCK main_table %]
[%- IF livesearch %]
$retval->{ livesearch } = 1;
[% END -%]
my $params = $self->params;
[% IF where_terms.size > 0 %]
my $search = {
[% FOREACH where_term IN where_terms %]
[% where_term.col_name %] => [% where_term.value %],
[% END %]
};
[% ELSE %]
my $search = {};
[% END %]
if ( $params->{ search } ) {
my $form = $self->form();
my @searches;
foreach my $field ( @{ $form->{ fields } } ) {
if ( $field->{ searchable } ) {
push( @searches,
( $field->{ name } => { 'like', "%$params->{ search }%" } )
);
}
}
$search = {
-or => \@searches
} if scalar( @searches ) > 0;
}
my @row_options = (
[% FOREACH row_option IN row_options %]
{
text => '[% row_option.text %]',
[% IF row_option.location %]
link => [% row_option.location %],
[% END %]
type => '[% row_option.type %]',
},
[% END %]
);
my $perm_obj = Gantry::Utils::TablePerms->new(
{
site => $self,
real_location => $real_location,
header_options => \@header_options,
row_options => \@row_options,
}
);
$retval->{ header_options } = $perm_obj->real_header_options;
my $limit_to_user_id = $perm_obj->limit_to_user_id;
$search->{ user_id } = $limit_to_user_id if ( $limit_to_user_id );
[% IF dbix AND rows AND limit_by -%]
my $page = $params->{ page } || 1;
if ( $[% limit_by %] ) {
$search->{ [% limit_by %] } = $[% limit_by %];
}
my $schema = $self->get_schema();
my $results = $[% model %]->get_listing(
{
[% IF pseudo_cols.size > 0 %]
'+select' => [[% FOREACH pseudo_col IN pseudo_cols %][% pseudo_col.field %][% UNLESS loop.last %] [% END %][% END %]],
'+as' => [[% FOREACH pseudo_col IN pseudo_cols %]'[% pseudo_col.alias %]'[% UNLESS loop.last %] [% END %][% END %]],
[% END %]
schema => $schema,
rows => [% rows %],
where => $search,[% IF order_by %][% "\n" %] order_by => '[% order_by %]',[% END +%]
}
);
my $rows = $results->page( $page );
$retval->{ page } = $rows->pager();
ROW:
while ( my $row = $rows->next ) {
[%- ELSIF dbix AND rows -%]
my $page = $params->{ page } || 1;
my $schema = $self->get_schema();
my $results = $[% model %]->get_listing(
{
[% IF pseudo_cols.size > 0 %]
'+select' => [[% FOREACH pseudo_col IN pseudo_cols %][% pseudo_col.field %][% UNLESS loop.last %] [% END %][% END %]],
'+as' => [[% FOREACH pseudo_col IN pseudo_cols %]'[% pseudo_col.alias %]'[% UNLESS loop.last %] [% END %][% END %]],
[% END %]
schema => $schema,
rows => [% rows %],
where => $search,[% IF order_by %][% "\n" %] order_by => '[% order_by %]',[% END +%]
}
);
my $rows = $results->page( $page );
$retval->{ page } = $rows->pager();
ROW:
while ( my $row = $rows->next ) {
[%- ELSIF dbix AND limit_by -%]
if ( $[% limit_by %] ) {
$search->{ [% limit_by %] } = $[% limit_by %];
}
my $schema = $self->get_schema();
my @rows = $[% model %]->get_listing(
{
[% IF pseudo_cols.size > 0 %]
'+select' => [[% FOREACH pseudo_col IN pseudo_cols %][% pseudo_col.field %][% UNLESS loop.last %] [% END %][% END %]],
'+as' => [[% FOREACH pseudo_col IN pseudo_cols %]'[% pseudo_col.alias %]'[% UNLESS loop.last %] [% END %][% END %]],
[% END %]
schema => $schema,
where => $search,[% IF order_by %][% "\n" %] order_by => '[% order_by %]',[% END +%]
}
);
ROW:
foreach my $row ( @rows ) {
[%- ELSIF dbix -%]
my $schema = $self->get_schema();
my @rows = $[% model %]->get_listing(
{
[% IF pseudo_cols.size > 0 %]
'+select' => [[% FOREACH pseudo_col IN pseudo_cols %][% pseudo_col.field %][% UNLESS loop.last %] [% END %][% END %]],
'+as' => [[% FOREACH pseudo_col IN pseudo_cols %]'[% pseudo_col.alias %]'[% UNLESS loop.last %] [% END %][% END %]],
[% END %]
schema => $schema,
where => $search,[% IF order_by %][% "\n" %] order_by => '[% order_by %]',[% END +%]
}
);
ROW:
foreach my $row ( @rows ) {
[%- ELSE -%]
my @rows = $[% model %]->get_listing([% IF order_by %] { order_by => '[% order_by %]', } [% END %]);
ROW:
foreach my $row ( @rows ) {
[%- END -%]
last ROW if $perm_obj->hide_all_data;
my $id = $row->id;
[% FOREACH foreigner IN foreigners %]
my $[% foreigner %] = ( $row->[% foreigner %] )
? $row->[% foreigner %]->foreign_display()
: '';
[% END %]
push(
@{ $retval->{rows} }, {
orm_row => $row,
data => [
[% FOREACH data_col IN data_cols %]
[% data_col %],
[% END %]
],
options => $perm_obj->real_row_options( $row ),
}
);
}
if ( $params->{ json } ) {
$self->template_disable( 1 );
my $obj = {
headings => $retval->{ headings },
header_options => $retval->{ header_options },
rows => $retval->{ rows },
};
my $json = to_json( $obj, { allow_blessed => 1 } );
return( $json );
}
$self->stash->view->data( $retval );
[% END %]
[% BLOCK form_body %]
[% arg_capture %]
[%- IF dbix -%]
my $selections = $[% model %]->get_form_selections(
{
schema => $self->get_schema(),
[% IF refers_to.size > 0 %]
foreign_tables => {
[% FOREACH rt_table IN refers_to %]
'[% rt_table %]' => 1,
[% END %]
}
[% END -%]
}
);
[%- ELSE -%]
my $selections = $[% model %]->get_form_selections();
[%- END -%]
return {
[% IF form_name %] name => '[% form_name %]',
[% END -%]
[% IF raw_row %] row => $row,
[% ELSE %] row => $data->{row},
[% END -%]
[% FOREACH extra_key_name IN extra_keys.keys() %]
[% extra_key_name %] => [% extra_keys.$extra_key_name %],
[% END %]
fields => [
[% FOREACH field IN fields %]
{
[% FOREACH key = field.keys %]
[% IF key == 'options_string' %]
options => [% field.$key %],
[% ELSIF key == 'constraint' OR field.$key.match( '^\d+$' ) %]
[% key %] => [% field.$key %],
[% ELSIF key == 'options' %]
options => [
[% arg_list = field.$key %]
[% FOREACH pair IN arg_list %]
[% FOREACH pair_key IN pair.keys() %]
{ label => '[% pair_key %]', value => '[% pair.$pair_key %]' },
[% END %]
[% END %]
],
[% ELSE %]
[% key %] => [% IF field.$key.match( "'" ) %]q[[% field.$key %]][% ELSE %]'[% field.$key %]'[% END %],
[% END %]
[% END %]
},
[% END %]
],
};
[% END %]
[% BLOCK crud_helpers %]
my $[% crud_name %] = Gantry::Plugins::CRUD->new(
add_action => \&[% crud_name %]_add,
edit_action => \&[% crud_name %]_edit,
delete_action => \&[% crud_name %]_delete,
form => __PACKAGE__->can( '[% form_method_name %]' ),
redirect => \&[% crud_name %]_redirect,
text_descr => '[% text_descr %]',
);
#-----------------------------------------------------------------
# $self->[% crud_name %]_redirect( $data )
# The generated version mimics the default behavior, feel free
# to delete the redirect key from the constructor call for $crud
# and this sub.
#-----------------------------------------------------------------
sub [% crud_name %]_redirect {
my ( $self, $data ) = @_;
return $self->location;
}
#-------------------------------------------------
# $self->do_add( )
#-------------------------------------------------
sub do_add {
my $self = shift;
[% IF with_perms %]
Gantry::Plugins::CRUD::verify_permission( { site => $self } );
[% END %]
$[% crud_name %]->add( $self, { data => \@_ } );
}
#-------------------------------------------------
# $self->[% crud_name %]_add( $params, $data )
#-------------------------------------------------
sub [% crud_name %]_add {
my ( $self, $params, $data ) = @_;
# make a new row in the $[% model_alias %] table using data from $params
# remember to add commit if needed
$[% model_alias %]->gupdate_or_create( $self, $params );
}
#-------------------------------------------------
# $self->do_delete( $doomed_id, $confirm )
#-------------------------------------------------
sub do_delete {
my ( $self, $doomed_id, $confirm ) = @_;
my $row = $[% model_alias %]->gfind( $self, $doomed_id );
[% IF with_perms %]
Gantry::Plugins::CRUD::verify_permission( { site => $self, row => $row } );
[% END %]
$[% crud_name %]->delete( $self, $confirm, { row => $row } );
}
#-------------------------------------------------
# $self->[% crud_name %]_delete( $data )
#-------------------------------------------------
sub [% crud_name %]_delete {
my ( $self, $data ) = @_;
# fish the id (or the actual row) from the data hash
# delete it
# remember to add commit if needed
$data->{ row }->delete;
}
#-------------------------------------------------
# $self->do_edit( $id )
#-------------------------------------------------
sub do_edit {
my ( $self, $id ) = @_;
my $row = $[% model_alias %]->gfind( $self, $id );
[% IF with_perms %]
Gantry::Plugins::CRUD::verify_permission( { site => $self, row => $row } );
[% END %]
$[% crud_name %]->edit( $self, { row => $row } );
}
#-------------------------------------------------
# $self->[% crud_name %]_edit( $param, $data )
#-------------------------------------------------
sub [% crud_name %]_edit {
my( $self, $params, $data ) = @_;
# retrieve the row from the data hash
# update the row
# remember to add commit if needed
$data->{row}->update( $params );
}
[% END %]
[% BLOCK SOAP_gen_method_body %]
my $self = shift;
my $input = $self->soap_in;
my $output_data = $self->[% internal_method %]( $input );
$self->template_disable( 1 );
return $self->soap_out( $output_data );
[% END %]
[% BLOCK SOAP_stub_method %]
#-----------------------------------------------------------------
# $self->[% internal_method %]( )
#-----------------------------------------------------------------
sub [% internal_method %] {
my ( $self, $input ) = @_;
} # END [% internal_method %]
[% END %]
[% BLOCK soap_methods %]
#-----------------------------------------------------------------
# $self->namespace( )
#-----------------------------------------------------------------
sub namespace {
return '[% stub_module %]';
} # END namespace
#-----------------------------------------------------------------
# $self->get_soap_ops
#-----------------------------------------------------------------
sub get_soap_ops {
my $self = shift;
return {
soap_name => '[% soap_name %]',
location => $self->location,
namespace_base => '[% namespace_base %]',
operations => [
[% FOREACH op IN operations %]
{
name => '[% op.name %]',
expects => [
[% FOREACH param IN op.expects %]
{ name => '[% param.name %]', type => '[% param.type %]' },
[% END %]
],
returns => [
[% FOREACH param IN op.returns %]
{ name => '[% param.name %]', type => '[% param.type %]' },
[% END %]
],
},
[% END %]
],
};
} # END get_soap_ops
[% END %]
[% BLOCK soap_doc_advice %]
#-----------------------------------------------------------------
# $self->[% handler_method %]( )
#-----------------------------------------------------------------
sub [% handler_method %] {
[% arg_capture %]
my $params = $self->params(); # easy way
[% FOREACH expected_param IN soap_params.expects %]
my $[% expected_param.name %] = $params->{ [% expected_param.name %] };
[% END %]
# hard way:
# my $xmlobj = XML::LibXML->new();
# my $dom = $xmlobj->parse_string( $self->get_post_body() )
# or return return_error( "Mal-formed XML request: $!" );
#
[% FOREACH expected_param IN soap_params.expects %]
# my ( $[% expected_param.name %]_node ) = $dom->getElementsByLocalName( '[% expected_param.name %]' );
# my $[% expected_param.name %] = $[% expected_param.name %]_node->textContent;
[% END %]
[% FOREACH returned_param IN soap_params.returns %]
my $[% returned_param.name %];
[% END %]
my $time = $self->soap_current_time();
my $ret_struct = [
{
GantrySoapServiceResponse => [
[% FOREACH returned_param IN soap_params.returns %]
{ [% returned_param.name %] => $[% returned_param.name %] },
[% END %]
]
}
];
$self->soap_namespace_set(
'http://usegantry.org/soapservice'
);
return $self->soap_out( $ret_struct, 'internal', 'pretty' );
} # END [% handler_method %]
[% END %]
EO_TT_blocks
#-----------------------------------------------------------------
# Methods in the B::C::Gantry package
#-----------------------------------------------------------------
sub what_do_you_make {
return [
[ 'lib/AppName.pm' => 'Base module stub [safe to change]' ],
[ 'lib/AppName/*.pm' => 'Controller stubs [safe to change]' ],
[ 'lib/AppName/GEN/*.pm' => 'Generated code [please, do not edit]' ],
];
}
sub backend_block_keywords {
return [
{ keyword => 'no_gen',
label => 'No Gen',
descr => 'Skip everything for this backend',
type => 'boolean' },
{ keyword => 'run_test',
label => 'Run Tests',
descr => 'Makes tests which hit pages via a simple server',
type => 'boolean',
default => 'true' },
{ keyword => 'full_use',
label => 'Full Use Statement',
descr => 'use Gantry qw( -Engine=... ); [defaults to false]',
type => 'boolean',
default => 'false' },
{ keyword => 'dbix',
label => 'For use with DBIx::Class',
descr => 'Makes controllers usable with DBIx::Class',
type => 'boolean',
default => 'false' },
{ keyword => 'template',
label => 'Alternate Template',
descr => 'A custom TT template.',
type => 'text' },
];
}
sub setup_template {
my $class = shift;
( run in 2.189 seconds using v1.01-cache-2.11-cpan-5735350b133 )