Прошу подсказать решение такой задачи: необходимо управлять видимостью (отображением)двух взаимноисключающих меню на одном и том же месте (в левой области сайта). Меню организованы на основе двух словарей таксономии и необходимо, чтобы меню соотвествующее одному словарю было видно в момент когда просматривается нода термин которой принадлежит этому же словарю.
Конечно можно решить эту проблему через управление видимостью меню в блоке меню (по URL'ам), но не хочется для этого отдельно заводить специально названные типы нод и т.д. Решение должно быть элегантно - на основе применения словарей таксономии, т.е. открыта нода, термин которой принадлежит одному словарю - значит в этот момент видно меню соотвествующее этому словарю.
Поэтому, подскажите: существует ли модуль для 6-го Друпала, который моржет решить эту задачу полностью или необходимо будет решать ее иным путем?
Заранее благодарю всех за помощь.
Комментарии
Показывать блок для терминов 1, 2, 6:
<?php
$desired_terms = array(1, 2, 6);
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(1, 2, 6);
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
Спасибо за подсказку и ссылку на ресурс - там же взял вторую часть кода, который необходим для решения озвученной мною задачи - дело в том, что когда нода показывается, то меню отображается, а вот, когда выбран пункт этого меню, то отображается список нод, соотвествующих этому пункту (термину), но меню уже не отображается. Поэтому дополнил код второй частью и, чтобы тема имела завершенный вид, привожу рабочую версию своего кода:
<?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.
Спасибо пригодится!
А как тоже самое сделать на 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 - машинное имя поля, содержащего термин