Это:
{1234|count_characters}
Выходы:
4
Хорошо. Но это:
{if 12345|count_characters == 4}
it's 4
{/if}
выходы it's 4
, Вышеприведенное утверждение if должно быть очевидно ложным. Почему это всегда оценка истины?
count_characters
Модификатор smarty просто показывает количество символов в строке или числе:
http://www.smarty.net/docsv2/en/language.modifier.count.characters.tpl
Поскольку {x|y}
синтаксис умный шорткод для echo y(x)
…. где echo
значительный
Тем не мение, {if y|x ==4 }
является эквивалентом побитового выполнения or
(|
) на x
а также y
(12345|count_characters
это правда, потому что 12345
это правда, хотя count_characters
будет проверяться как константа, и если константа не существует, то как строковый литерал, при выдаче уведомления), сравнивая результат этой операции с 4
(true == 4 с произвольной типизацией), а затем, если true, и т. д.
Smarty не является языком программирования; это шаблонный язык разметки. Вы взяли выходной фильтр и попытались использовать его как функцию общего назначения в условии. Это не сработает.
Вы должны сохранить такую логику в PHP-скрипте.
Проблема здесь в том, как вы используете это.
Если в PHP вы назначаете эту переменную:
$smarty->assign('var',12345);
И используйте этот код (один дополнительный, если нужно убедиться, что он работает как надо):
{if $var|count_characters == 4}
it's 4
{elseif $var|count_characters == 5}
it's 5
{/if}
вы получите в качестве вывода it's 5
— так, как это должно быть.
Если вы ничего не назначаете в PHP, но назначаете это в Smarty, как показано в следующем коде:
{assign var="var" value="12345"}
{if $var|count_characters == 4}
it's 4
{elseif $var|count_characters == 5}
it's 5
{/if}
ты получишь it's 5
— так, как это должно быть.
Как упоминал @MarkBaker, когда вы использовали 12345|count_characters
код вычисляется с помощью побитового оператора, функция count_characters
на самом деле это не функция — она никогда не запускается, вы можете написать здесь что угодно, например:
{if 12345|count_charact87172368716832ers == 4}
it's 4
{/if}
и вы получите it's 4
даже если явно нет count_charact87172368716832ers
модификатор.
Чтобы заставить его работать так, как вам нужно, вы должны либо назначить переменную в PHP (как я показал в первом коде), либо назначить переменную в Smarty (как я показал во втором коде), либо использовать count_characters
модификатор на строку, а не на int:
{if '12345'|count_characters == 4}
it's 4
{elseif '12345'|count_characters == 5}
it's 5
{/if}
этот код будет работать как положено — вы получите it's 5