Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: расширение DOMElement
Форумы портала PHP.SU » » XML и его обработка » расширение DOMElement

Страниц (1): [1]
 

1. AmsTaFF - 09 Июля, 2013 - 09:56:42 - перейти к сообщению
Для библиотеки DOM можно изменить некоторые классы, например так:
PHP:
скопировать код в буфер обмена
  1. $this->document = new DOMDocument('1.0');
  2. $this->document->registerNodeClass('DOMElement', 'BannerElement2');
  3. $this->document->loadXML($xml_string);
  4. $this->document->formatOutput = true;
  5. $this->dom_banner = $this->document->getElementsByTagName(ComplexBannerConstants::XML_ELEM_BANNER)->item(0);


класс BannerElement2 определен так:
PHP:
скопировать код в буфер обмена
  1. Class BannerElement2 extends DOMElement {
  2.         /** @var  TextContainer */
  3.         private $text_container=null;
  4. ...
  5.         public function setTextContainer(TextContainer $text_container){
  6.                 $this->text_container = $text_container;
  7.                 $this->setBelongsTo($text_container->getName());
  8.                 return $this;
  9.         }
  10.         public function getTextContainer(){ return $this->text_container; }


Но, при такой реализации, если пройтись по детям и задать им контейнер, а потом, при втором проходе запросить этот контейнер, то он окажется null
PHP:
скопировать код в буфер обмена
  1.         public function run(){
  2.                 ....
  3.                 for($i=0;$i<$this->dom_banner->childNodes->length;$i++){
  4.                         /** @var BannerElement2 $el */
  5.                         $el = $this->dom_banner->childNodes->item($i);
  6.                         $el->setTextContainer(new TextContainer('test',20));
  7.                 }
  8.                 for($i=0;$i<$this->dom_banner->childNodes->length;$i++){
  9.                         /** @var BannerElement2 $el */
  10.                         $el = $this->dom_banner->childNodes->item($i);
  11.                         var_dump($el->getTextContainer());
  12.                 }
  13.                 ...
  14.  
  15.                 return $this;
  16.         }


Возможно ли как-нибудь сохранять этот объект в элементе?
2. esterio - 10 Июля, 2013 - 00:36:33 - перейти к сообщению
не уверен но попробуйте
3. AmsTaFF - 10 Июля, 2013 - 11:05:15 - перейти к сообщению
esterio, уже не смогу попробовать так, уже сделал по-другому

не знаю как точно работает DOM, но из-за нехватки времени и специфичности TextContainer, сделал так:
PHP:
скопировать код в буфер обмена
  1. public function setTextContainer(TextContainer $text_container){
  2.                 $this->setBelongsTo($text_container->getName());
  3.                 return $this;
  4.         }
  5.         public function getTextContainer(){ return TextContainerRegistry::get($this->getBelongsTo()); }


PHP:
скопировать код в буфер обмена
  1. Class TextContainerRegistry
  2. {
  3.         /**
  4.          * @var TextContainer[]
  5.          */
  6.         static private $registry = array();
  7.  
  8.         /**
  9.          * @param $name
  10.          * @return TextContainer
  11.          */
  12.         static public function get($name){ return self::$registry[$name]; }
  13.         static public function add(TextContainer $text_container){ self::$registry[$text_container->getName()] = $text_container; }
  14. }


пришлось выкрутиться так, но зато сохранил интерфейс работы с элементом

 

Powered by ExBB FM 1.0 RC1