Если вы следите за релизами новой ветки Drupal, а сейчас - это уже 8 версия нашей любимой CMF, то вы наверняка знаете, что в новой ветки - блоки тоже стали сущностью, а это значит, что к любому блоку мы можем добавлять любые поля, управлять их отображением и изменять форматы вывода. К сожалению, в 7й версии такого нет, хотя иногда этого очень хочется.
Но не все так плохо, Drupal 7 нам позволяет добавлять свои любые поля через хук:
hook_block_configure()
который принимает единственный параметр:
- $delta – уникальный ID блока, который описан в info файле модуля
Хочу заметить, что данный хук сработает лишь с кастомными блоками, блоки, которые вы создатите через админ панель, к сожалению отпадают.
И сохранять значения этой формы через хук:
hook_block_save()
Который также принимает следующие значения:
- $delta – уникальный ID блока
- $edit – массив со значениями формы из hook_block_configure()
Хочу заметить, что данный хук используется только в паре с hook_block_configure()
Теперь реализация. В моем случае мой модуль называется addfield_block. В данном примере создан кастомный блок с 3 дополнительными полями
- Текстовое поле
- Селект
- Файловое поле
name = Add Field Block description = Данный модуль добавляет дополнительные поля для блока package = Other core = 7.x version = 7.x-1.0
<?php /** * Inplements hook_block_info() */ function addfield_block_block_info(){ 'info' => t('Add field for custom block'), ); return $blocks; } /** * Implements hook_block_configure(). */ function addfield_block_block_configure($delta = '') { if($delta == 'addfield_block'){ // Fieldset для формы с полями '#type' => 'fieldset', '#title' => t('Field for custom block'), '#collapsible' => TRUE, '#collapsed' => FALSE ); // Текстовое поле '#type' => 'textfield', '#title' => t('Title text'), '#description' => t('Description text'), '#default_value' => variable_get('text', ''), ); // Селект 'One select' => t('One select'), 'Two select' => t('Two select'), 'Three select' => t('Three select'), 'Four select' => t('Four select'), 'Five select' => t('Five select'), ); '#type' => 'select', '#title' => t('Title select'), '#description' => t('Description select'), '#options' => $options, '#default_value' => variable_get('select', ''), ); // Файлы '#type' => 'managed_file', '#title' => t('Files'), '#description' => t('Description files'), '#upload_location' => 'public://blockfiles', '#default_value' => variable_get('files', ''), ); } return $form; } /** * Implements hook_block_save */ if ($delta == 'addfield_block') { variable_set('text', $edit['text']); variable_set('select', $edit['select']); variable_set('files', $edit['files']); $fid = $edit['files']; if($fid > 0){ // Сохраняем файл $file = file_load($fid); $file->status = FILE_STATUS_PERMANENT; file_save($file); file_usage_add($file, 'addfield_block', 'user', 1); }else{ // Удаляем файл $oldfid = db_select('file_usage', 'f') ->condition('f.module', 'addfield_block') ->execute() ->fetchField(); if($oldfid){ $oldfile = file_load($oldfid); file_usage_delete($oldfile, 'addfield_block'); file_delete($oldfile); } } } } /** * Implements hook_block_view(). */ function addfield_block_block_view($delta='') { if($delta == 'addfield_block'){ // Текстовое поле if(variable_get('text')){ $items[] = variable_get('text'); }; // Селект if(variable_get('select')){ $items[] = variable_get('select'); } // Файл $files = variable_get('files'); if($files > 0){ $files_item = file_load($files); $files_name = $files_item->filename; $files_item = file_create_url($files_item->uri); $files_item = l(t($files_name), $files_item); $items[] = $files_item; } //$items = array($text, $select, $files_item); $title = 'View field block'; $type = 'ul'; $block['subject'] = 'My custom block'; $block['content'] = $output; } return $block; }
После активации модуля вы можете видеть форму с полями описанные в hook_block_configure()
После заполнения которых вы увидите все значения формы:
Как вы могли заметить значения полей формы формы пропущены через theme_item_lilst(), вы же естественно можете переписать под необходимый вам формат. Скачать сам модуль используемый в статье можно здесь.
Комментарии (2)
"Если вы следите за релизами новой ветки Drupal, а сейчас - это уже 8 версия нашей любой CMF..."
может "любимой"? :)
да, конечно