Функции темизации – это функции, генерирующие HTML-код, который впоследствии показывается пользователю.
Функции темизации – это функции, генерирующие HTML-код, который впоследствии показывается пользователю. Особенность таких функций в том, что, во-первых, они не должны реализовывать никакой бизнес-логики, т. е. в их задачи входит только генерирование HTML-кода на основе полученных аргументов. Во-вторых, эти функции могут быть переопределены разработчиком сайта без редактирования кода модуля, путем изменения файла template.php или создания файла-шаблона.
В нашем случае массив данных формируется функцией currencies_contents(), а HTML-код создается функцией theme_currencies_block(), которую нам сейчас предстоит определить и зарегистрировать. Подчеркну, что вызов любой функции темизации осуществляется через вызов функции-обертки с именем theme(), т. е. функция theme_currencies_block($argument) должна вызываться как theme('currencies_block', $argument). Чем вызвана эта необходимость, я объясню чуть позже.
Для регистрации функций темизации, используемых в модуле, мы должны реализовать hook_theme, который возвращает массив имен применяемых функций темизации и принимаемых ими параметров. В нашем модуле будет использоваться одна функция темизации theme_currencies_block(), которая на вход принимает один обязательный аргумент – массив курсов валют, поэтому реализация хука hook_theme будет выглядеть так:
function currencies_theme() {
return array(
'currencies_block' => array(
'arguments' => array('result' => NULL),
),
);
}
Без такой регистрации вызов theme('currencies_block', $argument) будет невозможен. Сама функция темизации будет такой:
function theme_currencies_block($result) {
$output = "<ul>";
foreach($result as $k => $v) {
if($v["diff"] > 0) {
$color = "#5aaf43";
$v["diff"] = "+" . $v["diff"];
}
else if($v["diff"] < 0) $color = "#f00";
else if($v["diff"] == 0) $color = "#00f";
$output .= "<li>" . $v["nominal"] . " " . $v["name"] . " = "
. $v["value"] . " (<span style="color: " . $color . "">"
. $v["diff"] . "</span>)</li>";
}
$output .= "</ul>";
return $output;
}
Еще раз обратите внимание на то, что в функции currencies_theme в качестве имени функции темизации указывается название currencies_block, а реализация ее имеет имя theme_currencies_block(). Нужно это, чтобы в дальнейшем разработчики сайтов, использующие наш модуль, могли переопределить эту функцию, т. е. изменить формируемый ею HTML-код. Для этого им в папке со своей темой в файле template.php достаточно будет создать функцию с именем, совпадающим с именем функции темизации, но в котором слово theme заменено на название используемой темы оформления, т. е. создать функцию название_темы_оформления_currencies_block(). Ядро Drupal, когда встретит в коде модуля вызов вида theme('currencies_block', $result), сначала попробует найти функцию темизации в файле template.php используемой в данный момент темы оформления, и только если там ее не найдет, использует функцию theme_currencies_block().
Ядро Drupal пытается найти функцию темизации в файле template.php используемой в данный момент темы оформления.
В случае больших шаблонов удобнее вынести функцию темизации из файла template.php в отдельный файл. Для этого в массиве, возвращаемом реализацией хука hook_theme, нужно добавить элемент с ключом template и именем, соответствующим имени файла-шаблона, а в каталоге с модулем разместить файл-шаблон с указанным ранее именем и расширением .tpl.php. В итоге hook_theme() примет вид:
function currencies_theme() {
return array(
'currencies_block' => array(
'arguments' => array('result' => NULL),
'template' => 'cur-block',
),
);
}
а в папке с модулем нужно разместить файл с именем cur-block.tpl.php и таким содержимым:
<ul>
<?php
foreach($result as $k => $v) {
if($v["diff"] > 0) {
$color = "#5aaf43";
$v["diff"] = "+" . $v["diff"];
}
else if($v["diff"] < 0) $color = "#f00";
else $color = "#00f";
print "<li>" . $v["nominal"] . " " . $v["name"] . " = " .
$v["value"] . " (<span style="color: " . $color . "">" .
$v["diff"] . "</span>)</li>";
}
?>
</ul>
Теперь, чтобы переопределить вывод данных, формируемых модулем Currencies, разработчику достаточно скопировать файл cur-block.tpl.php из папки с модулем в папку с используемой темой оформления и внести в него необходимые изменения.
Интерфейс пользователя
Сейчас наш модуль имеет интерфейс администратора, умеет автоматически соединяться с удаленным сервером, получать необходимую информацию, формировать из нее HTML-код и сохранять его в кэше. Осталась самая простая для программиста и наиболее значимая для посетителя сайта часть – вывод данных на экран.
Для решения этой задачи мы могли бы через созданную ранее функцию currencies_menu() зарегистрировать еще один путь и в качестве параметра page callback указать функцию currencies_contents(), которая получила бы необходимые данные (из кэша или от удаленного сервера) и вывела бы их на экран через функцию темизации. Но мы хотим, чтобы курсы валют выводились не отдельной страницей, а в блоке (оформленный особым образом элемент, содержащий данные) на любой заданной администратором сайта странице. Для этого необходимо создать реализацию хука hook_block() (см. листинг 4).
Листинг 4
function currencies_block($op = 'list', $delta = 0,
$edit = array()) {
switch ($op) {
case 'list':
$blocks[0] = array(
'info' => t('Currencies block'),
);
return $blocks;
case 'view':
switch ($delta) {
case 0:
$block['subject'] = t('Currencies block');
$block['content'] = currencies_contents();
break;
}
return $block;
}
}
Параметр $op (сокращение от operation), содержит информацию о том, какая операция над блоком в данный момент выполняется. Значение list сообщает модулю, что информация о нем выводится в списке модулей, здесь мы должны передать ядру Drupal один обязательный параметр – заголовок модуля и ряд необязательных параметров, информацию о которых можно найти в документации.
Значение view аргумента $op означает, что пользователь просматривает страницу, на которой должен быть отображен наш блок, и модуль обязан вернуть его содержимое. Для этого функция должна сформировать и выдать ассоциативный массив, элемент с ключом content которого будет использован в качестве содержимого блока, а необязательный элемент с ключом subject – заголовка.
Каждый модуль может создавать несколько блоков, параметр $delta хука hook_block содержит индекс обрабатываемого в текущий момент блока.
Все, разработка модуля завершена! Теперь администратор сайта, после инсталляции модуля Currencies, может активировать созданный им блок, для этого необходимо перейти в меню Administer – Blocks (admin/build/block), перетащить мышкой строку с описанием блока в нужный регион (область страницы, которая может содержать один или несколько блоков) и сохранить изменения. В свойствах модуля доступны стандартные для Drupal средства управления блоком: список страниц, на которых блок должен показываться (или наоборот список страниц, на которых блок не должен показываться), список ролей пользователей, которые имеют доступ к содержимому блока, и другие.
Ссылки на документацию
• Руководство по разработке модулей: http://drupal.org/node/206754.
• Параметры, используемые в .info-файлах: http://drupal.org/node/231036.
• Введение в Schema API: http://drupal.org/node/146843.
• Типы полей, используемых в Schema API: http://drupal.org/node/159605.
• Описание hook_menu(): http://api.drupal.org/api/function/hook_menu/6.
• Описание типов полей Forms API: http://api.drupal.org/api/file/developer/topics/forms_api_reference.html/6.
• Описание hook_block(): http://api.drupal.org/api/function/hook_block/6.
Новости. С 15 по 15
Принтеры
Компания Konica Minolta (www.konicaminolta.ru) объявила о выпуске универсального драйвера. (UPD, Universal Print Driver) для всех устройств печати Konica Minolta и других производителей, совместимых с PCL6 или PostScript. Пакет будет полезен компаниям с большим парком разнообразного оборудования; система автоматически распознает доступные сетевые устройства печати и отображает их в виде списка, из которого пользователь выбирает подходящие. С помощью драйвера администраторы могут дистанционно настраивать многофункциональные аппараты и принтеры.
Универсальный драйвер печати имеет унифицированный графический интерфейс, предоставляет доступ ко всем возможностям устройства, от выбора формата до финишной обработки и настройки качества печати. Кроме того, все основные настройки, например формат бумаги и тип печати, могут быть одинаково применены на всех устройствах без установки дополнительных драйверов.
Предусматривается фильтр поиска, позволяющий искать печатное устройство по заданным параметрам. При необходимости печатать высококачественные цветные отпечатки формата А3 в дуплексном режиме пользователь просто выбирает соответствующие характеристики, такие как цвет, поддержка формата А3 и двусторонняя печать в поисковом окне. В окне фильтра появится список печатных устройств, отвечающих задаче.
Программы
Компания Entensys (www.usergate.ru) объявила о выпуске UserGate Proxy & Firewall 5.2. Система предназначается для организации доступа в Интернет и защиты локальной сети от внешних угроз, одно из главных нововведений – обновленный механизм блокирования HTTP-трафика по заголовку Content-Type, что позволяет блокировать определенные типы данных (картинки, видеоданные, флэш-контент и др.). Изменения в области информационной безопасности коснулись соединения между консолью и сервером – в новой версии используется SSL-защита всех передаваемых данных между этими модулями. Реализован мастер настройки, при помощи пошаговых инструкций эта функция позволяет быстро настроить сервер. Изменился и раздел статистики, появились новые отчеты («пользователь – сайты» и «группа пользователей – сайты»). Отметим также усовершенствованный механизм конвертации конфигурационного файла из форматов предыдущих версий UserGate, автоматическое восстановление базы данных в случае повреждения и оптимизацию работы модуля кэширования. Зарегистрированные пользователи версии 5.х могут получить обновление бесплатно.