В Smarty3 вызов функции шаблона, определенной тегом {function}, из функции плагина - PullRequest
1 голос
/ 05 февраля 2012

Smarty {call} встроенная функция может вызывать функцию шаблона, определенную тегом {function}.Теперь мне нужно вызвать функцию шаблона, но внутри функции плагина , потому что я знаю только имя функции внутри плагина.

Функция плагина:

<?php

$smarty->registerPlugin('function', 'form_label', 'renderFormLabel');

function renderFormLabel($form, \Smarty_Internal_Template $template) {

    // find out which function to call based on the available ones
    $function = lookupTemplateFunction($template);

    $args = $form->getVariables();

    // How to call the Smarty template function with the given $args?
    // $html = $template->smarty->???($args); 

    //return $html;
}

Шаблон:

<form action="submit.php" method="post">
    {form_label}
    ....
</form>

Это попытка поддержать Symfony2 Forms in SmartyBundle .Каждый фрагмент формы представлен функцией Smarty.Чтобы настроить любую часть отображения формы, пользователю просто нужно переопределить соответствующую функцию.

Ответы [ 3 ]

3 голосов
/ 05 февраля 2012

Возможно вызывать функции шаблона изнутри плагинов.Но изначально мы планировали эту опцию, поэтому в настоящее время API отличается, если кеширование включено или нет.Это может измениться и в будущих версиях.

Предположим, что вы хотите сделать что-то похожее на {call name = test world = 'hallo'} из плагина:

if ($template->caching) {
   Smarty_Internal_Function_Call_Handler::call ('test',$template,array('world'=>'hallo'),$template->properties['nocache_hash'],false);
} else {
   smarty_template_function_test($template,array('world'=>'hallo'));
}

Обратите внимание, чтоФункция шаблона вызывается в контексте шаблона, который вызвал плагин.Все переменные шаблона, известные в вызывающем шаблоне, автоматически известны внутри функции шаблона.

Функции шаблона не возвращают вывод HTML, а помещают его непосредственно в выходной буфер.

2 голосов
/ 06 февраля 2012

Я должен был быть более конкретным в своем первом ответе.Код для renderFormLabel должен выглядеть следующим образом:

function renderFormLabel($form, \Smarty_Internal_Template $template) {

    // find out which function to call based on the available ones
    $function = lookupTemplateFunction($template);

    if ($template->caching) {
        Smarty_Internal_Function_Call_Handler::call ('test',$template,$form,$template->properties['nocache_hash'],false);
    } else {
        smarty_template_function_test($template,$form);
    }
}

В этом случае атрибуты (параметр), передаваемые плагину renderFormLabel массивом $ form, будут рассматриваться как локальные переменные шаблона внутри функции шаблона.

1 голос
/ 06 февраля 2012

Насколько я понимаю, вам нужно вызвать именованный метод с заданными известными аргументами.

Почему бы не использовать call_user_func_array звонок как:

call_user_func_array(array($template->smarty, $function), $args);
...