Drupal hook_block_info() и hook_block_view() выводим информацию в блоке

admin друпал drupal

В прошлом уроке мы создали модуль для Друпал 7, в этом уроке мы продолжим расширять возможности нашего модуля. Мы добавим вывод блока через хук hook_block_view(), а также hook_block_info(). В этом блоке будет информация о последних пользователях на сайте с ссылкой на их страницу.

Начну с описания hook_block_info():

Определяет все блоки создаваемые модулем.

Этот хук определяет в друпале какие блоки будут выводиться модулем и может описать настройки вывода блока.

В hook_block_info() каждый блок вашего модуля получает уникальный идентификатор "delta" (массив ключей возвращаемых значений). Значение delta должно быть уникальным в вашем модуле и они должны быть использованы для следующего:

  1. Передаваться в остальные хуки как аргументы для идентификации блока, который будет сконфигурирован и выведен.
  2. Использоваться для создания HTML шаблона блока "block-MODULE-DELTA" применяемого к каждому блоку, который обработан Друпалом (Это можно использовать для написания CSS-кода или Javascipt-скрипта).
  3. Использоваться для определения фунций темизации block__MODULE__DELTA, для углубленной темизации.
  4. Использоваться для идентификации вашего блока в hook_block_info_alter() и остальных хуках.

Значения дельты может быть строкой или числом, Максимальная длина delta 32 байта.

Возвращаемые значения

Ассоциативный массив ключи которого delta каждого блока и в которых значение описание блоков. Описание каждого блока может быть также ассоциативным массивом со следующими парами ключ-значение:

'info': (обязательно) Читаемое имя блока для админки. Эта информация используется для идентификации блока в разделе админки "блоки" и не отображается во front-end'е сайта.

'cache': (опционально) Описывает поведение кеширования блока. Друпал описывает следующие поведения:

  • DRUPAL_CACHE_PER_ROLE (по умолчанию): Блок может быть изменен основываясь на роли пользователя просматривающего страницу.
  • DRUPAL_CACHE_PER_USER: Блок может быть изменен для всех пользователей.
  • DRUPAL_CACHE_PER_PAGE: Блок может быть изменен в зависимости от страницы.
  • DRUPAL_CACHE_GLOBAL: Блок одинаков внезависимости от пользователя и страницы.

DRUPAL_NO_CACHE: Блок не будет кешироваться.

'properties': (опционально) Массив дополнительных мета-данных для добавления блока.

Общие properties включают:

'administrative': Boolean который описывает будет ли блок использоваться для administrative context.

'weight': (опционально) Инициализирует значение веса блока.

'status': (опционально) Инициализирует значение статуса. (1 = включен, 0 = выключен).

'region': (опционально) Инициализирует значение региона.

  • 'visibility': (опционально) Инициализирует значение видимости блока. Возможные значения:
    • BLOCK_VISIBILITY_NOTLISTED: Показывать на всех страницах исключая следующие.
    • BLOCK_VISIBILITY_LISTED: Показывать только на этих страницах.
    • BLOCK_VISIBILITY_PHP: Использовать кастомный PHP-код для настройки видимости.
  • 'pages': (опционально) Список путей страниц для параметра visibility.

 Добавим один блок hook'ом:

    <?php

    function sitemade_block_info(){
        $blocks = array();
        $blocks[1]['info'] = 'Список пользователей';
        return $blocks;
    }

    ?>

Блок должен появиться в админке, давайте добавим его в левый сайдбар:

drupal hook_block

Теперь когда у нас добавлен блок, выведем его содержимое через хук hook_block_view().

hook_block_view($delta = ''):

Параметры

$delta - показывает какой блок обратывается хуком. Это уникальный идентификатор блока в модуле, определенный в hook_block_info()

Возвращаемое значение

Массив содержащий следующие элементы:

subject: По умолчанию переведенный заголовок блока. Если блок не имеет по умолчанию заголовок, то будет возвращено NULL.

