Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

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

02/12/2019, by Ivan

В прошлом уроке мы создали модуль для Друпал 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 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 list users