Строковые ресурсы и массив $R

Давайте выкинем HTML из своего кода!

#1. Введение

Если вы слышали о такой парадигме программирования как  MVC (Model-View-Controller), то возможно знаете, что включать строки с HTML разметкой внутрь своего кода это очень плохо, как с точки зрения «читаемости», так и с точки зрения дальнейшей поддержки. 

Не смотря на то, что Cotonti берет свое начало от LDU, где такое смешение было в порядке вещей, и местами HTML был вшит  прямо в ядро, мы проектируя новое поколение движка, пстарались максимально от этого избавиться, предоставляя дизайнерам/разработчикам тем оформления  и расширений максимум свободы по управлению разметкой конечной страницы.

Одним из этапов этой работы стал механизм строковых ресурсов (Resource Strings или сокращенно rc), который был представлен в Cotonti 0.7.0. Эта статья поможет разобраться в том, что это такое, как использовать этот механизм и перейти от «лапши» в коде к варианту MVC + RC.
 

#2. Строковые ресурсы в целом

Строковые ресурсы это просто строковые переменные 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 и пр.

Вот небольшой список типов часто используемых строковых ресурсов:

  • code_ - простой кусок HTML/JavaScript кода
  • icon_ - определение кода иконок
  • input_ - поле ввода данных в форму
  • link_ - ссылка, может быть динамическая ссылка

 

#3. Статичные и динамичные строковые ресурсы

Многие строковые ресурсы, как например, иконки являются статичными: вы определяете их единожды и используете в том виде, в котором они определены. Описанная выше строка $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"));

Используйте упрощенный вариант задания параметров когда, значения подстановки не содержат символов '=', '&' или другую сложную разметку.
 

#4. Создание ссылок

Вы можете часто увидеть такое в коде:

$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 и очистка от мусора в данном случае забота кода из которого осуществляется вызов).

#5. Рекомендации для разработчиков

На последок, когда вы уже знакомы с механизмом строковых ресурсов несколько рекомендаций тем, кто решит в итоге избавляться от использования HTML в своем PHP коде. Эти советы немного выходят за рамки только строковых ресурсов, тем не менее кратко их осветим:

  1. Используйте строковые ресурсы как небольшие часто используемые шаблоны, например для таких элементов интерфейса, как: иконки, кнопки, поля ввода данных и т.п.
  2. Назначайте своим элементам персональные CSS классы.
  3. Старайтесь придерживаться принципа максимальной простоты, и не используйте динамические ресурсы для массивных блоков кода.
  4. Такие элементы как таблицы, списки и другие структурные элементы дизайна/компоновки страницы должны распологаться в  файлах шаблонов (TPL), но не в строковых ресурсах.


Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям