Время от времени, а точнее, чуть ли не каждый день, приходится заниматься программированием, что меня очень радует. И вот в одно прекрасное осеннее утро… я решил оптимизировать работу с движком Smarty. Очень часто в своих шаблонах мне приходится работать с константами из PHP. Smarty для этого предлагает 2 стандартных решения.
Первый способ — использовать конструкцию вида {$smarty.const.константа}, но такой код выглядит весьма не читаемо, особенно когда в каждой строчке используется по нескольку констант.
Второй способ — каждую нужную константу инициировать в Smarty с помощью $smarty->assign(‘константа’, константа);. Такой способ вообще извратный, ибо иногда приходится использовать до сотни констант, и вот так объявлять их никакого терпения не хватит. В результате я придумал ещё 2 интересных способа обода этой проблемы.
Итак, способ #1 – создать функцию-обёртку для объявления констант:
function _def($name, $value) {
define($name, $value);
$smarty->assign($name, $value);
}
И все штатные вызовы PHP функции define(‘имя’, ‘значение’); заменить на _def(‘имя’, ‘значение’);. Таким образом значение сразу становится константой и инициируется в Smarty. Но этот способ мне не подошёл, т.к. мой движок успевает наобъявлять множество нужных констант ещё до объявления Smarty. Поэтому пришла идея создавать стек/массив констант и при рендеринге шаблона загонять их в Smarty. Но зачем изобретать то, что уже реализовано стандартными средствами PHP?
Способ #1. Поприветствуем функцию get_defined_constants()! Эта малышка возвращает список всех констант, объявленных в PHP. Лёгким движением руки и $smarty->assign(‘def’, get_defined_constants()); херня {$smarty.const.константа} превращается в элегантное {$def.константа}. То есть теперь придётся писать всего 3 символа вместо 12! А для особо ленивых можно сократить всего до 1 символа. Можно пойти ещё дальше, если функции передать параметр тру — get_defined_constants(true), то она вернёт все константы в виде многомерного массива с группировкой.
$defined_constants = get_defined_constants(true);
$smarty->assign('def', $defined_constants['user']);
В итоге в переменной $def окажутся только те константы, которые были объявлены в скриптах.