Mercurial > pub > Impl
comparison Lib/IMPL/DOM/Transform/ObjectToDOM.pm @ 263:0f59b2de72af
*fixed IMPL::DOM::Schema circular module references
*modified IMPL::Object::Singleton, added auto-activation
*code cleanups, docs
author | sergey |
---|---|
date | Wed, 09 Jan 2013 05:17:44 +0400 |
parents | 299af584c05f |
children | c9c2ec29793f |
comparison
equal
deleted
inserted
replaced
262:4ac39b9e2ca4 | 263:0f59b2de72af |
---|---|
47 ) | 47 ) |
48 ); | 48 ); |
49 $this->_schema($docSchema); | 49 $this->_schema($docSchema); |
50 | 50 |
51 $this->_navi->NavigateCreate($docName); | 51 $this->_navi->NavigateCreate($docName); |
52 $this->currentNode->nodeProperty(schemaDocument => $docSchema); | |
52 } | 53 } |
53 | 54 |
54 sub TransformPlain { | 55 sub TransformPlain { |
55 my ($this,$data) = @_; | 56 my ($this,$data) = @_; |
56 | 57 |
164 | 165 |
165 =pod | 166 =pod |
166 | 167 |
167 =head1 NAME | 168 =head1 NAME |
168 | 169 |
169 C<IMPL::DOM::Transform::ObjectToDOM> -преобразование объекта | 170 C<IMPL::DOM::Transform::ObjectToDOM> -преобразование объекта в DOM документ. |
170 | 171 |
171 =head1 SYNOPSIS | 172 =head1 SYNOPSIS |
172 | 173 |
174 =begin code | |
175 | |
176 use IMPL::require { | |
177 Schema => 'IMPL::DOM::Schema', | |
178 Config => 'IMPL::Config' | |
179 } | |
180 | |
181 my $data = { | |
182 id => '12313-232', | |
183 name => 'Peter', | |
184 age => 20 | |
185 }; | |
186 | |
187 my $schema = Schema->LoadSchema(Config->AppBase('schemas','person.xml')); | |
188 my $transorm = IMPL::DOM::Transform::ObjectToDOM->new('edit', $schema); | |
189 | |
190 my $form = $transform->Transform($data); | |
191 | |
192 my @errors; | |
193 | |
194 push @errors, $transform->buildErrors; | |
195 push @errors, $schema->Validate($doc); | |
196 | |
197 =end code | |
198 | |
199 =head1 DESCRIPTION | |
200 | |
201 Наследует C<IMPL::Transform>. Определяет базовые преобразования для хешей и | |
202 объектов, поддерживающих метаданные. | |
203 | |
204 Результатом выполнения преобразования является DOM документ. При построении | |
205 документа используется навигатор C<IMPL::DOM::Navigator::Builder> для | |
206 сопоставления схемы и свойств преобразуемого объекта. Элементы полученного | |
207 документа имеют ссылки на соответствующие им элементы схемы. | |
208 | |
209 После того, как документ построен и преобразование будет очищено, не останется | |
210 объектов, которые бы ссылались на документ со схемой, поскольку элементы схемы | |
211 имеют слабые ссылки на саму схему и не могут предотвратить ее удаление. | |
212 Для предотвращения очитски документа схемы, ссылка на него сохраняется в | |
213 атрибуте документа C<schemaDocument>, что обеспечит жизнь схемы на протяжении | |
214 жизни документа. | |
215 | |
216 Преобразование происходит рекурсивно, сначала используется метод | |
217 C<NavigateCreate> для создания элемента соответсвующего свойству объекта, | |
218 затем вызывается метод C<Transform> для преобразования значения свойства, при | |
219 этом C<currentNode> указывает на только что созданный элемент документа. | |
220 | |
221 =head1 MEMBERS | |
222 | |
223 =head2 C<CTOR($docName,$schema)> | |
224 | |
225 Создает преобразование, при этом будет создан документ состоящий только из | |
226 корневого элемента с именем C<$docName> и будет найдена подходящий для него | |
227 элемент схемы C<$schema>. | |
228 | |
229 =over | |
230 | |
231 =item * C<$docName> | |
232 | |
233 Имя корневого узла документа, которое будет использовано для поиска | |
234 соответствующего элемента схемы C<$schema> | |
235 | |
236 =item * C<$schema> | |
237 | |
238 Схема, содержащая описание документа. Если в данной схеме нет описания корневого | |
239 элемента с именем C<$docName>, будет вызвано исключение. | |
240 | |
241 =back | |
242 | |
243 =head2 C<[get]documentSchema> | |
244 | |
245 Элемент схемы C<ComplexNode> соответствующий документу. Определяется в | |
246 конструкторе исходя из имени документа. | |
247 | |
248 =head2 C<[get]currentNode> | |
249 | |
250 Текущий элемент документа. После создания преобразования - это сам документ. | |
251 Данное свойство использется внутри преобразования для работы с текущим | |
252 элементом. | |
253 | |
254 =head2 C<[virtual]StoreObject($node,$data)> | |
255 | |
256 Метод, который вызывается преобразованием в случае если текущий узел документа | |
257 является простым, а значени которое ему соответсвует является объектом (ссылкой). | |
258 | |
259 По-умолчанию будет выполнено присваивание C<< $node->nodeValue($data) >>, однако | |
260 это можно заменить, например, на преобразование в строку. | |
261 | |
262 =head2 C<inflateNodeValue($data)> | |
263 | |
264 Метод который используется для преобразования значений к правильным типам, | |
265 используя атрибут C<inflator> элемента схемы. Этот метод можно использовать для | |
266 C<TransformPlain>, однако по-умолчанию он не используется, поскольку | |
267 предполагается, что входной объект имеет уже преобразованные значения в своих | |
268 свойствах. | |
269 | |
173 =cut | 270 =cut |