changeset 365:7c621bb95e53

working on the metadata model
author sergey
date Mon, 02 Dec 2013 02:13:12 +0400
parents 82b6c967bcf1
children 935629bf80df
files Lib/IMPL/Web/View/Metadata/FormMeta.pm Lib/IMPL/Web/View/Metadata/FormProvider.pm
diffstat 2 files changed, 101 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- 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<isMultiple = true>). В том случае, когда документ был не
+корректен и для не множественного элемента было передено несколько значений,
+данное свойство будет содержать только первое.
+
+=head2 C<[get]nodes>
 
-Схема текущего элемента, СomlexType, SimpleType, ComplexNode или SimpleNode
+Ссылка на массив с узлами документа. В теории количество узлов может быть
+произвольным, поскольку документ может быть некорректным, т.е. их может
+быть более одного в то время, как C<isMultiple = false> или, напротив, ни
+одного при C<isOptional = false>.
+
+=head2 C<[get]modelType>
 
-=item * decl
+Название типа данных из схемы документа (C<< schema->name >>), если тип не имеет название, то это
+C<ComplexNode> для сложных узлов и C<SimpleNode> для простых.
+
+Для моделей с множественными значениями это свойство означает тип элементов.
+
+=head2 C<[get]decl>
 
-Сам элемент формы, который присутствует в родительском контейнере. Объявление
-может совпадать со схемой в случае, когда это был SimpleNode или ComplexNode,
-иначе это Node ссылающийся на заранее обпределенный тип.
+Объявление элемента формы, объявление может совпадать со схемой в случае,
+когда это был C<SimpleNode> или C<ComplexNode>, иначе это C<Node> ссылающийся
+на заранее обпределенный тип.
+
+=head2 C<[get]schema>
 
-=item * nodes
+Схема текущего элемента, C<СomlexType>, C<SimpleType>, C<ComplexNode> или
+C<SimpleNode>.
+
+=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<GetOwnErrors()>
 
-=back 
+Возвращает ошибки относящиеся к самому элементу C<model>, это принципиально
+для контейнеров и в случаях, когда модель не корректна и в ней присутствуют
+лишние значения.  
 
 =cut
\ No newline at end of file
--- 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