доступ к переменным смарти в {INSERT}

Alexandre

PHPПенсионер
доступ к переменным смарти в {INSERT}

в шаблоне есть вызов инсерта {insert name="getbanner" type=4 } который вызывает функцию insert_getbanner( ... );

Каким образом я смогу в функции insert_getbanner( ... ) получить доступ к переменным смарти?
есть ли возможность установить новые значения переменным из функции?

-~{}~ 21.11.05 18:45:

можно передать переменную смарти insert_getbanner( &tmp ); - сам объект передается

но в теле функциикогда делаю ассигн, то он не отрабатывает.
PHP:
insert_getbanner(   &$tmp ){
.... 
$tmp ->assign( 'new_var' , 1);
}
пытался использовать глобальные переменные - но не получается.

Задача состоит в том, что в insert_getbanner вычисляется некая переменная, которая должна быть передана в шаблон.
 

Alexandre

PHPПенсионер
А отдельно почему нельзя вычислить переменную, заранее?
алгоритм такой, и не мной придуман. Выход как я вижу один - избавляться от {insert }, чего бы мне не хотелось делать, так как рушится некая логическая структура.
 

kost

Новичок
Можно сделать
$smarty->assign('smarty', $smarty)
а потом передать ее в качестве параметра в функции вставки.

А еще можно сделать $smarty глобальной.
 

Alexandre

PHPПенсионер
$smarty->assign('smarty', $smarty)
а потом передать ее в качестве параметра в функции вставки
я передаю его в качества параметра
Код:
insert_getbanner(   &$smarty ){ 
.... 
$smarty ->assign( 'new_var' , 1); 
print_r( $smarty  );  // проверяем на то, что передается объект смарти
}
но не получается.
если сделать вывод в коде print_r( $smarty ), то выведется всесь объект смарти.
 

kvf77

Red Devil
Alexandre

а почему в инсерт не пердавать нужный тебе параметр:

{insert name="getbanner" type=4 additional_param=$param}

после чего в функции insert будет в массиве $params нужные тебе данные
 

crocodile2u

http://vbolshov.org.ru
Может, я чего недопонял, но\ вот пример из мануала смарти:

PHP:
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File:     function.assign.php
* Type:     function
* Name:     assign
* Purpose:  assign a value to a template variable
* -------------------------------------------------------------
*/
function smarty_function_assign($params, &amp;$smarty)
{
    extract($params);

    if (empty($var)) {
        $smarty->trigger_error("assign: missing 'var' parameter");
        return;
    }

    if (!in_array('value', array_keys($params))) {
        $smarty->trigger_error("assign: missing 'value' parameter");
        return;
    }

    $smarty->assign($var, $value);
}
?>
void smarty_function_name (array $params, object &$smarty)

Все атрибуты, передаваемые в функции шаблона из самого шаблона, хранятся в $params в виде ассоциативного массива. Получить доступ к его значениям можно напрямую: $params['start'] или используя extract($params) для импорта в таблицу.

Вывод (возвращаемое значение) функции будет подставлен в место расположения тега функции в шаблоне (функция fetch() например). В качестве альтернативы, функция может выполнять какие либо действия без какого-либо вывода (assign() функция).

Если функция должна присвоить(assign) значения некоторым переменным в шаблоне или использовать иные возможности Smarty, то можно работать с объектом $smarty как обычно.
 

Alexandre

PHPПенсионер
а почему в инсерт не пердавать нужный тебе параметр:
не получается так, т.к параметр вычисляется как раз в этой функции, а значение, полученное в этой функции влияет на отображение других шаблонов. Когда предыдущий программист проектировал - то этого функционала не предусматривлся.
 

crocodile2u

http://vbolshov.org.ru
Alexandre
Любой плагин смарти имеет возможность манипулировать объектом смарти, тк он передается в функцию плагина по ссылке вторым параметром.

-------------------------------------------------------------
PHP:
<?php

header("Content-Type: text/plain; charset=iso-8859-1");

require_once("/pear/Smarty/Smarty.class.php");

$smarty = new Smarty();
$smarty->compile_dir = "./smarty/templates_c";

$smarty->register_function('test', 'test');

/**
 * test plugin
 *
 * @param array $params
 * @param Smarty $smarty
 */
function test($params, &$smarty) {
	$smarty->assign('sample', 'The value of variable "$sample" changed by ' . __FUNCTION__);
}

$smarty->assign('sample', 'This is the initial value of variable "$sample"');

$smarty->display(dirname(__FILE__) . "/test.tpl");

?>
темплейт:
---------------
{$sample}

{test}

{$sample}
--------------

Вывод:

This is the initial value of variable "$sample"



The value of variable "$sample" changed by test
 

Alexandre

PHPПенсионер
crocodile2uу меня немного другая ситуация,

темплейт начинает парсится, и в том месте где надо определить кол-во колонок вывода в зависимости от ширины банера, еще не определен тип банера, так как он определяется позже (по ходу парсинга шаблона) , т.е. функция вывода банера ( insert_getBanner () ) отрабатывает позже чем используется переменная $banerType содержащая кол-во выводимых колонок....

В результате, я переделал инсерт на простой шабон и вместо
{insert getBanner} просто заменил на {$banner}
а функцию insert_getBanner вынес в другой инклуд... с небольшой переработкой кода.
 
Сверху