Drupal → Как программно создать блок с расширенными настройками
Если ваш модуль выводит какую-нибудь информацию в блок, то бывает полезно дать возможность изменить кастомные настройки в общих настройках блока, вместо создания для этого отдельной странице в админке:
/** * Реализация hook_block() */ function mymodule_block($op = 'list', $delta = 0, $edit = array()) { // Возвращаем описание блока для страницы admin/build/block if ($op == 'list') { $blocks[0]['info'] = 'Последние материалы'; return $blocks; } // Возвращаем поля, в которых будут храниться расширенные настройки if ($op == 'configure') { $form['mymodule_node_count'] = array( '#type' => 'textfield', '#title' => 'Число последних материалов', '#description' => 'Число материалов, которые будут выводится в блоке', '#size' => 5, '#default_value' => variable_get('mymodule_node_count', 5), ); return $form; } // Сохраняем значения дополнительных полей if ($op == 'save') { variable_set('mymodule_node_count', (int)$edit['mymodule_node_count']); } // Выводим блок с применением расширенных настроек if ($op == 'view') { $limit = variable_get('mymodule_node_count', 5); $nodes = db_query_range("SELECT nid, title FROM {node} ORDER BY nid DESC", 0, $limit); $items = array(); while ($node = db_fetch_object($nodes)) { $items[] = l($node->title, 'node/' . $node->nid); } $block['content'] = theme('item_list', $items); return $block; } }
По материалам Add Configurable Values to Block. Ещё один пример на api.drupal.ru.
Комментарии
Зануда
1. Любой пользовательский ввод нужно проверять, напр.:
variable_set('mymodule_node_count', (int) $edit['mymodule_node_count']);
2. t();
3. http://drupal.org/coding-standards
/Зануда
не спорю, но это здесь не критично, так как в db_query_range аргументы приводятся к integer
тут русскоязычный блог. прикладывать к постам ещё и .po файлы удовольствие сомнительное =)
Вот интересно, как правильно делать программную проверку настроек блока?
Для обычных форм есть hook_validate, а для hook_block $op = 'validate' почему то нету.
http://drupal.org/node/280585
Хм, так и делал раньше через #element_validate.
Не понравилось то, что надо объявлять кучу функций-валидаторов для каждого элемента формы.
Хотя наверно их можно как-то объединить.
Оставить комментарий