Как сделать пользовательский блок видимым тогда и только тогда, когда в данном регионе нет других активных блоков


Баннер заголовка сайта отображается с помощью пользовательского блока, содержащего изображение. Возможно ли создать блок по умолчанию, который вернет visibility = TRUE только в том случае, если в области заголовка для отображаемой в данный момент страницы нет других блоков, которые видны? Другими словами, может ли тест видимости PHP-кода получить доступ к списку блоков, которые будут отображаться в регионе блока? Если нет, то как можно реализовать эту функциональность?

 1
Author: kiamlaluno, 2011-06-01

1 answers

Существует функция, которая возвращает список блоков, доступных в регионе, но ее нельзя вызвать из кода PHP, используемого для установления видимости блока, так как это, вероятно, вызовет рекурсивный вызов.

Глядя на код block_list(), вы можете написать код видимости для своего блока. Что вам нужно изменить, так это запрос, который получает список всех блоков, чтобы исключить блок, для которого вы пишете код видимости.

Фактический запрос, выполняемый функцией, выглядит следующим образом:

$result = db_query(db_rewrite_sql("SELECT DISTINCT b.* FROM {blocks} b LEFT JOIN {blocks_roles} r ON b.module = r.module AND b.delta = r.delta WHERE b.theme = '%s' AND b.status = 1 AND (r.rid IN (" . db_placeholders($rids) . ") OR r.rid IS NULL) ORDER BY b.region, b.weight, b.module", 'b', 'bid'), array_merge(array($theme_key), $rids));

Код функции требует, чтобы вы знали область, в которой блок виден; если вы перемещаете блок в другую область, вам необходимо соответствующим образом изменить код, используемый для проверки видимости блока.

В Drupal 7 модуль может реализовать функцию hook_block_list_alter() для изменения списка видимых блоков.

Воздействуйте на блоки до рендеринга.

Этот крючок позволяет добавлять, удалять или измените блоки в списке блоков. Список блоков содержит определения блоков, а не визуализированные блоки. Блоки отображаются после того, как модули получили возможность манипулировать списком блоков.

Здесь также можно задать $block->content, который переопределит содержимое блока и предотвратит запуск hook_block_view().

 2
Author: kiamlaluno, 2011-06-01 16:50:02