Groove
Новичок
Blitz::getStruct - как получить переменные, зная контекст?
День добрый всем.
Вопрос скорее к fisher, но задам его публично, вдруг кто то изобрел красивое решение.
В php_templates есть такая классная штука как "tmpl_structure": передаешь ей контекст и она дает тебе все переменные, существующие в этом контексте.
Ниже поясню, что имел в виду.
Есть такой код:
И два шаблона для него:
php_templates.tpl
blitz.tpl
получим результат:
А теперь немного о том, для чего мне это нужно:
создаем файл "php_templates.php"
Соотвественно, если это в этот View подадим на входе шаблон БЕЗ сложно вычисляемого поля, то метод вычисления вызываться не будет
В Блитце такого эффекта я смог добиться только при помощи пользовательских методов, из-за отсутствия нативного аналога "tmpl_structure".
Шаблон, соответственно, стал таким:
Количество кода заметно увеличилось по сравнению с использованием php_templates.
Вызов через префикс "get__" оставил для возможности переключения шаблонизатора .
Может быть я просто не понял парадигмы этого шаблонизатора? Просветите, пожалуйста!
День добрый всем.
Вопрос скорее к fisher, но задам его публично, вдруг кто то изобрел красивое решение.
В php_templates есть такая классная штука как "tmpl_structure": передаешь ей контекст и она дает тебе все переменные, существующие в этом контексте.
Ниже поясню, что имел в виду.
Есть такой код:
PHP:
$tpl = tmpl_open('php_templates.tpl');
$s = tmpl_structure($tpl, '/item', TMPL_TAG, TMPL_SHORT);
print '<pre>';
print_r($s);
print '--------------------------';
$Template = new Blitz('blitz.tpl');
print_r($Template->getStruct('/item'));
print '--------------------------';
print '</pre>';
php_templates.tpl
PHP:
<tmpl:item>
<h1>{ARTICLE_NAME}</h1>
{article_text}
{hard_calculate_field}
</tmpl:item>
PHP:
{{ BEGIN item }}
<h1>{{ $ARTICLE_NAME }}</h1>
{{ $article_text }}
{{ $hard_calculate_field }}
{{ END }}
PHP:
Array
(
[0] => article_name
[1] => article_text
[2] => hard_calculate_field
)
--------------------------
Array
(
[0] => /item/
[1] => /item/article_name
[2] => /item/article_text
[3] => /item/hard_calculate_field
)
--------------------------
А теперь немного о том, для чего мне это нужно:
создаем файл "php_templates.php"
PHP:
<?
class Article_View_Item{
public $props = array();
function __construct($fields = array()){
$this->props = $fields;
}
protected function __get($name){
$getter='get__'.$name;
if (method_exists($this, $getter)){
return $this->$getter();
}
return (isset($this->props[$name])) ? $this->props[$name] : null;
}
/**
* Очень сложно вычисляемое поле, которое не обязательно дергать везде
*
* @return unknown
*/
function get__hard_calculate_field(){
return md5(md5(md5(microtime(true))));
}
}
//получили из БД список статей
$rows = array();
for($i=1; $i<5; $i++){
$row = array(
'article_name' => 'Новость '.$i,
'article_text' => 'Текст новости '.$i,
);
$rows[$i] = new Article_View_Item($row);
}
$tpl = tmpl_open('php_templates.tpl');
$item_scructure = tmpl_structure($tpl, '/item', TMPL_TAG, TMPL_SHORT);
foreach ($rows as $row) {
tmpl_context($tpl,'/item');
tmpl_iterate($tpl,'/item');
foreach ($item_scructure as $field) {
tmpl_set($tpl,$field,$row->$field);
}
}
print tmpl_parse($tpl);
print '<br />--------------------------<br />';
?>
PHP:
<tmpl:item>
<h1>{ARTICLE_NAME}</h1>
{article_text}
</tmpl:item>
PHP:
<?
class Article_View_Item extends Blitz{
//поля из
public $props = array();
function loadData($fields = array()){
$this->props = $fields;
}
function registerField($field){
$this->props[$field] = null;
}
protected function __get($name){
$getter='get__'.$name;
if (method_exists($this, $getter)){
return $this->$getter();
}
return (isset($this->props[$name])) ? $this->props[$name] : null;
}
public function __call($method, $params)
{
if (true == method_exists($this, 'get__'.$method)) {
return call_user_func_array(array(&$this, 'get__'.$method), $params);
}
return $this->$method;
}
/**
* Очень сложно вычисляемое поле, которое не обязательно дергать везде
*
* @return unknown
*/
function get__hard_calculate_field(){
return md5(md5(md5(microtime(true))));
}
function toArray(){
return $this->props;
}
}
//получили из БД список статей
$rows = array();
for($i=1; $i<5; $i++){
$row = array(
'article_name' => 'Новость '.$i,
'article_text' => 'Текст новости '.$i,
);
$item = new Article_View_Item();
$item->loadData($row);
$rows[$i] = $item;
}
$Template = new Article_View_Item('blitz.tpl');
foreach ($rows as $row) {
$Template->block('/item',$row->toArray());
}
echo $Template->parse();
?>
PHP:
{{ BEGIN item }}
<h1>{{ $article_name }}</h1>
{{ $article_text }}
{{ hard_calculate_field() }}
{{ END }}
Вызов через префикс "get__" оставил для возможности переключения шаблонизатора .
Может быть я просто не понял парадигмы этого шаблонизатора? Просветите, пожалуйста!