Решил написать небольшой модуль для облегчения задачи управления видимостью блоков на страницах словарей и их терминов.
Все это можно сделать сниппетом (приведу ниже, мож кому пригодится), но для менеджера сайта это слишком сложно.
Споткнулся на этапе, когда нужно вывести блок. Настройки, с указанием в каком словаре выводить - сделал:
<?php
/**
* Implementation of hook_form_alter().
*/
function custom_mod_form_alter(&$form, &$form_state, $form_id) {
if (($form_id == 'block_admin_configure' || $form_id == 'block_box_form' || $form_id == 'block_add_block_form')) {
$module = $form['module']['#value'];
$delta = $form['delta']['#value'];
$form['custom_mod_vis_settings'] = array(
'#type' => 'fieldset',
'#title' => t('Vocabulary visibility settings'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#weight' => 0,
);
// Vocab-based visibility settings
$default_vocab_vis_options = array();
$result = db_query("SELECT vid FROM {blocks_vocabulary} WHERE module = '%s' AND delta = '%s'", $module, $delta);
while ($vocab = db_fetch_object($result)) {
$default_vocab_vis_options[] = $vocab->vid;
}
$result = db_query('SELECT vid, name FROM {vocabulary} ORDER BY name');
$vocab_vis_options = array();
while ($vocab = db_fetch_object($result)) {
$vocab_vis_options[$vocab->vid] = $vocab->name;
}
$form['custom_mod_vis_settings']['vocab_visability_blocks'] = array(
'#type' => 'radios', //checkboxes
'#title' => t('Show block for specific vocab'),
'#default_value' => $default_vocab_vis_options,
'#options' => $vocab_vis_options,
'#description' => t('Show this block only for the selected vocabulary. If you select no vocabulary, the block will be visible to all vocabulary.'),
);
$form['#submit'][] = 'custom_mod_form_submit';
}
}
?>
все сохраняется в таблицу "blocks_vocabulary"
<?php
/**
* Forms api callback. Submit function
*/
function custom_mod_form_submit($form, &$form_state) {
db_query("DELETE FROM {blocks_vocabulary} WHERE module = '%s' AND delta = '%s'", $form_state['values']['module'], $form_state['values']['delta']);
foreach (array_filter($form_state['values']['vocab_visability_blocks']) as $vid) {
db_query("INSERT INTO {blocks_vocabulary} (vid, module, delta) VALUES (%d, '%s', '%s')", $vid, $form_state['values']['module'], $form_state['values']['delta']);
}
}
?>
А вот как теперь выводить все блоки у которых указан словарь, не соображу Помогите, пжта.
API смотрел, но никак ни въеду как вклиниться в видимость блоков. Смотрел как сделано у модулей которые имеют собственные блоки, там вроде понятно, но как быть когда надо отображать/не отображать любой блок от любого модуля.
P.S. Как обещал, работающий сниппет для отображения блока в зависимости от словаря, включая все его термины:
<?php
$desired_vocab = 1; // указываем ID словаря
if ( ((arg(0) == 'taxonomy')
&& (arg(1) == 'term')
&& is_numeric(arg(2))
&& ($term = taxonomy_get_term(arg(2)))
&& ($term->vid == $desired_vocab )) ) {
return TRUE;
}
if ( arg(0) == 'node' and is_numeric(arg(1)) and arg(2) == FALSE ) {
$node = node_load(arg(1));
// If the term does not exist we're done
if (is_array($node->taxonomy)) {
foreach ($node->taxonomy as $term) {
if ($term->vid == $desired_vocab) {
return TRUE;
}
}
}
}
return FALSE;
?>
Комментарии
У немя была похожая задача:
В каталоге есть товары, находящиеся в транзите. На выходе они помечаются цветом. Если в разделе каталога есть такие товары, то должен выводиться блок с легендой. Как реализовать "по-друпаловски" не нашел. Сделал через глобальную переменную, но для этого нужно либо затачивать функцию блока (выбранный мной вариант), либо изменять своим модулем настройку блока "показывать когда пхп код вернет тру".
Хотя можно попробовать отреверсить откуда и как вызывается колбэк блока... Но так лениво...
Вот даже если хотя бы вот так вот сделать, уже здорово!
Буду благодарен, в т.ч. финансово - за готовое решение.
Че-то тоже интересно стало. Поковырял. Собака вот здесь порылась block_list($region), но к ней никак похоже из своего модуля не подлезть. Из этой же функции видно, что спрятать блоки можно если только в поле pages писать страницы(например из nodeapi), но это уж совсем изврат ведущий к тупику.
И видимо действительно проще "показывать когда пхп код вернет тру". В базу писать visibility=2 и сам PHP-код в pages.