stdClass или SimpleXml: скрипт для конвертации

Недавно для одного личного проекта решил использовать в качестве php-фреймворка — Codeigniter, а в качестве шаблонизатора — XSLT. Все вроде бы чудесно: для xsl-преобразований требуется объект SimpleXml, из базы возвращается тоже объект, казалось бы в чем проблема, почему нельзя передавать объект из базы напрямую в шаблонизатор? Но напрямую как раз этого сделать нельзя.

Поэтому и была написана следующая функция-конвертер:

if ( ! function_exists('std2simplexml'))
{
	function std2simplexml($object,$recursive=false)
	{
		$xml = new DOMDocument;
		$root = $xml->createElement('root');
		$xml->appendChild($root);

		foreach ($object as $key => $child)
		{
			if (is_object($child))
			{		
				$new_xml = std2simplexml($child,true);
				$new_xml = str_replace(array('','',''),'',$new_xml);
				$el = $xml->createElement($key,$new_xml);
			}
			else
			{
				$el = $xml->createElement($key,$child);
			}
			$root->appendChild($el);
		}
		
		if (!$recursive)
		{
			$simple_xml = simplexml_load_string(html_entity_decode($xml->saveXml()));
			return $simple_xml;
		}
		else
		{
			return $xml->saveXml();
		}
	}
}

 

В простом примере это выглядит так:

 

// Контроллер

        // получаем объект книги из базы
        $book_obj = $this->book->getBookPage($book,$page/2);
       
        // создаем стандартный объект php
        $future_xml = new stdclass;

        // добавляем книгу
        $future_xml->book = $book_obj;

        // добавляем бла-бла
        $future_xml->blabla = $blabla;

// код ниже у меня расположен уже во View, но здесь я привожу общим листингом

// View        
        // конвертируем объект в SimpleXML
        $xml = std2simplexml($future_xml);

        // добавляем еще переменные, но уже относящиеся к шаблону
        $xml->template->base_url = base_url();
        $xml->template->title = 'Книжная полка Городецкого';

        $xsl = simplexml_load_file( APPPATH.'templates/index.xsl' );
	$proc= new XSLTProcessor();
	$proc->importStyleSheet($xsl);
	echo $proc->transformToXML($xml);

 

 

Входящий объект:

 

$xml = std2simplexml($future_xml);

  stdClass Object
  (
  
      [cycle_book] => Мания величия
      [title_book] => Гостья
      [sub] => stdClass Object
	  (
	      [id_book] => 1
	      [id_category_book] => 4
	      )
  
  )

 

Результат (объект):

 

  SimpleXMLElement Object
  (
      [cycle_book] => Мания величия
      [title_book] => Гостья
      [sub] => SimpleXMLElement Object
	  (
	      [id_book] => 1
	      [id_category_book] => 4
       )
  
  )

 

Результат (XML):

 

<root>
      <id_book>1</id_book>
      <id_category_book>4</id_category_book>
      <sub>
          <id_book>1</id_book>
          <id_category_book>4</id_category_book>
      </sub>
  </root>

 

 

Для codeigniter оформил это все хелпером, пока что работает, что будет дальше увидим)

PS Пост опубликован на Хабре -> Функция конвертации stdClass в SimpleXml

Полезно(0)Бесполезно(0)
Комментарии закрыты.