Управление видимостью блоков (меню) на основе словарей таксономии

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

Аватар пользователя Andrey_71 Andrey_71 10 марта 2010 в 9:33

Прошу подсказать решение такой задачи: необходимо управлять видимостью (отображением)двух взаимноисключающих меню на одном и том же месте (в левой области сайта). Меню организованы на основе двух словарей таксономии и необходимо, чтобы меню соотвествующее одному словарю было видно в момент когда просматривается нода термин которой принадлежит этому же словарю.
Конечно можно решить эту проблему через управление видимостью меню в блоке меню (по URL'ам), но не хочется для этого отдельно заводить специально названные типы нод и т.д. Решение должно быть элегантно - на основе применения словарей таксономии, т.е. открыта нода, термин которой принадлежит одному словарю - значит в этот момент видно меню соотвествующее этому словарю.
Поэтому, подскажите: существует ли модуль для 6-го Друпала, который моржет решить эту задачу полностью или необходимо будет решать ее иным путем?
Заранее благодарю всех за помощь.

Комментарии

Аватар пользователя a.nanda a.nanda 11 марта 2010 в 11:12

Показывать блок для терминов 1, 2, 6:


<?php
$desired_terms 
= array(126);
if ( 
arg(0) == 'node' and is_numeric(arg(1)) ) {
    
$node node_load(arg(1));
   foreach (
$node->taxonomy as $term) {
        if (
in_array($term->tid$desired_terms)) {
            return 
TRUE;
        }
    }
}
return 
FALSE;
?>

Не показывать блок для терминов 1, 2, 6:


<?php
$desired_terms 
= array(126);
if ( 
arg(0) == 'node' and is_numeric(arg(1)) ) {
    
$node node_load(arg(1));
   foreach (
$node->taxonomy as $term) {
        if (
in_array($term->tid$desired_terms)) {
            return 
FALSE;
        }
    }
}
return 
TRUE;
?>

Взято с http://content-management-systems.info/node/297

Аватар пользователя Andrey_71 Andrey_71 17 марта 2010 в 22:00

Спасибо за подсказку и ссылку на ресурс - там же взял вторую часть кода, который необходим для решения озвученной мною задачи - дело в том, что когда нода показывается, то меню отображается, а вот, когда выбран пункт этого меню, то отображается список нод, соотвествующих этому пункту (термину), но меню уже не отображается. Поэтому дополнил код второй частью и, чтобы тема имела завершенный вид, привожу рабочую версию своего кода:
<?php
$desired_terms = array(25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38);
if ( arg(0) == 'node' and is_numeric(arg(1)) ) {
$node = node_load(arg(1));
foreach ($node->taxonomy as $term) {
if (in_array($term->tid, $desired_terms)) {
return TRUE;
}
}
}

$desired_paths = array('подстрока/URL'a/пунктов/меню');
/** то есть все пункты этого меню имеют одинаковую подстроку
*/
if ($_GET['q']) {
$my_drupal_path = $_GET['q'];
} else {
$my_drupal_path = substr($_SERVER['REQUEST_URI'], 1);
}
$my_path_alias = drupal_get_path_alias($my_drupal_path);
foreach ($desired_paths as $desired_path) {
if (stristr($my_path_alias, $desired_path)) {
return TRUE;
}
}

return FALSE;
?>
Чтобы не появлялся блок при просмотре нод, с соотвествующими терминами, поменять местами TRUE и FALSE.

Аватар пользователя Bogdan1975 Bogdan1975 4 июня 2013 в 22:30

"Bogdan1975" wrote:
А как тоже самое сделать на 7-й версии?

Разобрался ...
В 7-м будет примерно так:


<?php
$desired_terms 
= array(2,3);
if ( 
arg(0) == 'node' and is_numeric(arg(1)) ) {
    
$node node_load(arg(1));
    foreach (
$node->field_menu_type['und'] as $term) {
      if (
in_array($term['tid'], $desired_terms)) return TRUE;
    }
    return 
FALSE;
}
?>

В данном примере field_menu_type - машинное имя поля, содержащего термин