Для одного личного проекта (да и давно просто хотелось попробовать) решил использовать в качестве шаблонизатора — 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>
Если кто-то подскажет более цивилизованные решения, буду рад.
Ну а за неимением авось кому-то данная функция сослужит хорошую службу.