как задать видимость блока в модуле?

Главные вкладки

Аватар пользователя WiseMan WiseMan 30 марта 2010 в 16:28

Решил написать небольшой модуль для облегчения задачи управления видимостью блоков на страницах словарей и их терминов.

Все это можно сделать сниппетом (приведу ниже, мож кому пригодится), но для менеджера сайта это слишком сложно.

Споткнулся на этапе, когда нужно вывести блок. Настройки, с указанием в каком словаре выводить - сделал:

<?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']);
    }
 }
?>

А вот как теперь выводить все блоки у которых указан словарь, не соображу Sad Помогите, пжта.

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;
?>

Комментарии

Аватар пользователя riyuzakki riyuzakki 30 марта 2010 в 18:21

У немя была похожая задача:
В каталоге есть товары, находящиеся в транзите. На выходе они помечаются цветом. Если в разделе каталога есть такие товары, то должен выводиться блок с легендой. Как реализовать "по-друпаловски" не нашел. Сделал через глобальную переменную, но для этого нужно либо затачивать функцию блока (выбранный мной вариант), либо изменять своим модулем настройку блока "показывать когда пхп код вернет тру".
Хотя можно попробовать отреверсить откуда и как вызывается колбэк блока... Но так лениво... Wink

Аватар пользователя WiseMan WiseMan 30 марта 2010 в 18:25

"riyuzakki" wrote:
изменять своим модулем настройку блока "показывать когда пхп код вернет тру"

Вот даже если хотя бы вот так вот сделать, уже здорово!

Буду благодарен, в т.ч. финансово - за готовое решение.

Аватар пользователя allexx allexx 30 марта 2010 в 22:47

Че-то тоже интересно стало. Поковырял. Собака вот здесь порылась block_list($region), но к ней никак похоже из своего модуля не подлезть. Из этой же функции видно, что спрятать блоки можно если только в поле pages писать страницы(например из nodeapi), но это уж совсем изврат ведущий к тупику.
И видимо действительно проще "показывать когда пхп код вернет тру". В базу писать visibility=2 и сам PHP-код в pages.