169 |
169 |
# legacy, some old upload routines expect this to be here
|
170 |
170 |
$temp_target->{FILENAME} = $filename if defined $filename;
|
171 |
171 |
|
172 |
|
# name can potentially be both a normal variable or a file upload
|
173 |
|
# a file upload can be identified by its "filename" attribute
|
174 |
|
# the thing is, if a [+] clause vivifies atructur in one of the
|
|
172 |
# Name can potentially be both a normal variable or a file upload.
|
|
173 |
# A file upload can be identified by its "filename" attribute.
|
|
174 |
# The thing is, if a [+] clause vivifies structure in one of the
|
175 |
175 |
# branches it must be done in both, or subsequent "[]" will fail
|
176 |
176 |
my $temp_target_slot = _store_value($temp_target, $name);
|
177 |
177 |
my $target_slot = _store_value($target, $name);
|
... | ... | |
286 |
286 |
read STDIN, $content, $ENV{CONTENT_LENGTH};
|
287 |
287 |
if ($ENV{'CONTENT_TYPE'} && $ENV{'CONTENT_TYPE'} =~ /multipart\/form-data/) {
|
288 |
288 |
# multipart formdata can bring it's own encoding, so give it both
|
289 |
|
# and let ti decide on it's own
|
|
289 |
# and let it decide on it's own
|
290 |
290 |
_parse_multipart_formdata($target, $temp_target, $content, 1);
|
291 |
291 |
} else {
|
292 |
292 |
# normal encoding must be recoded
|
... | ... | |
313 |
313 |
my ($source, $target, $prefix, $in_array) = @_;
|
314 |
314 |
$target ||= [];
|
315 |
315 |
|
316 |
|
# there are two edge cases that need attention. first: more than one hash
|
317 |
|
# inside an array. only the first of each nested can have a [+]. second: if
|
|
316 |
# There are two edge cases that need attention. First: more than one hash
|
|
317 |
# inside an array. Only the first of each nested can have a [+]. Second: if
|
318 |
318 |
# an array contains mixed values _store_value will rely on autovivification.
|
319 |
|
# so any type change must have a [+]
|
320 |
|
# this closure decides one recursion step AFTER an array has been found if a
|
|
319 |
# So any type change must have a [+]
|
|
320 |
# This closure decides one recursion step AFTER an array has been found if a
|
321 |
321 |
# [+] needs to be generated
|
322 |
322 |
my $arr_prefix = sub {
|
323 |
323 |
return $_[0] ? '[+]' : '[]' if $in_array;
|
... | ... | |
373 |
373 |
=head1 SYNOPSIS
|
374 |
374 |
|
375 |
375 |
This module handles unpacking of CGI parameters. It also gives
|
376 |
|
information about the request like whether or not it was done via AJAX
|
|
376 |
information about the request, such as whether or not it was done via AJAX,
|
377 |
377 |
or the requested content type.
|
378 |
378 |
|
379 |
379 |
use SL::Request qw(read_cgi_input);
|
... | ... | |
418 |
418 |
|
419 |
419 |
=item Arrays
|
420 |
420 |
|
421 |
|
Arrays will by trailing empty brackets (C<[]>). An hash like this
|
|
421 |
Arrays will be marked by empty brackets (C<[]>). A hash like this
|
422 |
422 |
|
423 |
423 |
selected_id => [ 2, 6, 8, 9 ]
|
424 |
424 |
|
... | ... | |
439 |
439 |
|
440 |
440 |
=item Nested structures
|
441 |
441 |
|
442 |
|
A special version of this are nested hashs in an array, which is very common.
|
|
442 |
A special version of this are nested hashes in an array, which is very common.
|
443 |
443 |
The combined operator (C<[].>) will be used. As a special case, every time a new
|
444 |
444 |
array slice is started, the special convention (C<[+].>) will be used. Again this
|
445 |
445 |
is because it's easy to write a template with it.
|
... | ... | |
491 |
491 |
|
492 |
492 |
=item Sparse Arrays
|
493 |
493 |
|
494 |
|
It is not possible to serialize somehing like
|
|
494 |
It is not possible to serialize something like
|
495 |
495 |
|
496 |
496 |
sparse_array => do { my $sa = []; $sa[100] = 1; $sa },
|
497 |
497 |
|
... | ... | |
522 |
522 |
This function will flatten the provided hash ref into the provided array ref.
|
523 |
523 |
The array ref may be non empty, but will be changed in this case.
|
524 |
524 |
|
525 |
|
Return value is the flattened array ref.
|
|
525 |
The return value is the flattened array ref.
|
526 |
526 |
|
527 |
527 |
=item C<unflatten ARRAYREF [ HASHREF ]>
|
528 |
528 |
|
... | ... | |
540 |
540 |
=item C<layout>
|
541 |
541 |
|
542 |
542 |
Set and retrieve the layout object for the current request. Must be an instance
|
543 |
|
of L<SL::Layout::Base>. Defaults to an isntance of L<SL::Layout::None>.
|
|
543 |
of L<SL::Layout::Base>. Defaults to an instance of L<SL::Layout::None>.
|
544 |
544 |
|
545 |
545 |
For more information about layouts, see L<SL::Layout::Dispatcher>.
|
546 |
546 |
|
... | ... | |
565 |
565 |
|
566 |
566 |
=head2 C<_store_value()>
|
567 |
567 |
|
568 |
|
parses a complex var name, and stores it in the form.
|
|
568 |
Parses a complex var name, and stores it in the form.
|
569 |
569 |
|
570 |
|
syntax:
|
|
570 |
Syntax:
|
571 |
571 |
_store_value($target, $key, $value);
|
572 |
572 |
|
573 |
|
keys must start with a string, and can contain various tokens.
|
574 |
|
supported key structures are:
|
|
573 |
Keys must start with a string, and can contain various tokens.
|
|
574 |
Supported key structures are:
|
575 |
575 |
|
576 |
576 |
1. simple access
|
577 |
|
simple key strings work as expected
|
|
577 |
Simple key strings work as expected
|
578 |
578 |
|
579 |
579 |
id => $form->{id}
|
580 |
580 |
|
581 |
581 |
2. hash access.
|
582 |
|
separating two keys by a dot (.) will result in a hash lookup for the inner value
|
583 |
|
this is similar to the behaviour of java and templating mechanisms.
|
|
582 |
Separating two keys by a dot (.) will result in a hash lookup for the inner value
|
|
583 |
This is similar to the behaviour of java and templating mechanisms.
|
584 |
584 |
|
585 |
585 |
filter.description => $form->{filter}->{description}
|
586 |
586 |
|
587 |
587 |
3. array+hashref access
|
588 |
588 |
|
589 |
|
adding brackets ([]) before the dot will cause the next hash to be put into an array.
|
590 |
|
using [+] instead of [] will force a new array index. this is useful for recurring
|
591 |
|
data structures like part lists. put a [+] into the first varname, and use [] on the
|
|
589 |
Adding brackets ([]) before the dot will cause the next hash to be put into an array.
|
|
590 |
Using [+] instead of [] will force a new array index. This is useful for recurring
|
|
591 |
data structures like part lists. Put a [+] into the first varname, and use [] on the
|
592 |
592 |
following ones.
|
593 |
593 |
|
594 |
|
repeating these names in your template:
|
|
594 |
Repeating these names in your template:
|
595 |
595 |
|
596 |
596 |
invoice.items[+].id
|
597 |
597 |
invoice.items[].parts_id
|
... | ... | |
612 |
612 |
|
613 |
613 |
4. arrays
|
614 |
614 |
|
615 |
|
using brackets at the end of a name will result in a pure array to be created.
|
616 |
|
note that you mustn't use [+], which is reserved for array+hash access and will
|
|
615 |
Using brackets at the end of a name will result in the creation of a pure array.
|
|
616 |
Note that you mustn't use [+], which is reserved for array+hash access and will
|
617 |
617 |
result in undefined behaviour in array context.
|
618 |
618 |
|
619 |
619 |
filter.status[] => $form->{status}->[ val1, val2, ... ]
|
Typos und Kommentare angepasst