X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FReaction%2FUI%2FController%2FCollection.pm;h=77a0005d070d04ebd2353fa1c1256740902eb65c;hb=cb92a3a388a813d1309757155a4b7750eb9f5504;hp=9db5bfce54ec42116ae4929c4122ca4d169639fd;hpb=fbd5c683de9357c042bef79961edd5bcf2efa5dc;p=catagits%2FReaction.git diff --git a/lib/Reaction/UI/Controller/Collection.pm b/lib/Reaction/UI/Controller/Collection.pm index 9db5bfc..77a0005 100644 --- a/lib/Reaction/UI/Controller/Collection.pm +++ b/lib/Reaction/UI/Controller/Collection.pm @@ -25,10 +25,6 @@ sub _build_action_viewport_args { return { }; } -sub base :Action :CaptureArgs(0) { - my ($self, $c) = @_; -} - #XXX candidate for futre optimization, should cache reader? sub get_collection { my ($self, $c) = @_; @@ -38,21 +34,25 @@ sub get_collection { return $model->$reader; } -sub list :Chained('base') :PathPart('') :Args(0) { +sub base :Action :CaptureArgs(0) { my ($self, $c) = @_; - $c->forward(basic_page => [{ collection => $self->get_collection($c) }]); } sub object :Chained('base') :PathPart('id') :CaptureArgs(1) { my ($self, $c, $key) = @_; my $object = $self->get_collection($c)->find($key); - confess "Object? what object?" unless $object; # should be a 404. + $c->detach("/error_404") unless $object; $c->stash(object => $object); } +sub list :Chained('base') :PathPart('') :Args(0) { + my ($self, $c) = @_; + $c->forward(basic_page => [{ collection => $self->get_collection($c) }]); +} + sub view :Chained('object') :Args(0) { my ($self, $c) = @_; - $c->forward(basic_page => [{object => $c->stash->{object}}]); + $c->forward(basic_page => [{ model => $c->stash->{object} }]); } sub basic_page : Private { @@ -67,3 +67,121 @@ sub basic_page : Private { } 1; + + +__END__; + +=head1 NAME + +Reaction::UI::Widget::Controller + +=head1 DESCRIPTION + +Controller class used to make displaying collections easier. +Inherits from L. + +=head1 ATTRIBUTES + +=head2 model_name + +The name of the model this controller will use as it's data source. Should be a name +that can be passed to C<$C-Emodel> + +=head2 collection_name + +The name of the collection whithin the model that this Controller will be utilizing. + +=head2 action_viewport_map + +=over 4 + +=item B<_build_action_viewport_map> - Provided builder method, see METHODS + +=item B - Auto generated predicate + +=item B- Auto generated clearer method + +=back + +Read-write lazy building hashref. The keys should match action names in the Controller +and the value should be the ViewPort class that this action should use. + See method C for more info. + +=head action_viewport_args + +Read-write lazy building hashref. Additional ViewPort arguments for the action named +as the key in the controller. See method C for more info. + +=over 4 + +=item B<_build_action_viewport_args> - Provided builder method, see METHODS + +=item B - Auto generated predicate + +=item B- Auto generated clearer method + +=back + +=head1 METHODS + +=head2 get_collection $c + +Returns an instance of the collection this controller uses. + +=head2 _build_action_viewport_map + +Provided builder for C. Returns a hash with two items: + + list => 'Reaction::UI::ViewPort::ListView', + view => 'Reaction::UI::ViewPort::Object', + +=head2 _build_action_viewport_args + +Returns an empty hashref. + +=head1 ACTIONS + +=head2 base + +Chain link, no-op. + +=head2 list + +Chain link, chained to C forwards to basic page passing one custom argument, +C which includes an instance of the current collection. + +The default ViewPort for this action is C and can be +changed by altering the C attribute hash. + +=head2 object + +Chain link, chained to C, captures one argument, 'id'. Attempts to find a single +object by searching for a member of the current collection which has a Primary Key or +Unique constraint matching that argument. If the object is found it is stored in the + stash under the C key. + +=head2 view + +Chain link, chained to C. Forwards to C with one custom vp argument + of C, which is the object located in the previous chain link of the same name. + +The default ViewPort for this action is C and can be +changed by altering the C attribute hash. + +=head2 basic_page + +Private action, accepts one argument, a hashref of viewport arguments (C<$vp_args>). + It will automatically determine the action name using the catalyst stack and call +C with the ViewPort class name contained in the C +and arguments of C<$vp_args> and the arguments contained in C, +if any. + +=head1 AUTHORS + +See L for authors. + +=head1 LICENSE + +See L for the license. + +=cut