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


В Drupal 7 появился новый основной модуль (dashboard.module), который позволяет пользователям с соответствующими разрешениями добавлять блоки, определенные на сторонних сайтах, на панель мониторинга, которая отображается в виде наложения на текущей странице.

Возможно ли, чтобы модуль, реализующий блоки, знал, когда блок отображается на панели мониторинга?
Идея состояла бы в том, чтобы изменить содержимое блока и сделать его меньше (например).

 1
Author: kiamlaluno, 2011-03-08

2 answers

Вы можете проверить аргумент URL, на котором отображается блок, а затем, если он соответствует ожидаемому шаблону, т. е. /панель мониторинга, вы можете изменить содержимое блока. Это решение действительно работает только в том случае, если вы сами закодировали блок.

Обновление: Этот метод все равно будет работать, хотя я недостаточно знаком с модулем панели мониторинга drupal 7s, чтобы комментировать дальше. Единственное, что я бы предложил, - это вывести переменные страницы и посмотреть, есть ли что-нибудь, заданное модулем панели мониторинга.

 2
Author: digital, 2011-03-09 12:43:31

Посмотрев на код dashboard.module, я нашел следующую функцию:

/**
 * Implements hook_block_list_alter().
 *
 * Skip rendering dashboard blocks when not on the dashboard page itself. This
 * prevents expensive dashboard blocks from causing performance issues on pages
 * where they will never be displayed.
 */
function dashboard_block_list_alter(&$blocks) {
  if (!dashboard_is_visible()) {
    foreach ($blocks as $key => $block) {
      if (in_array($block->region, dashboard_regions())) {
        unset($blocks[$key]);
      }
    }
  }
}

Dashboard_is_visible() - это функция, которая возвращает TRUE, когда панель мониторинга видна, а dashboard_regions() - это функция, которая возвращает массив, содержащий список регионов, содержащихся в панели мониторинга.

Это функции, которые позволяют модулю знать, когда его блоки отображаются на панели мониторинга. Единственная проблема заключается в модуле чтобы узнать, с какой областью связаны его блоки, так как объект блока не передается в hook_block_view(). Drupal 7 использует новые крючки, hook_block_view_alter() и hook_block_view_module_delta_alter(), вторым параметром которого является объект блока. Реализуя один из этих крючков, можно изменить блок в зависимости от того, отображается блок на панели мониторинга или нет.

Предположим, что mymodule - краткое имя модуля, а test_block - дельта значение, модуль должен использовать следующую функцию:

/**
 * Implements hook_block_view_MODULE_DELTA_alter().
 */
function mymodule_block_view_mymodule_test_block_alter(&$data, $block) {
  if (dashboard_is_visible() && in_array($block->region, dashboard_regions())) {
    // The block is rendered in the dashboard.
  }
}
 2
Author: kiamlaluno, 2011-03-31 00:57:32