Как я могу создать представление дочерних узлов на основе отношения меню?

17

Скажем, у вас есть следующие страницы в дереве меню:

  • проектов
    • Проект Один
    • Проект второй
    • Проект третий

Я ищу способ создания представления, которое будет встроено в страницу проекта (родительскую), которая будет отображать изображение, заголовок и текст (резюме) из дочерних страниц.

Отношения между родителем и потомками определяются в дереве меню.

Я знаю, что могу использовать ссылку на узел, но это будет означать, что каждый раз, когда кто-то создает страницу, он должен будет определить отношение меню, а затем ссылку на узел.

Также я знаю, что могу создать другой тип контента, но думаю, что это излишне, поскольку все страницы контента выглядят одинаково.

Camsoft
источник
1
Нет прямой связи между узлами, которые отображаются в подменю другого узла (единственная связь между ссылкой меню и узлом состоит в том, что ссылка меню указывает на узел / nid). Таким образом, вам нужно что-то, чтобы связать эти подузлы вместе (и с родительским узлом), это может быть общий термин таксономии, book.module, ...
Бердир,

Ответы:

4

Одним из решений является использование терминов таксономии для определения отношений, а затем использование модуля меню таксономии для преобразования этих терминов отношений в пункты меню. Затем вы можете использовать модуль Custom Page и модули Context для управления информацией и регионами на всех страницах, если вы не хотите использовать панели.

Адам С
источник
16

Вы можете сделать это, используя API узла меню и модули представлений узла меню .

Создайте представление с требуемым типом содержимого и выберите контекстный фильтр «Меню: идентификатор ссылки меню» (это доступно только с установленными выше модулями).

В разделе «Когда значение фильтра недоступно» выберите «Указать значение по умолчанию» и выберите «PHP-код».

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

if (function_exists('menu_node_get_links')){  
   $node = node_load(intval(arg(1)));  
   if (isset($node->menu_node_links)){
      foreach($node->menu_node_links as $mlid=>$data){  
         return $mlid;
      }  
   }
}
Эмиль Котт
источник
3
Я думаю, что фильтр должен быть «Меню: идентификатор ссылки родительского меню», чтобы взять дочерние элементы текущего узла. И код аргумента может быть: $ current = end (menu_get_active_trail ()); вернуть $ current ['mlid'];
Стефан
Спасибо за это. Несколько улучшений (в дополнение к исправлению @ Stefan). 1) Вы можете использовать menu_load_object(arg(1))вместо того, node_load()чтобы сэкономить некоторые расходы. 2) Вы должны убедиться, что пункт меню из того меню, которое вас интересует. Прямо сейчас, вы только что вернулись первым $mlid. Внутри foreach вы должны добавить условие, if ($data->menu_name == 'my-menu')чтобы исправить это. и 3) Вы можете добавить второй фильтр для menu: hiddenвозврата только тех предметов, которые не скрыты. Используйте тот же фрагмент, но верните $data->hidden;вместо $mlid.
Адам Бальзам
2
Я бы настоятельно не рекомендовал предлагать модули, которые еще находятся в стадии разработки.
Ambidex
@ Стефан, чтобы все дети на любом уровне? а не просто сначала.
Eli Stone
4

Модуль иерархии узлов допускает этот тип отношений, а также обеспечивает интеграцию представлений.

Иерархия узлов позволяет узлам быть дочерними по отношению к другим узлам, создавая древовидную иерархию контента. Модуль предлагает:

  • Создание иерархических меню в один клик
  • Иерархические сухари
  • Автоматические иерархические URL с использованием Pathauto (и модуля токенов)

    (например: q = о нас / история / начало).

  • Автоматическое создание иерархических меню при желании.
  • Интеграция дополнительных видов.
  • Дополнительный узел доступа к интеграции.
CCMonkey
источник
2

Возможно, это изменилось для D7 / Views 3, но вам не нужен PHP для выполнения желаемого поведения:

  1. установить модули menu_views , menu_node и menu_node_views .
  2. создать новый вид типа "дерево меню"
  3. добавить поля «Меню: заголовок ссылки» и «Меню: описание»
  4. Добавить контекстный фильтр / аргумент «Меню: ID узла»; Укажите значение по умолчанию «Идентификатор контента из URL».
  5. Добавить отношение "Меню: идентификатор ссылки родительского меню"

вуаля. Это не должно работать , но это работает.

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

aaronbauman
источник
Это хороший вариант для предоставления ссылок на узлы (и мне нравится, что Аарон Бауман поднял этот пример представления для импорта: pastebin.com/u2GjmWG7 ). Однако у меня возникли некоторые проблемы с тем, чтобы сделать поля узла доступными для представления, поскольку запросил OP. Как это достигается?
doub1ejack
Вы должны иметь возможность выставить поля узла, добавив отношение к «Меню: ID узла». Вы видите что-то подобное?
Аарон Бауман
2

Есть сравнительно новый модуль Views Menu Node Children Filter, который, кажется, делает именно то, что вы хотите:

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

nwellnhof
источник
0

Рассматривали ли вы использование Node Reference для этой цели?

  1. Укажите в поле ссылки на узел тип контента, который вы хотите отобразить.
  2. Используйте это поле в качестве контекстного фильтра в представлении (значение по умолчанию: идентификатор контента из URL ).
  3. Добавьте этот вид отображения как блок к содержанию. Узел, в котором он отображается, будет рассматриваться как родительский для узлов, которые ссылаются на него, например.

Таким образом, вы можете достичь такого же результата, как вы, вероятно, ищете.

cptstarling
источник
0

Ответ Эмиля правильный, но мне пришлось вставить упомянутый PHP-код в контекстный фильтр типа « Меню: идентификатор ссылки на родительское меню ».

if (function_exists('menu_node_get_links')){  
   $node = node_load(intval(arg(1)));  
   if (isset($node->menu_node_links)){
      foreach($node->menu_node_links as $mlid=>$data){  
         return $mlid;
      }  
   }
}
cptstarling
источник
0

Если вы используете трансляцию сущностей, а узел подключен к различным меню, здесь приведена адаптация кода, который фильтрует текущий язык. Вы должны скопировать это как код PHP для контекстного фильтра (идентификатор ссылки родительского меню) в вашем представлении, как объяснено в других ответах

 if (function_exists('menu_node_get_links')) {
global $language;
$lang = $language->language;
$node = node_load(intval(arg(1)));
if (isset($node->menu_node_links)) {
  foreach ($node->menu_node_links as $mlid => $data) {  
    if ($lang == $data->language) {
      return($mlid);
    }
  }
}
  }
bendev
источник
0

Из очереди выдачи представлений узлов меню у нас есть хорошее решение:

  • добавить контекстный фильтр с «идентификатором ссылки родительского меню»,
  • выберите «Предоставить значение по умолчанию»
  • выберите «пользовательский код PHP»
  • введите следующий код

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
tostinni
источник