Время от времени, а точнее, чуть ли не каждый день, приходится заниматься программированием, что меня очень радует. И вот в одно прекрасное осеннее утро… я решил оптимизировать работу с движком 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 окажутся только те константы, которые были объявлены в скриптах.

Опубликовано 08.11.2010в 12:57. В рубриках: PHP. Вы можете следить за ответами к этой записи через RSS 2.0. Вы можете оставить свой отзыв или трекбек со своего сайта.

Оставьте отзыв

Это не спам.
сделано dimoning.ru