Drupal hook_block_info() и hook_block_view() выводим информацию в блоке

admin друпал drupal

В прошлом уроке мы создали модуль для Друпал 7, в этом уроке мы продолжим расширять возможности нашего модуля. Мы добавим вывод блока через хук hook_block_view(), а также hook_block_info(). В этом блоке будет информация о последних пользователях на сайте с ссылкой на их страницу.

Начну с описания hook_block_info():

Определяет все блоки создаваемые модулем.

Этот хук определяет в друпале какие блоки будут выводиться модулем и может описать настройки вывода блока.

В hook_block_info() каждый блок вашего модуля получает уникальный идентификатор "delta" (массив ключей возвращаемых значений). Значение delta должно быть уникальным в вашем модуле и они должны быть использованы для следующего:

  1. Передаваться в остальные хуки как аргументы для идентификации блока, который будет сконфигурирован и выведен.
  2. Использоваться для создания HTML шаблона блока "block-MODULE-DELTA" применяемого к каждому блоку, который обработан Друпалом (Это можно использовать для написания CSS-кода или Javascipt-скрипта).
  3. Использоваться для определения фунций темизации block__MODULE__DELTA, для углубленной темизации.
  4. Использоваться для идентификации вашего блока в 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;
    }

    ?>

Блок должен появиться в админке, давайте добавим его в левый сайдбар:

drupal hook_block

Теперь когда у нас добавлен блок, выведем его содержимое через хук 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(), но об этой функции нужно делать отдельную статью.

drupal hook_block_view