Присвоить значение переменной в одной строке с помощью Smarty 2

Я использую Smarty 2 и хотел бы знать, есть ли лучший / более удобный способ использования assign установить значение evenRow на одной строке, а не на 5 строк ниже.

{if $evenRow == 'on'}
   {assign var='evenRow' value='off'}
{else}
   {assign var='evenRow' value='on'}
{/if}

Учитывая, что Smarty может быть довольно тесно связан с PHP в местах, я удивлен, что это не так легко найти в Интернете, поскольку сделать что-то подобное в PHP было бы просто.

3 ответа

Вы не можете сделать присвоение чем-то иным, чем присвоение.

Не используйте присвоить. Используйте цикл.

{cycle  assign='evenRow' values="off,on"}

Я создал плагин для этого:

modifier.choice.php

function smarty_modifier_choice()
{
    $no_choice="";
    $args=func_get_args();
    $patro=$args[0];
    $numconds=sizeof($args)-1;


    if ($numconds%2) {$no_choice=$args[$numconds];}

    for ($i=1;$i<$numconds; $i+=2)
    {
        if ($patro==$args[$i]) {return $args[$i+1];}
    }
    return $no_choice;
}

сохраните его в папке smarty/plugins и используйте его так:

{$variable|choice:'1':'one':'2':'two':'3':'three':'another number'}

если последняя строка непарная, предполагается, что это значение по умолчанию, но вы также можете использовать модификатор по умолчанию:

{$variable|choice:'1':'one':'2':'two':'3':'three'|default:'another number'}

поэтому, если переменная $ равна "1", она вернет "один", а если "6" вернет "другой номер"

в вашем случае это будет выглядеть так:

{assign var='evenRow' value=$evenRow|choice:'on':'off':'on'}

Из документации Smarty (Smarty 3):

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

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

{assign var=test_var value=!empty($some_input)}

Для более сложных примеров вы можете написать свой собственный модификатор:

function smarty_modifier_do_something_complex($input) {
  // Process input and return value
}

и используйте это так:

{assign var=test_var value=$some_input|do_something_complex}

Или вы можете придерживаться более многословно {if} … {else} … {/if} подход.

Другие вопросы по тегам