Для одного личного проекта (да и давно просто хотелось попробовать) решил использовать в качестве шаблонизатора — XSLT. Все вроде бы чудесно: для xsl-преобразований требуется объект SimpleXml, из базы возвращается тоже объект, казалось бы в чем проблема, почему нельзя передавать объект из базы напрямую в шаблонизатор?
Но напрямую вывести объект в xslt-шаблонизатор нельзя... Утверждать наверняка не стану, но я искал, прежде чем создавать нового двухколесного друга. Личная мини-эра велосипедостроения по любому удобному поводу уже прошла.
Поэтому и была написана следующая функция-конвертер (я кстати использую в codeigniter, хотя особой специфики это не вносит):
Функция небольшая, уверен сырая, но рабочая и я, пока еще, не столкнулся с тем, чтобы она не переварила.
В простом примере это выглядит так:
Контроллер:
View:
Входящий объект:
Результат (объект):
Результат (XML):
Если кто-то подскажет более цивилизованные решения, буду рад.
Ну а за неимением авось кому-то данная функция сослужит хорошую службу.
Поэтому и была написана следующая функция-конвертер (я кстати использую в 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>
Если кто-то подскажет более цивилизованные решения, буду рад.
Ну а за неимением авось кому-то данная функция сослужит хорошую службу.
