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

1 ответов


Решил проблему проверкой существования переменной-параметра в $smarty->_tpl_vars, и занесением её в либо в список на дальнейшее удаление, либо в список с прежним значением. Далее просто асигнел значение, делал fetch шаблона и циклами удалял переменные из списка к удалению и восстанавливал значения из списка для восстановления.


Когда вы вызываете в smarty свой plugin, например:

{input type="text" name="email"}
В его функцию передаются два атрибута, $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}" />
 


{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