Mercurial > pub > Impl
diff 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 diff
--- a/Lib/IMPL/DOM/Transform/PostToDOM.pm Mon Jul 26 03:19:06 2010 +0400 +++ b/Lib/IMPL/DOM/Transform/PostToDOM.pm Mon Aug 09 08:45:36 2010 +0400 @@ -44,9 +44,14 @@ my $navi = $this->_navi; - while (my ($key,$value) = each %$data) { + 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]); - $navi->NavigateCreate($key); + $node->nodeProperty(instanceId => $key->[2]) if $key->[2]; $this->Transform($value); @@ -68,9 +73,8 @@ my $data={}; my $prefix = $this->prefix; - $prefix = qr/$prefix/; - foreach my $param (grep $_=~/$prefix/, $query->param()) { + foreach my $param (grep index($_,$prefix) >= 0 , $query->param()) { my $value = $query->param($param) or next; my @parts = split /\//,$param; @@ -85,10 +89,57 @@ } } + 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