2013-09-08 2 views
1

У меня есть функция для Smarty:Smarty false верно?

function smarty_function_false_() { 
    return false; 
} 

тогда, если я:

{if false_} false YES?? {else} false no {/if} <br> 
{if not false_} not false yes {else} not false NO??? {/if} 

И Evals к:

false YES?? 
not false NO??? 

Я новичок в Smarty, почему это происходит?

ответ

2

Выражение Smarty {if false_} не оценивает никаких функций. Это эквивалентно {if 'false_'}, что в свою очередь совпадает с выражением PHP if ('false_'). (Кстати, if (false_) в PHP также означает то же самое, если вы не запустили define('false_', ...).)

Под «Манипуляции» правила РНР, строка интерпретируется как логическое значение является true тех пор, пока это не пустая строка (''). Таким образом, {if false_} эквивалентен {if true}.

A Smarty "template function" предназначен только для того, чтобы быть вызванным самостоятельно и возвращать что-то для вывода на шаблон, например. {false_}.

Самый простой способ иметь обратный вызов, который вы можете проверить внутри условия {if}, состоит в том, чтобы определить "modifier", а не «функцию». Хотя модификатор всегда будет дано по крайней мере, один параметр, его можно просто игнорировать, так что вы могли бы иметь следующее:

function smarty_modifier_false_($whatever) { 
    return false; 
} 

, а затем в Smarty просто передать любую старую строку, как слева от модификатора:

{if ''|false_} false_ is true!? {else} false_ is false. How reassuring. {/if} 

Альтернативные подходы:

  • Установите параметры безопасности в шаблоне таким образом, что вы можете написать {if false_()}, потому что false_ это PHP функция позволила ди прямо в шаблонах. (См. documentation on {if}, где он ссылается на the details of Security.)
  • Зарегистрировать block function. Это немного сложнее написать, но позволит вам иметь свой собственный обычай, если замена, например. {if_false_} This text never appears {/if_false_}.
+0

Я думаю, что на самом деле проще определить простую функцию (т. Е. 'False_' вместо' smarty_modifier_false_', а затем зарегистрировать ее и использовать). – raina77ow

+0

Oh:/Так есть ли способ иметь '{if testSomething}' формат? Или какой самый лучший формат для проверки bool? Потому что '{if '' | userLoggedIn} кажется странным. –

+0

@ raina77ow Я не понимаю вас, или вы меня не понимаете? Регистрация его как функции Smarty - это то, что OP пытался, и он не работает, потому что это не так, как определяется тег '{if}. – IMSoP