xandeadx.ru Блог музицирующего веб-девелопера

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.

Написанное актуально для Drupal 6.x
Похожие записи

Комментарии RSS

Зануда
1. Любой пользовательский ввод нужно проверять, напр.:
variable_set('mymodule_node_count', (int) $edit['mymodule_node_count']);
2. t();
3. http://drupal.org/coding-standards
/Зануда

1. Любой пользовательский ввод нужно проверять

не спорю, но это здесь не критично, так как в db_query_range аргументы приводятся к integer

2. t();

тут русскоязычный блог. прикладывать к постам ещё и .po файлы удовольствие сомнительное =)

Вот интересно, как правильно делать программную проверку настроек блока?
Для обычных форм есть hook_validate, а для hook_block $op = 'validate' почему то нету.

Хм, так и делал раньше через #element_validate.
Не понравилось то, что надо объявлять кучу функций-валидаторов для каждого элемента формы.
Хотя наверно их можно как-то объединить.

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании