Pull to refresh

Функция конвертации stdClass в SimpleXml

Reading time2 min
Views4K
Для одного личного проекта (да и давно просто хотелось попробовать) решил использовать в качестве шаблонизатора — XSLT. Все вроде бы чудесно: для xsl-преобразований требуется объект SimpleXml, из базы возвращается тоже объект, казалось бы в чем проблема, почему нельзя передавать объект из базы напрямую в шаблонизатор?



Но напрямую вывести объект в xslt-шаблонизатор нельзя... Утверждать наверняка не стану, но я искал, прежде чем создавать нового двухколесного друга. Личная мини-эра велосипедостроения по любому удобному поводу уже прошла.

Поэтому и была написана следующая функция-конвертер (я кстати использую в codeigniter, хотя особой специфики это не вносит):

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:
        // конвертируем объект в 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>


Если кто-то подскажет более цивилизованные решения, буду рад.
Ну а за неимением авось кому-то данная функция сослужит хорошую службу.
Tags:
Hubs:
+3
Comments13

Articles

Change theme settings