From: Moritz Bunkus Date: Thu, 30 Dec 2010 15:21:13 +0000 (+0100) Subject: Dokumentation X-Git-Tag: release-2.6.2beta1~17^2~3^2~11 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=467d90298c2f90966698073a25f2b8a7508c5293;p=kivitendo-erp.git Dokumentation --- diff --git a/SL/Controller/Base.pm b/SL/Controller/Base.pm index 112a7bd8a..c655e72e2 100644 --- a/SL/Controller/Base.pm +++ b/SL/Controller/Base.pm @@ -5,10 +5,11 @@ use parent qw(Rose::Object); use List::Util qw(first); sub parse_html_template { - my $self = shift; - my $name = shift; + my $self = shift; + my $name = shift; + my $locals = shift || {}; - return $::form->parse_html_template($name, { @_, SELF => $self }); + return $::form->parse_html_template($name, { %{ $locals }, SELF => $self }); } sub url_for { @@ -49,3 +50,158 @@ sub _dispatch { } 1; + +__END__ + +=head1 NAME + +SL::Controller::Base - base class for all action controllers + +=head1 SYNOPSIS + +=head2 OVERVIEW + +This is a base class for all action controllers. Action controllers +provide subs that are callable by special URLs. + +For each request made to the web server an instance of the controller +will be created. After the request has been served that instance will +handed over to garbage collection. + +This base class is derived from L. + +=head2 CONVENTIONS + +The URLs have the following properties: + +=over 2 + +=item * + +The script part of the URL must be C. + +=item * + +There must be a GET or POST parameter named C containing the +name of the controller and the sub to call separated by C, +e.g. C. + +=item * + +The controller name is the package's name without the +C prefix. At the moment only packages in the +C namespace are valid; sub-namespaces are not +allowed. The package name must start with an upper-case letter. + +=item * + +The sub part of the C parameter is the name of the sub to +call. However, the sub's name is automatically prefixed with +C. Therefore for the example C the sub +C would be called. This in turn means +that subs whose name does not start with C cannot be invoked +directly via the URL. + +=back + +=head2 INDIRECT DISPATCHING + +In the case that there are several submit buttons on a page it is +often impractical to have a single C parameter match up +properly. For such a case a special dispatcher method is available. In +that case the C parameter of the URL must be +C. + +The C method will iterate over all +subs in the controller package whose names start with C. The +first one for which there's a GET or POST parameter with the same name +and that's trueish is called. + +Usage from a template usually looks like this: + +
+ ... + + + +
+ +The dispatching is handled by the function L. + +=head1 FUNCTIONS + +=head2 PUBLIC HELPER FUNCTIONS + +These functions are supposed to be called by sub-classed controllers. + +=over 4 + +=item C + +Outputs an HTML template. It is a thin wrapper around +C which also adds the current object as the +template variable C. + +=item C + +=item C + +=item C + +Creates an URL for the given parameters suitable for calling an action +controller. If there's only one scalar parameter then it is returned +verbatim. + +Otherwise the parameters are given either as a single hash ref +parameter or as a normal hash. + +The controller to call is given by C<$params{controller}>. It defaults +to the current controller as returned by +L. + +The action to call is given by C<$params{action}>. It defaults to +C. + +All other key/value pairs in C<%params> are appended as GET parameters +to the URL. + +Usage from a template might look like this: + + create new message + +=back + +=head2 PRIVATE FUNCTIONS + +These functions are supposed to be used from this base class only. + +=over 4 + +=item C<_controller_name> + +Returns the name of the curernt controller package without the +C prefix. + +=item C<_dispatch> + +Implements the method lookup for indirect dispatching mentioned in the +section L. + +=item C<_run_action $action> + +Executes a sub based on the value of C<$action>. C<$action> is the sub +name part of the C GET or POST parameter as described in +L. + +If C<$action> equals C then the sub L in this +base class is called for L. Otherwise +C<$action> is prefixed with C, and that sub is called on the +current controller instance. + +=back + +=head1 AUTHOR + +Moritz Bunkus Em.bunkus@linet-services.deE + +=cut