2012-07-03 2 views
1

В Smarty, я сталкиваюсь с такой HTML-код **Как повторно использовать код в smarty engine?

{section name=listAll loop=$scope} 
(input id="a1" name="from"/> 
(input id="b1" name="from"/> 
(input id="c1" name="from"/> 
{/section} 

{section name=listAll loop=$scope} 
(input id="a2" name="from"/> 
(input id="b2" name="from"/> 
(input id="c2" name="from"/> 
{/section} 

{section name=listAll loop=$scope} 
(input id="a3" name="from"/> 
(input id="b3" name="from"/> 
(input id="c3" name="from"/> 
{/section} 

Могу ли я передать его функции, как следующие:.

 function RenderControl($i) 
     { 
     return ' 
     {section name=listAll loop=$scope} 
     (input id="a$i" name="from"/> 
     (input id="b$i" name="from"/> 
     (input id="c$i" name="from"/> 
     {/section} 
     } '; 

Затем вызовите его в TPL файл как:

{RenderControl i=1} 
    {RenderControl i=2} 
    {RenderControl i=3} 

Почему следующее не может работать на smarty tpl? $ Smarty-> register_function ('RenderHtml', 'RenderHtml'); функция RenderHtml ($ params) {extract ($ params); // $ html = '{include file = "tke-pre_bid_scopeworkModules/Section1_Factory_to_Price_Optional_Configurat ion.tpl"}'; return $ html; }

{RenderHtml Num = 12}

ответ

1

Вы можете http://www.smarty.net/docs/en/advanced.features.prefilters.tpl для того, чтобы обеспечить код получает оценку до обработки, так что вы можете сделать, как в вашем примере.

Вы также можете посмотреть на http://www.smarty.net/docs/en/plugins.tpl

(выше для Smarty 3)

+0

почему следующее не может работать за $ smarty-> register_function Smarty TPL ('RenderHtml', 'RenderHtml'); \t функция RenderHtml ($ params) { \t \t экстракт ($ params); \t \t \t \t // \t \t $ HTML = '\t {включаемый файл = "ТКЕ-pre_bid_scopeworkModules/Section1_Factory_to_Price_Optional_Configuration.tpl"}'; \t \t return $ html; \t} – user1490474

+0

Что произойдет, если вы раскомментируете строку '$ html = ...'? Кроме того, я считаю, что функции шаблонов могут быть пост-оценены, поэтому вам может понадобиться предварительный фильтр, если вы хотите ввести текст, который оценивается как код Smarty. –

2

Вы можете искать {function}, который позволяет вам определить простые многоразовые текстовые генераторы внутри ваших шаблонов:

{function name=controls i=0} 
    (input id="a{$i}" name="from"/> 
    (input id="b{$i}" name="from"/> 
    (input id="c{$i}" name="from"/> 
{/function} 

{controls i=1} 
{controls i=2} 
{controls i=3} 

в зависимости от структуры ваших ресурсов, вы, возможно, даже как somenthing вдоль линий

{function name=controls i=0} 
    {$fields = ["a", "b", "c"]} 
    {foreach $fields as $field} 
    (input id="{$field}{$i}" name="from"/> 
    {/foreach} 
{/function} 

Это функция Smarty3. У Smarty2 нет функций шаблона. Вы можете извлечь содержимое вышеупомянутой функции {function} в отдельный файл и {include file="controls.tpl" i=1}. Или, как сказал Бретт, напишите для него функцию плагина.


Вторая часть вашего вопроса относительно следующий код

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

function RenderHtml($params){ 
    extract($params); 
    $html= '{include file="tke-pre_bid_scopeworkModules/Section1_Factory_to_Price_Optional_Configurat‌​ion.tpl"}'; 
    return $html; 
} 

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

function RenderHtml($params, &$smarty){ 
    // create new smarty instance 
    $t = new Smarty(); 
    // copy all values to new instance 
    $t->assign($smarty->get_template_vars()); 
    // overwrite whatever was given in params 
    $t->assign($params); 
    // execute the template, returning the generated html 
    return $t->fetch('tke-pre_bid_scopeworkModules/Section1_Factory_to_Price_Optional_Configurat‌​ion.tpl'); 
} 
Смежные вопросы