Mercurial > pub > Impl
view Lib/IMPL/DOM/Transform/QueryToDOM.pm @ 257:299af584c05f
collapse empty array elements in POSTed data
author | sergey |
---|---|
date | Fri, 14 Dec 2012 03:07:41 +0400 |
parents | 129e48bb5afb |
children | c9c2ec29793f |
line wrap: on
line source
package IMPL::DOM::Transform::QueryToDOM; use strict; use IMPL::Const qw(:prop); use IMPL::declare { base => [ 'IMPL::DOM::Transform::ObjectToDOM' => '@_' ], props => [ prefix => PROP_RO, delimiter => PROP_RO ] }; sub CTOR { my ($this) = @_; $this->templates->{'CGI'} = \&TransformCGI; $this->delimiter('[.]'); $this->prefix(''); } # inflate simple properties sub TransformPlain { my ($this,$data) = @_; $this->currentNode->nodeProperty( rawValue => $data ); $this->currentNode->nodeValue( $this->inflateNodeValue($data) ); return $this->currentNode; } # do not store complex data as node values sub StoreObject { my ($this,$node,$data) = @_; return $node; } sub TransformCGI { my ($this,$query) = @_; my $data={}; my $prefix = $this->prefix; my $delim = $this->delimiter; foreach my $param (grep index($_,$prefix) >= 0 , $query->param()) { my @value = grep length($_), $query->param($param) or next; my @parts = split /$delim/,$param; my $node = $data; while ( my $part = shift @parts ) { if (my ($name,$index) = ($part =~ m/^(\w+)(?:\[(\d+)\])?$/) ) { if (@parts) { if(defined $index) { $node = ($node->{$name}[$index] ||= {}); } else { $node = ($node->{$name} ||= {}); } } else { if(defined $index) { $node->{$name}[$index] = (@value == 1 ? $value[0] : \@value); } else { $node->{$name} = (@value == 1 ? $value[0] : \@value); } } } } } return $this->Transform($data); } 1;