Mercurial > pub > Impl
view Lib/IMPL/DOM/Transform/PostToDOM.pm @ 147:c2aa10fbb396
Post to dom improved
author | wizard |
---|---|
date | Mon, 09 Aug 2010 08:45:36 +0400 |
parents | b56ebc31bf18 |
children | e6447ad85cb4 |
line wrap: on
line source
package IMPL::DOM::Transform::PostToDOM; use strict; use warnings; use IMPL::DOM::Navigator::Builder; use IMPL::Class::Property; use base qw(IMPL::Transform); BEGIN { public property documentClass => prop_get | owner_set; public property documentSchema => prop_get | owner_set; public property prefix => prop_get | owner_set; private property _navi => prop_all; public property Errors => prop_all | prop_list; private property _schema => prop_all; } our %CTOR = ( 'IMPL::Transform' => sub { -plain => \&TransformPlain, HASH => \&TransformContainer, CGI => \&TransformCGI, CGIWrapper => \&TransformCGI } ); sub CTOR { my ($this,$docClass,$docSchema,$prefix) = @_; $docClass ||= 'IMPL::DOM::Document'; $this->_navi( IMPL::DOM::Navigator::Builder->new( $docClass, $docSchema ) ); $this->_schema($docSchema); $this->prefix($prefix) if $prefix; } sub TransformContainer { my ($this,$data) = @_; my $navi = $this->_navi; foreach my $key ( sort { $a->[1] cmp $b->[1] || $a->[2] <=> $b->[2]} map [$_,/(\w+)(?:\[(\d+)\])?/], keys %$data ){ my $value = $data->{$key->[0]}; my $node = $navi->NavigateCreate($key->[1]); $node->nodeProperty(instanceId => $key->[2]) if $key->[2]; $this->Transform($value); $navi->Back(); } return $navi->Current; } sub TransformPlain { my ($this,$data) = @_; $this->_navi->Current->nodeValue( $this->_navi->inflateValue($data) ); } sub TransformCGI { my ($this,$query) = @_; my $data={}; my $prefix = $this->prefix; foreach my $param (grep index($_,$prefix) >= 0 , $query->param()) { my $value = $query->param($param) or next; my @parts = split /\//,$param; my $node = $data; while ( my $part = shift @parts ) { if (@parts) { $node = ($node->{$part} ||= {}); } else { $node->{$part} = $value; } } } if (keys %$data > 1) { $data = { document => $data }; } my $doc = $this->Transform($data); $doc->nodeProperty( query => $query ); $this->Errors->Append( $this->_navi->BuildErrors); $this->Errors->Append( $this->_schema->Validate($doc)); return $doc; } 1; __END__ =pod =head1 NAME C<IMPL::DOM::Transform::PostToDOM> - Преобразование объекта C<CGI> в DOM документ. =head1 SINOPSYS =begin code my $transform = new IMPL::DOM::Transform::PostToDOM( 'My::DOM::Document', IMPL::DOM::Schema->LoadSchema('Data/user.add.schema.xml'), 'myForm' ); =end code =head1 DESCRIPTION Используется для преобразования CGI запроса в DOM документ. Для этого используются параметры запроса, имена которых начинаются со значение из свойства C<prefix>. Имена параметров интерпретируются следующим образом =over =item 1 Имя параметра составляется из имени узла, имен всех его родителей и указанием номера экземпляра. =item 2 Имена узлов могут содержать только буквы, цифры и символ _ =item 3 В случае когда узел может повторяться несколько раз, в квадратных скобках указывается послеовательный номер экземпляра. =item 4 Имена параметров объединяются через символ '/' =back =cut