PHP « Аналог include функции SMARTY, которую можно вызвать из php кода
Пишу smarty плагин-функцию, которая должна подставлять в шаблоны поля формы.
{input name="email"}
По суте плагин будет более коротким аналогом
{include file="text.tpl" class="input" caption="Ваш email" name="email" requred=true}
Но file,class,name,caption будут выниматься из массива с настройками формы.
Каким образом можно сделать $smarty->fetch шаблона с полем формы, при этом передав туда значения file,class и.т.п. видимые только для этого шаблона?
В проекте используется smarty 2
{input name="email"}
По суте плагин будет более коротким аналогом
{include file="text.tpl" class="input" caption="Ваш email" name="email" requred=true}
Но file,class,name,caption будут выниматься из массива с настройками формы.
Каким образом можно сделать $smarty->fetch шаблона с полем формы, при этом передав туда значения file,class и.т.п. видимые только для этого шаблона?
В проекте используется smarty 2
1 ответов
Решил проблему проверкой существования переменной-параметра в $smarty->_tpl_vars, и занесением её в либо в список на дальнейшее удаление, либо в список с прежним значением. Далее просто асигнел значение, делал fetch шаблона и циклами удалял переменные из списка к удалению и восстанавливал значения из списка для восстановления.
Когда вы вызываете в smarty свой plugin, например:
{input type="text" name="email"}
В его функцию передаются два атрибута, $params и $smarty, переменные (type, name) будут доступны в $params, и в коде функции можно передать их в шаблон:
В его функцию передаются два атрибута, $params и $smarty, переменные (type, name) будут доступны в $params, и в коде функции можно передать их в шаблон:
$smarty->assign('params', $params);
Затем можно получить сам шаблон, в котором будут доступны нужные значения в массиве params.
Например:
function get_input($params, $smarty) {
$smarty->assign('params', $params);
$field = $smarty->fetch('input_field.tpl');
return $field;
}
input_field.tpl:
<input type="{$params.type}" name="{$params.name}" />
Затем можно получить сам шаблон, в котором будут доступны нужные значения в массиве params.
Например:
function get_input($params, $smarty) {
$smarty->assign('params', $params);
$field = $smarty->fetch('input_field.tpl');
return $field;
}
input_field.tpl:
<input type="{$params.type}" name="{$params.name}" />
{input file="text.tpl" class="input" caption="Ваш email" name="email" requred=true}
// .....
function input($params, $smarty)
{
$smarty->assign($params);
return $smarty->fetch($params['file']);
}
// ....
<input type="{$type" name="{$name}" .... />
Может как-то так?
Ещё есть такой вариант:
Регистрируем:
function get_input_field($params, $smarty) {
$template = $smarty->createTemplate('input_field.tpl');
$template->assign($params);
return $tpl->display();
}
$smarty->registerPlugin('function', 'get_input_field', 'get_input_field');
input_field.tpl:
<input {if !empty($type)}type="{$type}"{/if} {if !empty($name)}name="{$name}"{/if} {if !empty($required)}required="required"{/if} />
Проверяем:
{get_input_field type="text" required=true}
{get_input_field type="text"}
Результат:
<input type="text" required="required">
<input type="text">
В итоге передаваемые переменные (type, name, required, и д.р.) будут видны только в конкретном экземпляре input_field.tpl