content: Содержание тела блока. Может быть обрабатываемым массивом (предпочтительнее) или строкой содержащей обработанный HTML.

 Давайте добавим этот хук:

  <?php
    function sitemade_block_view($delta = ''){
        $block = array(); //инициализируем пустой массив блока
        switch ($delta){
            case 1: //такая же delta как мы возвращали в hook_block_info()
                $block['subject'] = 'Пользователи'; //выводим заголовок блока
                $block['content'] = ''; //инициализируем строковую переменную
                $query = db_select('users', 'u') //запрос выборки пользователей
                  ->fields('u', array('uid', 'name')) //выбор полей
                  ->orderBy('u.uid', 'DESC') //сортируем по убыванию
                  ->range(0, 5) //выбор пяти пользователей
                  ->execute(); //запрос к БД
                $users = $query->fetchAll(PDO::FETCH_ASSOC); //обрабатывает запрос в виде массива
                foreach($users as $user){
                    $block['content'] .='<div><a href="' . base_path() . 'user/' . $user['uid'] . '">' . $user['name'] . '</a></div>';
                    // base_path() - функция возвращает путь к корню сайта
                }
            break;
        }
        return $block;
    }
  ?>

В результате мы выведем список последних 5 зарегистрированных пользователей на сайте, в виде ссылок на их страницы. Конечно лучше для ссылок использовать функцию l(), но об этой функции нужно делать отдельную статью.

drupal hook_block_view

 

 

 

Комментарии

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

Войти, используя Loginza Google Account Yandex Mail.ru Vkontakte Facebook

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.

а как вывести 2 функции в

а как вывести 2 функции в блоке?

 

function alliance_block_view($delta = '') {

  $block = array();

 

  switch ($delta) {

    case 'webform':

      $block['content'] = alliance_block_content() . alliance_block_link();

      break;

  }

  return $block;

}

 

здесь у меня 2 массива, но только array array при выводе

извините за дурацкий вопрос,

извините за дурацкий вопрос, но как это претворить в жизнь?

 

например здесь:

function alliance_block_link(){

  $links[] = "<a href='user/1'>Ссылка</a>";

  $output = theme('item_list', array('items' => $links));

 

  return array('markup' => array('#markup' => $output));

}

 

проблему решил.

оставил только 1 функцию и добавил  в массив еще значений

 

$links = array();

$links[] = ctools_modal_text_button(t('Обратная связь'), 'alliance/nojs/feedback', t('Обратная связь'),  'ctools-modal-webform-popup-style');

$links[] = "<a href='user/1'>Ссылка</a>";

$output = theme('item_list', array('items' => $links));

return array('markup' => array('#markup' => $output));

Вы написали: content:

Вы написали:

content: Содержание тела блока. Может быть обрабатываемым массивом (предпочтительнее)

Хотелось бы узнать поподробнее об обрабатываемом массиве...

content в переменной блока

content в переменной блока может быть и массивом, например если мы хотим использовать шаблон для вывода блока:

function hook_block_view($delta = '') {
  // This example is adapted from node.module.
  $block = array();

  switch ($delta) {
    case 'syndicate':
      $block['subject'] = t('Syndicate');
      $block['content'] = array(
        '#theme' => 'feed_icon', 
        '#url' => 'rss.xml', 
        '#title' => t('Syndicate'),
      );
      break;

    case 'recent':
      if (user_access('access content')) {
        $block['subject'] = t('Recent content');
        if ($nodes = node_get_recent(variable_get('node_recent_block_count', 10))) {
          $block['content'] = array(
            '#theme' => 'node_recent_block', 
            '#nodes' => $nodes,
          );
        }
        else {
          $block['content'] = t('No content available.');
        }
      }
      break;
  }
  return $block;
}

Здесь передаются массивы и в параметре #theme передается имя функции определяющей шаблон, здесь у нас 

theme_feed_icon()

http://api.drupal.org/api/drupal/includes!theme.inc/function/theme_feed_icon/7

theme_node_recent_block()

http://api.drupal.org/api/drupal/modules!node!node.module/function/theme_node_recent_block/7

 

То есть, чтобы не загромождать вывод блока или использовать код несколько раз и с параметрами (#url, #title в первом случае и $nodes массив нод во втором).

Так зачем что то делать

Так зачем что то делать руками? если можно доводить все до автоматезации вроде все к этому стримятся , и так то вообще можно и блок создать руками и поместить куда хочешь, но ваша тема как создать блок программно и было бы уместро вписать регион