File Coverage

blib/lib/Gantry/Plugins/CRUD.pm
Criterion Covered Total %
statement 20 158 12.6
branch 1 84 1.1
condition 0 12 0.0
subroutine 6 22 27.2
pod 15 15 100.0
total 42 291 14.4


line stmt bran cond sub pod time code
1             package Gantry::Plugins::CRUD;
2              
3 4     4   61509 use strict;
  4         9  
  4         157  
4 4     4   23 use Carp;
  4         9  
  4         253  
5 4     4   1372 use Data::FormValidator;
  4         39907  
  4         205  
6              
7 4         319 use Gantry::Utils::CRUDHelp qw(
8             clean_dates clean_params form_profile write_file verify_permission
9 4     4   569 );
  4         10  
10              
11 4     4   26 use base 'Exporter';
  4         5  
  4         8263  
12              
13             our @EXPORT_OK = qw( select_multiple_closure write_file verify_permission );
14              
15             #-----------------------------------------------------------
16             # Constructor
17             #-----------------------------------------------------------
18              
19             sub new {
20 3     3 1 9 my $class = shift;
21 3         32 my $callbacks = { @_ };
22              
23 3 50       23 unless ( defined $callbacks->{template} ) {
24 0         0 $callbacks->{template} = 'form.tt';
25             }
26             else {
27 3         10 $callbacks->{ignore_default_template} = 1;
28             }
29              
30 3         19 return bless $callbacks, $class;
31             }
32              
33             #-----------------------------------------------------------
34             # Accessors, so we don't misspell hash keys
35             #-----------------------------------------------------------
36              
37             sub add_action {
38 0     0 1   my $self = shift;
39              
40 0 0         if ( defined $self->{add_action} ) {
41 0           return $self->{add_action};
42             }
43             else {
44 0           croak 'add_action not defined or misspelled';
45             }
46             }
47              
48             sub edit_action {
49 0     0 1   my $self = shift;
50              
51 0 0         if ( defined $self->{edit_action} ) {
52 0           return $self->{edit_action}
53             }
54             else {
55 0           croak 'edit_action not defined or misspelled';
56             }
57             }
58              
59             sub delete_action {
60 0     0 1   my $self = shift;
61              
62 0 0         if ( defined $self->{delete_action} ) {
63 0           return $self->{delete_action}
64             }
65             else {
66 0           croak 'delete_action not defined or misspelled';
67             }
68             }
69              
70             sub form {
71 0     0 1   my $self = shift;
72              
73 0 0         if ( defined $self->{form} ) {
74 0           return $self->{form}
75             }
76             else {
77 0           croak 'form not defined or misspelled';
78             }
79             }
80              
81             sub redirect {
82 0     0 1   my $self = shift;
83 0           return $self->{redirect}
84             }
85              
86             sub template {
87 0     0 1   my $self = shift;
88 0           return $self->{template}
89             }
90              
91             sub text_descr {
92 0     0 1   my $self = shift;
93 0           return $self->{text_descr}
94             }
95              
96             sub use_clean_dates {
97 0     0 1   my $self = shift;
98 0           return $self->{use_clean_dates};
99             }
100              
101             sub turn_off_clean_params {
102 0     0 1   my $self = shift;
103 0           return $self->{turn_off_clean_params};
104             }
105              
106             sub validator {
107 0     0 1   my $self = shift;
108 0           return $self->{validator}
109             }
110              
111             #-----------------------------------------------------------
112             # Methods users call
113             #-----------------------------------------------------------
114              
115             #-------------------------------------------------
116             # $self->add( $your_self, { put => 'your', data => 'here' } )
117             #-------------------------------------------------
118             sub add {
119 0     0 1   my ( $self, $your_self, $data ) = @_;
120              
121             # Use the specified default template in the config if no
122             # template was specified to the crud module and there is a
123             # default defined.
124 0 0 0       if (
125             ( ! $self->{ignore_default_template} ) and
126             ( $your_self->fish_config( 'default_form_template' ) )
127             ) {
128 0           $your_self->stash->view->template(
129             $your_self->fish_config( 'default_form_template' )
130             );
131             }
132             else {
133 0           $your_self->stash->view->template( $self->template );
134             }
135              
136 0 0         $your_self->stash->view->title( 'Add ' . $self->text_descr )
137             unless $your_self->stash->view->title;
138              
139 0           my $params = $your_self->get_param_hash();
140              
141             # Redirect if user pressed 'Cancel'
142 0 0         if ( $params->{cancel} ) {
143 0           my $redirect = $self->_find_redirect(
144             {
145             gantry_site => $your_self,
146             data => $data,
147             user_req => 'add',
148             action => 'cancel',
149             }
150             );
151              
152 0           return $your_self->relocate( $redirect );
153             }
154              
155             # get and hold the form description
156 0           my $form = $self->form->( $your_self, $data );
157              
158             # Check form data
159 0           my $show_form = 0;
160 0           my $results;
161              
162 0 0         if ( $your_self->is_post ) {
163 0 0         $show_form = 1 if ( keys %{ $params } == 0 );
  0            
164              
165 0 0         if ( $self->validator ) {
166 0           $results = $self->validator->(
167             {
168             self => $your_self,
169             params => $params,
170             form => $form,
171             profile => form_profile( $form->{fields} ),
172             action => 'add',
173             }
174             );
175             }
176             else {
177 0           $results = Data::FormValidator->check(
178             $params,
179             form_profile( $form->{fields} ),
180             );
181             }
182              
183 0 0         $show_form = 1 if ( $results->has_invalid );
184 0 0         $show_form = 1 if ( $results->has_missing );
185 0 0         $show_form = 1 if ( $form->{ error_text } );
186             }
187             else {
188 0           $show_form = 1;
189             }
190              
191 0 0         if ( $show_form ) {
192             # order is important, first put in the form...
193 0           $your_self->stash->view->form( $form );
194              
195             # ... then add error results
196 0 0         if ( $your_self->method eq 'POST' ) {
197 0           $your_self->stash->view->form->results( $results );
198             }
199             }
200             else {
201 0           my $redirect;
202 0 0         my $action = $params->{submit_add_another}
203             ? 'submit_add_another'
204             : 'submit';
205            
206             # remove submit button entry
207 0           delete $params->{submit};
208 0           delete $params->{submit_add_another};
209              
210 0 0         if ( $self->turn_off_clean_params ) {
211 0 0         if ( $self->use_clean_dates ) {
212 0           clean_dates( $params, $form->{ fields } );
213             }
214             }
215             else {
216 0           clean_params( $params, $form->{ fields } );
217             }
218              
219 0           $self->add_action->( $your_self, $params, $data );
220            
221             # Find redirect.
222 0           $redirect = $self->_find_redirect(
223             {
224             gantry_site => $your_self,
225             data => $data,
226             action => $action,
227             user_req => 'add'
228             }
229             );
230              
231 0           return $your_self->relocate( $redirect );
232             }
233             } # END: add
234              
235             #-------------------------------------------------
236             # $self->edit( $your_self, { put => 'your', data => 'here' } );
237             #-------------------------------------------------
238             sub edit {
239 0     0 1   my ( $self, $your_self, $data ) = @_;
240              
241             # Use the specified default template in the config if no
242             # template was specified to the crud module and there is a
243             # default defined.
244 0 0 0       if (
245             ( ! $self->{ignore_default_template} ) and
246             ( $your_self->fish_config( 'default_form_template' ) )
247             ) {
248 0           $your_self->stash->view->template(
249             $your_self->fish_config( 'default_form_template' )
250             );
251             }
252             else {
253 0           $your_self->stash->view->template( $self->template );
254             }
255              
256 0 0         $your_self->stash->view->title( 'Edit ' . $self->text_descr() )
257             unless $your_self->stash->view->title;
258              
259 0           my %params = $your_self->get_param_hash();
260              
261             # Redirect if 'Cancel'
262 0 0         if ( $params{cancel} ) {
263 0           my $redirect = $self->_find_redirect(
264             {
265             gantry_site => $your_self,
266             data => $data,
267             action => 'cancel',
268             user_req => 'edit',
269             }
270             );
271 0           return $your_self->relocate( $redirect );
272             }
273              
274             # get and hold the form description
275 0           my $form = $self->form->( $your_self, $data );
276              
277 0 0 0       croak 'Your form callback gave me nothing' unless defined $form and $form;
278              
279 0           my $show_form = 0;
280 0           my $results;
281              
282 0 0         if ( $your_self->is_post ) {
283 0 0         $show_form = 1 if ( keys %params == 0 );
284              
285             # Check form data
286 0 0         if ( $self->validator ) {
287             $results = $self->validator->(
288             {
289             self => $your_self,
290             params => \%params,
291             form => $form,
292 0           profile => form_profile( $form->{ fields } ),
293             action => 'edit',
294             }
295             );
296             }
297             else {
298             $results = Data::FormValidator->check(
299             \%params,
300 0           form_profile( $form->{ fields } ),
301             );
302             }
303              
304 0 0         $show_form = 1 if ( $results->has_invalid );
305 0 0         $show_form = 1 if ( $results->has_missing );
306 0 0         $show_form = 1 if ( $form->{ error_text } );
307             }
308             else {
309 0           $show_form = 1;
310             }
311              
312             # Form has errors
313 0 0         if ( $show_form ) {
314             # order matters, get form data first...
315 0           $your_self->stash->view->form( $form );
316              
317             # ... then overlay with results
318 0 0         if ( $your_self->method eq 'POST' ) {
319 0           $your_self->stash->view->form->results( $results );
320             }
321            
322             }
323             # Form looks good, make update
324             else {
325 0           my $redirect;
326 0 0         my $action = $params{submit_add_another}
327             ? 'submit_add_another'
328             : 'submit';
329            
330             # remove submit button entry
331 0           delete $params{submit};
332 0           delete $params{submit_add_another};
333            
334 0 0         if ( $self->turn_off_clean_params ) {
335 0 0         if ( $self->use_clean_dates ) {
336 0           clean_dates( \%params, $form->{ fields } );
337             }
338             }
339             else {
340 0           clean_params( \%params, $form->{ fields } );
341             }
342              
343 0           $self->edit_action->( $your_self, \%params, $data );
344            
345             # Find redirect.
346 0           $redirect = $self->_find_redirect(
347             {
348             gantry_site => $your_self,
349             data => $data,
350             action => $action,
351             user_req => 'edit'
352             }
353             );
354            
355 0           return $your_self->relocate( $redirect );
356             }
357             } # END: edit
358              
359             #-------------------------------------------------
360             # $self->delete( $your_self, $confirm, { other => 'data' } )
361             #-------------------------------------------------
362             sub delete {
363 0     0 1   my ( $self, $your_self, $yes, $data ) = @_;
364              
365 0 0         $your_self->stash->view->template( 'delete.tt' )
366             unless $your_self->stash->view->template();
367 0 0         $your_self->stash->view->title( 'Delete' )
368             unless $your_self->stash->view->title;
369              
370 0 0         if ( $your_self->params->{cancel} ) {
371 0           my $redirect = $self->_find_redirect(
372             {
373             gantry_site => $your_self,
374             data => $data,
375             action => 'cancel',
376             user_req => 'delete'
377             }
378             );
379 0           return $your_self->relocate( $redirect );
380             }
381              
382 0 0 0       if ( ( defined $yes ) and ( $yes eq 'yes' ) ) {
383              
384 0           $self->delete_action->( $your_self, $data );
385              
386             # Move along, it's already dead
387 0           my $redirect = $self->_find_redirect(
388             {
389             gantry_site => $your_self,
390             data => $data,
391             action => 'submit',
392             user_req => 'delete'
393             }
394             );
395 0           return $your_self->relocate( $redirect );
396             }
397             else {
398 0           $your_self->stash->view->form->message (
399             'Delete ' . $self->text_descr() . '?'
400             );
401             }
402             }
403              
404             #-----------------------------------------------------------
405             # Helpers
406             #-----------------------------------------------------------
407              
408             sub _find_redirect {
409 0     0     my ( $self, $args ) = @_;
410 0           my $your_self = $args->{ gantry_site };
411 0           my $data = $args->{ data };
412 0           my $action = $args->{ action };
413 0           my $user_req = $args->{ user_req };
414              
415 0           my $retval;
416              
417 0           my $redirect_sub = $self->redirect;
418              
419 0 0         if ( $redirect_sub ) {
420 0           $retval = $redirect_sub->( $your_self, $data, $action, $user_req );
421             }
422             else {
423 0           $retval = $your_self->location();
424             }
425              
426 0           return $retval;
427             }
428              
429             #-----------------------------------------------------------
430             # Helper functions offered for export
431             #-----------------------------------------------------------
432              
433             sub select_multiple_closure {
434 0     0 1   my $field_name = shift;
435 0           my $db_selected = shift;
436              
437             return sub {
438 0     0     my $id = shift;
439 0           my $params = shift;
440              
441 0           my @real_keys = grep ! /^\./, keys %{ $params };
  0            
442              
443 0 0         if ( @real_keys ) {
444 0 0         return unless $params->{ $field_name };
445 0           my @param_ids = split /\0/, $params->{ $field_name };
446 0           foreach my $param_id ( @param_ids ) {
447 0 0         return 1 if ( $param_id == $id );
448             }
449             }
450             else {
451 0           return $db_selected->{ $id };
452             }
453 0           };
454             }
455              
456             1;
457              
458             __END__