# HG changeset patch # User sergey # Date 1385935992 -14400 # Node ID 7c621bb95e53e28b342d5b6e1292a035547cb355 # Parent 82b6c967bcf106a1778677d3fb061bece084b130 working on the metadata model diff -r 82b6c967bcf1 -r 7c621bb95e53 Lib/IMPL/Web/View/Metadata/FormMeta.pm --- a/Lib/IMPL/Web/View/Metadata/FormMeta.pm Fri Nov 29 16:33:07 2013 +0400 +++ b/Lib/IMPL/Web/View/Metadata/FormMeta.pm Mon Dec 02 02:13:12 2013 +0400 @@ -11,9 +11,9 @@ 'IMPL::Web::View::Metadata::BaseMeta' => '@_' ], props => [ - decl => PROP_RO, + nodes => PROP_RO, + decl => PROP_RO, schema => PROP_RO, - nodes => PROP_RO, errors => PROP_RO ] }; @@ -29,11 +29,29 @@ foreach qw(decl schema); } -sub GetOwnErrors { - +sub isMultiple { + shift->decl->isMultiple; +} + +sub isOptional { + shift->decl->isOptional; } +sub GetOwnErrors { + my ($this) = @_; + + my $node = undef; + + $node = not($this->isMultiple) && $this->nodes ? $this->nodes->[0] : undef; + + return [ + grep { + ($node && $_->node && $_->node == $node) || (not($node) && $_->schema == $this->decl ) + } @{$this->errors || []} + ]; +} + 1; __END__ @@ -46,31 +64,73 @@ =head1 DESCRIPTION -Метаданные по модели, являющейся частью формы. Элемент формы описывается -несколькими компонентами: +Расширенные метаданные модели для элементов формы, помимо стандартных свойств +сожержит в себе информацию о схеме. + +=head1 MEMBERS -=over +=head2 C<[get]errors> + +Ссылка на массив с ошибками при проверке схемы. Ошибки относятся ко всем +узлам в текущей модели, включая вложенные и т.п. + +=head2 C<[get]model> -=item * schema +Ссылка на элемент документа, либо на массив с элементами для множественных +значений (C). В том случае, когда документ был не +корректен и для не множественного элемента было передено несколько значений, +данное свойство будет содержать только первое. + +=head2 C<[get]nodes> -Схема текущего элемента, СomlexType, SimpleType, ComplexNode или SimpleNode +Ссылка на массив с узлами документа. В теории количество узлов может быть +произвольным, поскольку документ может быть некорректным, т.е. их может +быть более одного в то время, как C или, напротив, ни +одного при C. + +=head2 C<[get]modelType> -=item * decl +Название типа данных из схемы документа (C<< schema->name >>), если тип не имеет название, то это +C для сложных узлов и C для простых. + +Для моделей с множественными значениями это свойство означает тип элементов. + +=head2 C<[get]decl> -Сам элемент формы, который присутствует в родительском контейнере. Объявление -может совпадать со схемой в случае, когда это был SimpleNode или ComplexNode, -иначе это Node ссылающийся на заранее обпределенный тип. +Объявление элемента формы, объявление может совпадать со схемой в случае, +когда это был C или C, иначе это C ссылающийся +на заранее обпределенный тип. + +=head2 C<[get]schema> -=item * nodes +Схема текущего элемента, C<СomlexType>, C, C или +C. + +=head2 C<[get]isOptional> + +Данный элемент может не иметь ни одного значения + +=head2 C<[get]isMultiple> -Список узлов документа, которые являются экземплярами текущего элемента, в -случае, если этот элемен не является множественным (maxOccur=1), тогда здесь -должен быть только один элемент. +Данный элемент может иметь более одного значения. Модель с множественными +значениями является сложным элементом, в котором дочерними моделями являются +не свойства а сами элементы, в данном случае они их именами будут индексы. + +=begin code -=item * errors +for(my $i=0; $i< 10; $i++) { + display_model( + $meta->model->[$i], + schema => meta->schema, + ); +} -Список ошибок относящихся к данному элементу. +=end code + +=head2 C -=back +Возвращает ошибки относящиеся к самому элементу C, это принципиально +для контейнеров и в случаях, когда модель не корректна и в ней присутствуют +лишние значения. =cut \ No newline at end of file diff -r 82b6c967bcf1 -r 7c621bb95e53 Lib/IMPL/Web/View/Metadata/FormProvider.pm --- a/Lib/IMPL/Web/View/Metadata/FormProvider.pm Fri Nov 29 16:33:07 2013 +0400 +++ b/Lib/IMPL/Web/View/Metadata/FormProvider.pm Mon Dec 02 02:13:12 2013 +0400 @@ -2,6 +2,9 @@ use strict; use IMPL::declare { + require => { + Meta => 'IMPL::Web::View::Metadata::FormMeta' + }, base => [ 'IMPL::Object' => undef ] @@ -14,14 +17,28 @@ sub PopulateChildren { my ($this,$meta) = @_; - map { - $_->name, - $_ - } $meta->schema->content->childNodes; + map Meta->new($this,), $meta->schema->content->childNodes; } sub GetChild { +} + +sub _IsErrorRelates { + my ($node,$source,$err) = @_; + + # this is an own error + return 1 if ($node && $err->node && $err->node == $node) || (not($node) && $err->schema == $source ); + + # this error relates to the child control + + return 0 unless $node; + + for (my $n = $err->parent; $n ; $n = $n->parentNode) { + return 1 if $n == $node; + } + + return 0; } 1; \ No newline at end of file