Помощь начинающим веб
разработчикам

Пример добавления любых полей к форме кастомного блока

04.09.2015

Если вы следите за релизами новой ветки Drupal, а сейчас - это уже 8 версия нашей любимой CMF, то вы наверняка знаете, что в новой ветки - блоки тоже стали сущностью, а это значит, что к любому блоку мы можем добавлять любые поля, управлять их отображением и изменять форматы вывода. К сожалению, в 7й версии такого нет, хотя иногда этого очень хочется.

Но не все так плохо, Drupal 7 нам позволяет добавлять свои любые поля через хук:

  1. hook_block_configure()

который принимает единственный параметр:

  • $delta – уникальный ID блока, который описан в info файле модуля

Хочу заметить, что данный хук сработает лишь с кастомными блоками, блоки, которые вы создатите через админ панель, к сожалению отпадают.

И сохранять значения этой формы через хук:

  1. hook_block_save()

Который также принимает следующие значения:

  • $delta – уникальный ID блока
  • $edit – массив со значениями формы из hook_block_configure()

Хочу заметить, что данный хук используется только в паре с hook_block_configure()

Теперь реализация. В моем случае мой модуль называется addfield_block. В данном примере создан кастомный блок с 3 дополнительными полями

  • Текстовое поле
  • Селект
  • Файловое поле
Файл addfield_block.info
  1. name = Add Field Block
  2. description = Данный модуль добавляет дополнительные поля для блока
  3. package = Other
  4. core = 7.x
  5. version = 7.x-1.0
Файл addfield_block.module
  1. <?php
  2. /**
  3.  * Inplements hook_block_info()
  4.  */
  5. function addfield_block_block_info(){
  6. $blocks = array();
  7. $blocks['addfield_block'] = array(
  8. 'info' => t('Add field for custom block'),
  9. );
  10. return $blocks;
  11. }
  12.  
  13. /**
  14. * Implements hook_block_configure().
  15. */
  16. function addfield_block_block_configure($delta = '') {
  17.  
  18. $form = array();
  19.  
  20. if($delta == 'addfield_block'){
  21.  
  22. // Fieldset для формы с полями
  23. $form['wrap'] = array(
  24. '#type' => 'fieldset',
  25. '#title' => t('Field for custom block'),
  26. '#collapsible' => TRUE,
  27. '#collapsed' => FALSE
  28. );
  29.  
  30. // Текстовое поле
  31. $form['wrap']['text'] = array(
  32. '#type' => 'textfield',
  33. '#title' => t('Title text'),
  34. '#description' => t('Description text'),
  35. '#default_value' => variable_get('text', ''),
  36. );
  37.  
  38. // Селект
  39. $options = array(
  40. 'One select' => t('One select'),
  41. 'Two select' => t('Two select'),
  42. 'Three select' => t('Three select'),
  43. 'Four select' => t('Four select'),
  44. 'Five select' => t('Five select'),
  45. );
  46.  
  47. $form['wrap']['select'] = array(
  48. '#type' => 'select',
  49. '#title' => t('Title select'),
  50. '#description' => t('Description select'),
  51. '#options' => $options,
  52. '#default_value' => variable_get('select', ''),
  53. );
  54.  
  55. // Файлы
  56. $form['wrap']['files'] = array(
  57. '#type' => 'managed_file',
  58. '#title' => t('Files'),
  59. '#description' => t('Description files'),
  60. '#upload_location' => 'public://blockfiles',
  61. '#upload_validators' => array('file_validate_extensions' => array('jpeg jpg png gif zip pdf xls csv')),
  62. '#default_value' => variable_get('files', ''),
  63. );
  64.  
  65. }
  66.  
  67. return $form;
  68.  
  69. }
  70.  
  71. /**
  72.  * Implements hook_block_save
  73.  */
  74. function addfield_block_block_save($delta = '', $edit = array()) {
  75. if ($delta == 'addfield_block') {
  76.  
  77. variable_set('text', $edit['text']);
  78. variable_set('select', $edit['select']);
  79. variable_set('files', $edit['files']);
  80.  
  81. $fid = $edit['files'];
  82.  
  83. if($fid > 0){
  84. // Сохраняем файл
  85. $file = file_load($fid);
  86. $file->status = FILE_STATUS_PERMANENT;
  87. file_save($file);
  88. file_usage_add($file, 'addfield_block', 'user', 1);
  89.  
  90. }else{
  91. // Удаляем файл
  92. $oldfid = db_select('file_usage', 'f')
  93. ->fields('f', array('fid'))
  94. ->condition('f.module', 'addfield_block')
  95. ->execute()
  96. ->fetchField();
  97.  
  98. if($oldfid){
  99. $oldfile = file_load($oldfid);
  100. file_usage_delete($oldfile, 'addfield_block');
  101. file_delete($oldfile);
  102. }
  103.  
  104. }
  105. }
  106. }
  107.  
  108. /**
  109. * Implements hook_block_view().
  110. */
  111. function addfield_block_block_view($delta='') {
  112. $block = array();
  113. if($delta == 'addfield_block'){
  114.  
  115. $items = array();
  116.  
  117. // Текстовое поле
  118. if(variable_get('text')){
  119. $items[] = variable_get('text');
  120. };
  121.  
  122. // Селект
  123. if(variable_get('select')){
  124. $items[] = variable_get('select');
  125. }
  126.  
  127. // Файл
  128. $files = variable_get('files');
  129. if($files > 0){
  130. $files_item = file_load($files);
  131. $files_name = $files_item->filename;
  132. $files_item = file_create_url($files_item->uri);
  133. $files_item = l(t($files_name), $files_item);
  134. $items[] = $files_item;
  135. }
  136.  
  137. //$items = array($text, $select, $files_item);
  138. $title = 'View field block';
  139. $type = 'ul';
  140.  
  141. $output = theme_item_list(array('items' => $items, 'title' => $title, 'type' => $type, 'attributes' => array()));
  142.  
  143. $block['subject'] = 'My custom block';
  144. $block['content'] = $output;
  145. }
  146. return $block;
  147. }

После активации модуля вы можете видеть форму с полями описанные в hook_block_configure()

Дополнительные поля блока

После заполнения которых вы увидите все значения формы:

Значения полей формы

Как вы могли заметить значения полей формы формы пропущены через theme_item_lilst(), вы же естественно можете переписать под необходимый вам формат. Скачать сам модуль используемый в статье можно здесь.

Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (2)

Profile picture for user Arcad
Валерий
14.09.2015

"Если вы следите за релизами новой ветки Drupal, а сейчас - это уже 8 версия нашей любой CMF..."
может "любимой"? :)

Profile picture for user pantey
pantey
10.10.2015

да, конечно

Добавить комментарий