Если вы слышали о такой парадигме программирования как MVC (Model-View-Controller), то возможно знаете, что включать строки с HTML разметкой внутрь своего кода это очень плохо, как с точки зрения «читаемости», так и с точки зрения дальнейшей поддержки.
Не смотря на то, что Cotonti берет свое начало от LDU, где такое смешение было в порядке вещей, и местами HTML был вшит прямо в ядро, мы проектируя новое поколение движка, пстарались максимально от этого избавиться, предоставляя дизайнерам/разработчикам тем оформления и расширений максимум свободы по управлению разметкой конечной страницы.
Одним из этапов этой работы стал механизм строковых ресурсов (Resource Strings или сокращенно rc), который был представлен в Cotonti 0.7.0. Эта статья поможет разобраться в том, что это такое, как использовать этот механизм и перейти от «лапши» в коде к варианту MVC + RC.
Строковые ресурсы это просто строковые переменные PHP, которые предполагаетя использовать к конечном HTML коде (или ином виде) на страницах сайта. Основное отличие от простых строк заключается в том, что все они содержатся в глобальном массиве $R и физически отделены от кода ядра и расширений (вынесены в отдельные PHP файлы).
Набор стандартных предопределенных ресурсов располагается в файле system/resources.php. Если разработчику темы необходимо переопределить часть из них — он переопределяет их в файле themes/THEME_NAME/THEME_NAME.php. Разработчики расширений так же могут определить дополнительный набор (или переопределить текущий) в специальных файлах, который в свою очередь может быть переопределен установками темы оформления.
Массив $R (в глобальной области видимости) используется для хранения всех строковых ресурсов в системе, так же как массив $L используется для хранения языковых данных. Имена ключей назначаются по определенным правилам, с тем, чтобы поддерживать порядок и понятность кода. Первым в имени ключа идет префикс, указывающий на принадлежность к определенному расширению (например 'pfs_'). Ресурсы используемые в различных местах кода не имеют такого префикса и маркируются по типу ресурса: 'icon_', 'link_', 'code_' и т.д. Ниже приведен пример определения строки русурсов:
$R['pfs_icon_folder'] = '<img class="icon" src="themes/'.$theme.'/img/system/icon-folder.gif" alt="'.$L['Folder'].'" />';
Как мы видим эта строка задает HTML код часто используемого элемента и может использовать для этого глобальные системные переменные, такие как $L, $theme, $cfg, $usr и пр.
Вот небольшой список типов часто используемых строковых ресурсов:
Многие строковые ресурсы, как например, иконки являются статичными: вы определяете их единожды и используете в том виде, в котором они определены. Описанная выше строка $R['pfs_icon_folder']
это пример статического ресурса. В PHP коде вы используете ее как обычную строку, например:
$some_folder = $R['pfs_icon_folder'] . $something;
Также она может быть использована и в TPL шаблонах:
<a href="/some/folder">{PHP.R.pfs_icon_folder} {FOLDER_NAME}</a>
Тем не менее, часто требуется определить стандартные элементы, которые могут или должны меняться во время выполнения скрипта. Такие строковые ресурсы назовем динамическими. Вот пример динамического ресурса:
$R['pfs_icon_type'] = '<img class="icon" src="images/pfs/{$type}.gif" alt="{$name}" />';
Бо́льшая часть остается неизменной (статичной), но в части строки используются, так называемые, переменные подстановки, типа {$var_name}, аналогичные тем, что можно встретить в PHP строках и некоторых шаблонизаторах. Будте внимательны и используйте для определения таких строк одинарные кавычки, иначе эти «переменные» будут восприняты скриптом как обычные переменные PHP, а это не совсем то, что нам нужно.
К сожалению, использовать такие динамические строковые ресурсы в шаблоне в полной мере не получится, т.к. они зависят от области выполнения потому, что используют специальную функцию для подстановки cot_rc()
. Вот как обычно это делается:
$some_icon = cot_rc('pfs_icon_type', array('type' => $type, 'name' => $name));
Или еще проще, если мы находимся в глобальной области видимости и переменные $type и $name определены в ней:
$some_icon = cot_rc('pfs_icon_type');
По умолчанию функция cot_rc()
ищет целевую строку в глобальном массиве $R по заданному индексу. Но вы можете задать ресурсную строку и напрамую, передав ее в функцию вместо индекса:
$something = cot_rc('Every <b>{$pet}</b> likes <i>{$food}</i>', array('pet' => 'dog', 'food' => 'meat'));
Вторым параметром передается ассоциативный массив для динамической подстановки. Если cot_rc()
обнаруживает переменную подстановки {$var_name} и в переданном массиве нет, соответствующего ей ключа 'var_name', функция испольузет значение переменной $var_name из глобальной области видимости.
Для параметров подстановки также доступен укороченный формат, в виде строки с параметрами запроса:
$some_icon = cot_rc('pfs_icon_type', "type=$type&name=$name"));
Используйте упрощенный вариант задания параметров когда, значения подстановки не содержат символов '=', '&' или другую сложную разметку.
Вы можете часто увидеть такое в коде:
$out = '<a href="' . cot_url('mod', 'arg1=val1&arg2=val2') . '" title="' . $title . '">' . $text . '</a>';
Мы можем использовать для таких строк динамические ресурсы и функцию cot_rc()
, но это не сильно сократит код. Для подобных случаев есть функция cot_rc_link()
, генерирующая ссылки на лету. Давайте запишем предыдущий пример с ее использованием:
$out = cot_rc_link(cot_url('mod', 'arg1=val1&arg2=val2'), $text, array('title' => $title));
Конечно нет предела совершенству, и вариант сделай_мне_красиво()
смотрелся бы лучше, но, тем не менее, мы применили механизм динамических ресурсов и очистили наш код от жестко запрограммированного HTML кода. Так что, фанатичные поборники стандартов должны быть довольны.
Описание функции достаточно простое. Первый параметр — это URL (использование cot_url()
предпочтительно). Второй — содержимое (код) тега (тут можно использовать строку из массива $R, функцию cot_rc()
или что-то еще). Третий параметр не обязательный и принимает список дополнительных аттрибутов тега, в виде ассоциативного массива или строки (экранирование специальных символов HTML и очистка от мусора в данном случае забота кода из которого осуществляется вызов).
На последок, когда вы уже знакомы с механизмом строковых ресурсов несколько рекомендаций тем, кто решит в итоге избавляться от использования HTML в своем PHP коде. Эти советы немного выходят за рамки только строковых ресурсов, тем не менее кратко их осветим: