Возможно ли, чтобы модуль знал, когда один из его блоков выводится на панель мониторинга, и изменял содержимое этого блока?
В Drupal 7 появился новый основной модуль (dashboard.module), который позволяет пользователям с соответствующими разрешениями добавлять блоки, определенные на сторонних сайтах, на панель мониторинга, которая отображается в виде наложения на текущей странице.
Возможно ли, чтобы модуль, реализующий блоки, знал, когда блок отображается на панели мониторинга?
Идея состояла бы в том, чтобы изменить содержимое блока и сделать его меньше (например).
2 answers
Вы можете проверить аргумент URL, на котором отображается блок, а затем, если он соответствует ожидаемому шаблону, т. е. /панель мониторинга, вы можете изменить содержимое блока. Это решение действительно работает только в том случае, если вы сами закодировали блок.
Обновление: Этот метод все равно будет работать, хотя я недостаточно знаком с модулем панели мониторинга drupal 7s, чтобы комментировать дальше. Единственное, что я бы предложил, - это вывести переменные страницы и посмотреть, есть ли что-нибудь, заданное модулем панели мониторинга.
Посмотрев на код 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.
}
}