Присвоить значение переменной в одной строке с помощью 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}
подход.