Программное создание блока в Drupal 7

В этой заметке мы рассмотрим процесс программного создания блока с помощью хуков hook_block_info(), hook_block_view(), hook_block_configure() и hook_block_save() на примере блока содержащего слоган сайта так как по умолчанию такого блока в Drupal 7 нету.

Для этой цели мы напишем небольшой модуль Slogan block (машинное имя sb).

Первым делом создадим файл sb.info:

name = Slogan block
description = Add block with site slogan.
core = 7.x
package = Custom

Также создадим пустой файл sb.module и включим наш новый модуль.

Включение модуля Slogan block

Для того чтобы объявить новый блок добавим в файл sb.module хук hook_block_info():

/**
 * Implements hook_block_info().
 */
function sb_block_info() {
  $blocks['site_slogan'] = array(
    'info' => t('Site slogan'),
    'cache' => DRUPAL_CACHE_GLOBAL,
  );
 
  return $blocks;
}
hook_block_info() - объявляет блоки предоставляемые модулем и устанавливает для них настройки по умолчанию.

Теперь зададим нашему сайту тестовый слоган в разделе Site information:

Настройка слогана сайта в Drupal 7

Следующим шагом очистим кэш и разместим блок Site slogan в регион First sidebar:

Установка блока Site slogan в регион First sidebar

На данном этапе блок размещен в регион и слоган сайта задан, но ничего отображается не будет так как Drupal не знает что нужно выводить в этот блок. Для этой цели мы используем hook_block_view().

Добавим в файл sb.module следующий код:

/**
 * Implements hook_block_view().
 */
function sb_block_view($delta = '') {
  $block = array();
 
  switch ($delta) {
    case 'site_slogan':
      $block['subject'] = t('Site slogan');
      $block['content'] = variable_get('site_slogan', '');
      break;
  }
  return $block;
}
hook_block_view() - возвращает содержимое блока. Параметр $delta - уникальный индентификатор блока предоставляемый hook_block_info() (в нашем случае это site_slogan).

После очередной очистки кэша видим отображение нашего блока на сайте:

Отображение блока Site slogan

По умолчанию программно созданные блоки имеют те же самые настройки что и любой другой блок: настройки видимости, заголовок блока и т.д., но мы можем добавлять свои дополнительные настройки. В данном случае будет удобно если мы будем иметь возможность редактировать слоган сайта прямо на форме редактирования этого блока.

Для этой цели мы используем хуки hook_block_configure() и hook_block_save.

Добавим в файл sb.module следующий код:

/**
 * Implements hook_block_configure().
 */
function sb_block_configure($delta = '') {
  $form = array();
  if ($delta == 'site_slogan') {
    $form['site_slogan'] = array(
      '#type' => 'textfield',
      '#title' => t('Site slogan'),
      '#default_value' => variable_get('site_slogan', ''),
    );
  }
  return $form;
}
 
/**
 * Implements hook_block_save().
 */
function sb_block_save($delta = '', $edit = array()) {
  if ($delta == 'site_slogan') {
    variable_set('site_slogan', $edit['site_slogan']);
  }
}
hook_block_configure() - объявляет форму настройки блока. Параметр $delta - тоже что и для hook_block_view().

hook_block_save() - предоставляет обработчик данных пришедших с формы объявленной в hook_block_configure(). Параметры: $delta - тоже что и для hook_block_view(), $edit - содержит данные пришедшие с формы конфигурации блока.

Так как мы объявили два новых хука снова чистим кэш и переходим на форму редактирования блока Site slogan:

Редактирование блока Site slogan

Как видим на форме присутствует добавленное поле Site slogan. Далее изменим его значение и сохраним форму.

Отображение обновленного слогана сайта

Слоган обновился, значит форма работает правильно.

Полный листинг файла sb.module:

<?php
 
/**
 * Implements hook_block_info().
 */
function sb_block_info() {
  $blocks['site_slogan'] = array(
    'info' => t('Site slogan'),
    'cache' => DRUPAL_CACHE_GLOBAL,
  );
 
  return $blocks;
}
 
/**
 * Implements hook_block_view().
 */
function sb_block_view($delta = '') {
  $block = array();
 
  switch ($delta) {
    case 'site_slogan':
      $block['subject'] = t('Site slogan');
      $block['content'] = variable_get('site_slogan', '');
      break;
  }
  return $block;
}
 
/**
 * Implements hook_block_configure().
 */
function sb_block_configure($delta = '') {
  $form = array();
  if ($delta == 'site_slogan') {
    $form['site_slogan'] = array(
      '#type' => 'textfield',
      '#title' => t('Site slogan'),
      '#default_value' => variable_get('site_slogan', ''),
    );
  }
  return $form;
}
 
/**
 * Implements hook_block_save().
 */
function sb_block_save($delta = '', $edit = array()) {
  if ($delta == 'site_slogan') {
    variable_set('site_slogan', $edit['site_slogan']);
  }
}
Поделись с друзьями:

Комментарии

Спасибо за ценный материал. Вопрос возникший. Хочу сделать такой же блок как в ядре drupal Новые комментарии.

Где и как поискать хуки что бы сделать свой блок, хотя бы такой же как в ядре. Потом хочу научится добавлять свои элементы в этот блок. Буду очень признателен за примерную публикацию.

Не понимаю вопроса, хуки для создания блока приведены в этом уроке. Также для блока со списком комментариев лучше использовать модуль Views чем создавать блок вручную.