BeerDB::Pub->untaint_columns(printable => [qw/name notes url/]);
BeerDB::Drinker->untaint_columns( printable => [qw/handle created/] );
BeerDB::Pint->untaint_columns( printable => [qw/date_and_time/]);
-BeerDB::Person->untaint_columns( printable => [qw/first_name sur_name dob username password email/]);
# Required Fields
# Columns to display
sub BeerDB::Handpump::display_columns { qw/pub beer/ }
-sub BeerDB::Person::display_columns { qw/first_name last_name dob email/ }
BeerDB->config->{loader}->relationship($_) for (
"a brewery produces beers",
return $self->beer . " @ " . $self->pub;
}
+
1;
use base qw/Maypole::Model::CDBI/;
use strict;
use warnings;
+use Data::Dumper;
# Overide list to add display_columns to cgi
# Perhaps do this in AsForm?
-
sub list : Exported {
use Data::Dumper;
my ($self, $r) = @_;
$r->template_args->{classmetadata}{cgi} = { $self->to_cgi(@cols) };
}
+# Override view to make inputs and process form to add to related
+sub view : Exported {
+ my ($self, $r, $obj) = @_;
+ $self->_croak( "Object method only") unless $obj;
+
+ if ($r->params->{submit}) {
+ my @related = $obj->add_to_from_cgi($r, { required => [$self->related ]});
+ if (my $errs = $obj->cgi_update_errors) {
+ $r->template_args->{errors} = $errs;
+ }
+ }
+
+ # Inputs to add to related on the view page
+ # Now done on the view template
+ # my %cgi = $self->to_cgi($self->related);
+ #$r->template_args->{classmetadata}{cgi} = \%cgi ;
+}
+
# Template switcheroo bug bit me -- was seeing view page but the view action was never
# being executed after an edit.
#$r->template_args->{classmetadata}{search_cgi} = $self->search_inputs;
}
-sub view : Exported {
- my ($self, $r, $obj) = @_;
- $self->_croak( "Object method only") unless $obj;
-
- if ($r->params->{submit}) {
- my ($pint) = $obj->add_to_from_cgi($r);
- if (my $errs = $obj->cgi_update_errors) {
- $r->template_args->{errors} = $errs;
- }
- }
-
- my %cgi = $self->to_cgi('pints');
- delete $cgi{pints}{drinker}; # = $obj->to_field(drinker => 'link_hidden', {r => $r});
- $r->template_args->{classmetadata}{cgi} = \%cgi ;
-}
FOR c IN request.config.$tbl.required_cols;
required.$c = 1;
END;
+
%]
-[% FOR col = classmetadata.columns;
+[%
+SET heading_shown = 0;
+FOR col = classmetadata.columns;
NEXT IF !classmetadata.cgi.$col;
NEXT IF col == "id" OR col == classmetadata.table _ "_id";
-
# Display foreign inputs last
IF (mykeys = classmetadata.cgi.$col.keys);
foreign.push(col);
names.push(classmetadata.colnames.$col);
NEXT;
END;
+ IF ! heading_shown;
+ heading = classmetadata.moniker | ucfirst;
+ "<h4> $heading </h4>";
+ SET heading_shown = 1;
+ END;
%]
[% # Base case starts here
[% USE this = Class(classmetadata.name);
FOR col IN foreign;
- fclass = this.related_class(request, col);
+ # has_many mapping throws a stick in our spokes because related_class returns the mapped
+ # class. Sometimes we just want the has_many class.
+
+ # In case of Pub Handpumps maps to Beer and we want to add Handpump to Pub, we dont
+ # want the mapped data .
+ # In case of "Create New Handpump" -- we want the mapped data probably so we get
+ # Beer inputs and Pub select box.
+
+ fclass_rel_meta = this.related_meta(request, col);
+ fclass = fclass_rel_meta.foreign_class; # ignor args.mapping
fclass_meta = this.get_classmetadata(fclass);
- fclass_meta.cgi = classmetadata.cgi.$col;
+ fclass_meta.cgi = classmetadata.cgi.$col;
+ # USE Dumper; Dumper.dump(fclass_meta);
INCLUDE display_inputs
col_prefix = col _ "__AF__" _ col_prefix
errors = errors.$col
+++ /dev/null
-[%#
-
-=head1 display_inputs
-
-This *RECURSIVELY* displays inputs for a hash of html elements
-
-Vars it needs:
- classmetadata-- the hash of bunch of data:
- cgi -- inputs keyed on column names
- table -- table inputs are for
- columns -- list in order want displayed inputs
- colnames -- hash of what to label inputs
-
-errors -- hash of errors keyed on columns
-
-
-TODO -- make it recognize a general submit button for redisplaying
-values on errors
-
-=cut
-
-#
-%]
-
-[% # some variables
- foreign = [];
- names = [];
- # get hash of related classes keyed on accessor for Foreign Inputs
- USE this = Class(classmetadata.name);
- tbl = classmetadata.table;
- required = { };
- FOR c IN request.config.$tbl.required_cols;
- required.$c = 1;
- END;
-%]
-
-[% FOR col = classmetadata.columns;
- NEXT IF !classmetadata.cgi.$col;
- NEXT IF col == "id";
-
- # Display foreign inputs last
- IF (mykeys = classmetadata.cgi.$col.keys);
- foreign.push(col);
- names.push(classmetadata.colnames.$col);
- NEXT;
- END;
-%]
-
-[% # Base case starts here
-
- SET elem = classmetadata.cgi.$col; #.clone; # not sure why clone
- IF elem.type == 'hidden';
- elem.as_XML;
- NEXT;
- ELSIF cgi_params;
- param_col = col_prefix _ col;
- IF elem.tag == "textarea";
- elem = elem.push_content(cgi_params.$param_col);
- ELSIF elem.tag == "select";
- oldval = set_selected(elem, cgi_params.$col);
- ELSE;
- oldval = elem.attr("value", cgi_params.$param_col);
- END;
- END;
-%]
-
- <label>
- [% req_indicator = '';
- SET indicator = '*' IF (required.$col);
- %]
- <span class="field">
- [% indicator _ classmetadata.colnames.$col ||
- col | replace('_',' ') | ucfirst %]
- </span>
- [% elem.as_XML; %]
- </label>
-
- [% IF errors.$col %]
- <span class="error">[% errors.$col | html %]</span>
- [% END %]
-[% END; %]
-
-<!-- Display the differnt component inputs -->
-
-[% USE this = Class(classmetadata.name);
- FOR col IN foreign;
- fclass = this.related_class(request, col);
- fclass_meta = this.get_classmetadata(fclass);
- fclass_meta.cgi = classmetadata.cgi.$col;
- INCLUDE display_inputs
- col_prefix = col _ "__AF__" _ col_prefix
- errors = errors.$col
- heading = names.shift
- classmetadata = fclass_meta; # localize
- END;
-%]
-
SET cgi = classmetadata.cgi;
SET delimiter = this.foreign_input_delimiter;
FOR field IN srch_fields;
+ NEXT IF !cgi.$field;
# Recursivly call this tmeplate if we have foreign field
# (hash of foreign inputs should come with it)
IF ( cgi.$field.keys );
+++ /dev/null
-[%#
-
-=for doc
-
-Drinker C<view> template displays drinker and from to drink beer.
-
-=cut
-
-#%]
-[% PROCESS macros %]
-[% INCLUDE header %]
-[% view_item(object); %]
-
-[%# Form to drink a pint. We made sure to only make inputs for pint. could do it
- # here like so.
- USE this = Class(classmetadata.name);
- classmetadata.cgi = this.to_field(pints);
-
-%]
-<div id="search">
-<form action="[% base _ "/" _ request.table _ "/" _ request.action _ "/" _ object.id %]" method="post">
-<fieldset>
-<legend> Drink a pint </legend>
-
-[%
- INCLUDE display_inputs classmetadata.columns=['pints'] ;
-%]
-
-<input type='submit'name='submit' value='Hellyeah!'\>
-
-</fieldset>
-</form>
-
-</div>
-
-[%#
-
-=for doc
-
-The C<view> template also displays a list of other objects related to the first
-one via C<has_many> style relationships; this is done by calling the
-C<related_accessors> method - see L<Model/related_accessors> - to return
-a list of has-many accessors. Next it calls each of those accessors, and
-displays the results in a table.
-
-#%]
- <br /><a href="[%base%]/[%object.table%]/list">Back to listing</a>
-[% view_related(object); %]
-
-[%
- button(object, "edit");
- button(object, "delete");
-%]
-[% INCLUDE footer %]