Создание блока программно

Аватар пользователя Натали
Раздел: 

Для создания блока в drupal 7 необходимо использовать два Хука

MYMODULENAME_block_info() // для объявления дескриптора блока
MYMODULENAME_block_view() // для генерации контента блока
если необходимо в стандартную конфигурационную форму блока добавить дополнительные поля то используются следующие хуки

MYMODULENAME_block_configure() // для объявления дополнительных элементов формы конфигурации блока
MYMODULENAME_block_save() // для дополнительных действий по сохранению данных из дополнительных элементов формы
теперь остановимся подробно о создании блока

/**
* Реализация hook_block_info().
*/
function demo_block_info() {
$blocks['demo'] = array(
'info' => 'Первый блок, который вы создали самостоятельно ',
);

return $blocks;
}

  • 'demo' - дельта (машинное имя) блока, служит для того чтобы отличать блоки друг от друга в процессе, рекомендуется чтобы дельта начиналась с имени модуля который объявляет блок

Хук возвращает ассоциированный массив дескрипторов блоков c cледующими ключами

  • info: (обязательно) - "Человеческое" имя блока для страницы администрирования блоков в админ части сайта
  • cache: определяет вид кеширования блока
    • DRUPAL_CACHE_PER_ROLE (default) по ролям пользователя
    • DRUPAL_CACHE_PER_USER: по пользователям.
    • DRUPAL_CACHE_PER_PAGE: по странично
    • DRUPAL_CACHE_GLOBAL: глобально в пределах сайта
    • DRUPAL_CACHE_CUSTOM: Модули самостоятельно определяют механизм кеширования.
    • DRUPAL_NO_CACHE: Не кешировать.
  • properties:Дополнительные метаданные блока
    • administrative:Логический флаг опредяющий что блок используется в административной части сайта
  • weight: Вес блока
  • status: Состояние блока. (1 = включен, 0 = выключен)
  • region: Первоначальный регион в котором показывается блок
  • visibility: Видимость блока
    • BLOCK_VISIBILITY_NOTLISTED: Показывать на всех страницах кроме перечисленных
    • BLOCK_VISIBILITY_LISTED: Не показывать на всех страницах кроме перечисленных
    • BLOCK_VISIBILITY_PHP: определяется PHP кодом ( не рекомендуется использовать)
  • pages: Если visibility BLOCK_VISIBILITY_NOTLISTED или BLOCK_VISIBILITY_LISTED стока путей разделенная '\n', '\r', или '\r\n' , или PHP код если 'visibility' = BLOCK_VISIBILITY_PHP. Пути могут включать '*' '' . Для BLOCK_VISIBILITY_PHP, если PHP код возвращает TRUE блок будет показан, если FALSE блок будет скрыт.

Рекомендуется вместо visibility BLOCK_VISIBILITY_PHP использовать хук

MYMODULE_block_list_alter()
в нем необходимо по условиям делать unset блокам согласно дельты и дополнительных условий удаление контента блока или unset на более поздних этапах приводит к дополнительной нагрузке на CPU и может привести к падению производительности сайта.

генерация контента блока (желательно использовать Render API для генерации контента блока)

/**
* Реализация hook_block_view().
*/
function demo_block_view($delta = '') {
switch ($delta):
case 'demo':
$block['subject'] = 'Пример'; // - заголовок блока во фронтенде.
$block['content'] =
'Содержимое переменной Текст: '.
variable_get('demo_text', '');
break;
endswitch;
return $block;
}

блок конфигурации блока, Любой блок имеет собственную стандартную форму конфигурации в которую можно добавить дополнительные поля как обычно в Form API

/**
* Реализация hook_block_configure().
*/
function demo_block_configure($delta = '') {
$form = array();

switch ($delta):
case 'demo':
$block = block_load('demo', 'demo');
$form['demo_text'] = array(
'#type' => 'textfield',
'#title' => 'Текст',
'#description' => 'Впишите сюда одну строчку любого текста.',
'#default_value' => variable_get('demo_text', '')
);
/*
Здесь могут располагаться различные элементы формы:
вкладки, кнопки, радиокнопки, списки и т.п.
*/
break;
endswitch;

return $form;
}

хук сохранения данных из формы конфигурации блока (эквивалентен Hook_form_submit() в Form API) $edit - данные которые пользователь ввел в форме

/**
* Реализация hook_block_save().
*/
function demo_block_save($delta = '', $edit = array()) {
switch ($delta):
case 'demo':
variable_set('demo_text', $edit['demo_text']);
break;
endswitch;
}

Injoy!