Drupal 7 hook_block_info() и hook_block_view() выводим информацию в блоке
В прошлом уроке мы создали модуль для Друпал 7, в этом уроке мы продолжим расширять возможности нашего модуля. Мы добавим вывод блока через хук hook_block_view(), а также hook_block_info(). В этом блоке будет информация о последних пользователях на сайте с ссылкой на их страницу.
Начну с описания hook_block_info():
Определяет все блоки создаваемые модулем.
Этот хук определяет в друпале какие блоки будут выводиться модулем и может описать настройки вывода блока.
В hook_block_info() каждый блок вашего модуля получает уникальный идентификатор "delta" (массив ключей возвращаемых значений). Значение delta должно быть уникальным в вашем модуле и они должны быть использованы для следующего:
- Передаваться в остальные хуки как аргументы для идентификации блока, который будет сконфигурирован и выведен.
- Использоваться для создания HTML шаблона блока "block-MODULE-DELTA" применяемого к каждому блоку, который обработан Друпалом (Это можно использовать для написания CSS-кода или Javascipt-скрипта).
- Использоваться для определения фунций темизации block__MODULE__DELTA, для углубленной темизации.
- Использоваться для идентификации вашего блока в hook_block_info_alter() и остальных хуках.
Значения дельты может быть строкой или числом, Максимальная длина delta 32 байта.
Возвращаемые значения
Ассоциативный массив ключи которого delta каждого блока и в которых значение описание блоков. Описание каждого блока может быть также ассоциативным массивом со следующими парами ключ-значение:
'info': (обязательно) Читаемое имя блока для админки. Эта информация используется для идентификации блока в разделе админки "блоки" и не отображается во front-end'е сайта.
'cache': (опционально) Описывает поведение кеширования блока. Друпал описывает следующие поведения:
- DRUPAL_CACHE_PER_ROLE (по умолчанию): Блок может быть изменен основываясь на роли пользователя просматривающего страницу.
- DRUPAL_CACHE_PER_USER: Блок может быть изменен для всех пользователей.
- DRUPAL_CACHE_PER_PAGE: Блок может быть изменен в зависимости от страницы.
- DRUPAL_CACHE_GLOBAL: Блок одинаков внезависимости от пользователя и страницы.
DRUPAL_NO_CACHE: Блок не будет кешироваться.
'properties': (опционально) Массив дополнительных мета-данных для добавления блока.
Общие properties включают:
'administrative': Boolean который описывает будет ли блок использоваться для administrative context.
'weight': (опционально) Инициализирует значение веса блока.
'status': (опционально) Инициализирует значение статуса. (1 = включен, 0 = выключен).
'region': (опционально) Инициализирует значение региона.
- 'visibility': (опционально) Инициализирует значение видимости блока. Возможные значения:
- BLOCK_VISIBILITY_NOTLISTED: Показывать на всех страницах исключая следующие.
- BLOCK_VISIBILITY_LISTED: Показывать только на этих страницах.
- BLOCK_VISIBILITY_PHP: Использовать кастомный PHP-код для настройки видимости.
- 'pages': (опционально) Список путей страниц для параметра visibility.
Добавим один блок hook'ом:
<?php function sitemade_block_info(){ $blocks = array(); $blocks[1]['info'] = 'Список пользователей'; return $blocks; } ?>
Блок должен появиться в админке, давайте добавим его в левый сайдбар:
Теперь когда у нас добавлен блок, выведем его содержимое через хук hook_block_view().
hook_block_view($delta = '')
:
Параметры
$delta - показывает какой блок обратывается хуком. Это уникальный идентификатор блока в модуле, определенный в hook_block_info()
Возвращаемое значение
Массив содержащий следующие элементы:
subject: По умолчанию переведенный заголовок блока. Если блок не имеет по умолчанию заголовок, то будет возвращено NULL.
content: Содержание тела блока. Может быть обрабатываемым массивом (предпочтительнее) или строкой содержащей обработанный HTML.
Давайте добавим этот хук:
<?php function sitemade_block_view($delta = ''){ $block = array(); //инициализируем пустой массив блока switch ($delta){ case 1: //такая же delta как мы возвращали в hook_block_info() $block['subject'] = 'Пользователи'; //выводим заголовок блока $block['content'] = ''; //инициализируем строковую переменную $query = db_select('users', 'u') //запрос выборки пользователей ->fields('u', array('uid', 'name')) //выбор полей ->orderBy('u.uid', 'DESC') //сортируем по убыванию ->range(0, 5) //выбор пяти пользователей ->execute(); //запрос к БД $users = $query->fetchAll(PDO::FETCH_ASSOC); //обрабатывает запрос в виде массива foreach($users as $user){ $block['content'] .='<div><a href="' . base_path() . 'user/' . $user['uid'] . '">' . $user['name'] . '</a></div>'; // base_path() - функция возвращает путь к корню сайта } break; } return $block; } ?>
В результате мы выведем список последних 5 зарегистрированных пользователей на сайте, в виде ссылок на их страницы. Конечно лучше для ссылок использовать функцию l(), но об этой функции нужно делать отдельную статью.