Як я можу створити подання дочірніх вузлів на основі співвідношення меню?


17

Скажіть, у вас є такі сторінки в дереві меню:

  • Проекти
    • Перший проект
    • Проект другий
    • Проект третій

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

Відносини між батьком та дітьми визначаються у дереві меню.

Я знаю, що я можу використовувати посилання на вузол, але це означатиме, що кожен раз, коли хтось створює сторінку, вони повинні визначати співвідношення меню, а потім відношення посилання на вузол.

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


1
Не існує прямого зв’язку між вузлами, які відображаються у підменю іншого вузла (Єдине з'єднання між посиланням меню та вузлом полягає в тому, що посилання меню вказує на вузол / nid). Тож вам потрібно щось зв’язати ці підвузли разом (і батьківський вузол), це може бути загальним терміном таксономії, book.module, ...
Бердір,

Відповіді:


4

Одне рішення - використовувати терміни таксономії для визначення відносин, а потім використовувати модуль меню таксономії для перекладу цих термінових відносин у пункти меню. Потім ви можете використовувати модуль користувацької сторінки та модулі контексту для управління інформацією та регіонами на всіх сторінках, якщо ви не хочете використовувати панелі.


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'];
Стефан

Дякую за це Кілька поліпшень (крім виправлення @ Стефана). 1) Ви можете використовувати menu_load_object(arg(1))замість того, node_load()щоб заощадити деякі витрати. 2) Ви повинні перевірити, чи переконується, що пункт меню є з меню, яке ви маєте справу. Зараз ви просто повертаєтесь першими $mlid. Всередині передбачення слід додати умовне if ($data->menu_name == 'my-menu')виправлення. і 3) Ви можете додати другий фільтр для menu: hiddenповернення лише тих предметів, які не є прихованими. Використовуйте той самий фрагмент, але поверніть $data->hidden;замість $mlid.
Адам Бальзам

2
Я настійно не рекомендую пропонувати модулі, які ще знаходяться на стадії розробки.
Ambidex

@Stefan є далеко, щоб отримати всіх дітей на будь-якому рівні? а не лише спочатку.
Елі Стоун

4

Ієрархія Модуль Node дозволяє цей тип відносин, а також забезпечення інтеграції поглядів.

Ієрархія вузлів дозволяє вузлам бути дітьми інших вузлів, створюючи деревоподібну ієрархію вмісту. Модуль пропонує:

  • Створення 1-клацання ієрархічних меню
  • Ієрархічні сухарі
  • Автоматичні ієрархічні URL-адреси за допомогою Pathauto (та модуля токена)

    (наприклад: q = aboutus / історія / початок).

  • Автоматичне створення ієрархічних меню за бажанням.
  • Необов'язкова інтеграція поглядів.
  • Додаткова інтеграція доступу до вузла.

2

Можливо, це змінилося для D7 / Views 3, але вам не потрібен PHP для досягнення бажаної поведінки:

  1. встановити menu_views , menu_node та module_node_views модулі.
  2. створити новий вид типу "дерево меню"
  3. додайте поля "Меню: назва посилання" та "Меню: опис"
  4. Додати контекстний фільтр / аргумент "Меню: Ідентифікатор вузла"; Укажіть значення за замовчуванням "Ідентифікатор вмісту з URL-адреси"
  5. Додати відносини "Меню: Ідентифікатор посилання батьківського меню"

вуаля. Це не повинно працювати , але це робить.

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


Це хороший варіант для виявлення посилань на вузли (і мені подобається, що Аарон Бауман створив цей зразок подання для імпорту: pastebin.com/u2GjmWG7 ). Однак у мене виникли проблеми з наданням вузлів поля доступними для перегляду, як це вимагало ОП. Як це досягнуто?
sum1ejack

Ви можете відкрити поля вузлів, додавши відношення до "Меню: Ідентифікатор вузла". Ви бачите щось подібне?
aaronbauman

2

Існує відносно новий модуль Перегляд меню «Вузол для дітей», який, здається, робить саме те, що вам потрібно:

Цей модуль додає контекстний фільтр до переглядів, який отримає дочірні вузли вузла відповідно до структури меню.


0

Чи розглядали ви для цього використання посилання на вузол ?

  1. Надайте поле посилань на вузол для типу вмісту, який ви хочете відобразити.
  2. Використовуйте це поле як контекстний фільтр у представленні (значення за замовчуванням: Ідентифікатор вмісту від URL-адреси ).
  3. Додайте цей дисплей перегляду як блок до вмісту. Вузол, у якому він відображається, розглядатиметься як батьківський з вузлів, які посилаються на нього, наприклад.

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


0

Відповідь від Emile правильна, але мені довелося вставити згаданий PHP-код у контекстний фільтр типу " Menu: Ідентифікатор посилання на батьківське меню ".

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

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);
    }
  }
}
  }

0

З черги питань перегляду вузлів меню у нас є таке гарне рішення:

  • додайте контекстний фільтр із написом "Ідентифікатор посилання батьківського меню",
  • виберіть "Надати значення за замовчуванням"
  • виберіть "спеціальний код PHP"
  • введіть наступний код

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.