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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: расширение DOMElement

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: как сохранять объекты для DOMElement
AmsTaFF
Отправлено: 09 Июля, 2013 - 09:56:42
Post Id


Гость


Покинул форум
Сообщений всего: 84
Дата рег-ции: Июнь 2013  
Откуда: Россия, Москва


Помог: 1 раз(а)




Для библиотеки 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.         }


Возможно ли как-нибудь сохранять этот объект в элементе?
 
 Top
esterio
Отправлено: 10 Июля, 2013 - 00:36:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




не уверен но попробуйте
 
 Top
AmsTaFF
Отправлено: 10 Июля, 2013 - 11:05:15
Post Id


Гость


Покинул форум
Сообщений всего: 84
Дата рег-ции: Июнь 2013  
Откуда: Россия, Москва


Помог: 1 раз(а)




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. }


пришлось выкрутиться так, но зато сохранил интерфейс работы с элементом
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« XML и его обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB