Jak wstrzyknąć menu taksonomii jako podmenu standardowego elementu menu?

12

Mam menu główne o strukturze najwyższego poziomu podobnej do następującej:

Home - Categories - Something Else - ... - Contact

Każdy z tych łączy najwyższego poziomu prowadzi do odpowiedniej strony węzła.

Mam słownictwo dotyczące kategorii (wielopoziomowe) i muszę uzyskać te warunki taksonomii w podmenu pod pozycją „Kategorie”. Chciałbym uniknąć zakodowania elementów w menu głównym, ponieważ podmenu powinno rosnąć / kurczyć się wraz ze słownictwem.

W przeszłości napisałem zbyt skomplikowany kod, aby to osiągnąć, który przechwytuje operacje taksonomiczne i na tej podstawie zarządza poszczególnymi podmenu menu (bardzo podobne do tego, co robi menu taksonomii , ale bez konieczności posiadania innego menu dla każdego z nich) słownictwo).

Chociaż ta metoda działa, nie jest idealna i na pewno nie ogólna. Nie mogę po prostu podnieść tego kodu ze starego projektu do nowego, wymagałoby to rozsądnego dostosowania.

Nie mogę się oprzeć wrażeniu, że musi istnieć „standardowe” rozwiązanie modułowe.

Widziałem kilka sugestii, aby użyć kilku różnych modułów w połączeniu (nawet niektóre sugerują użycie modułów opartych na widokach, co dziwne). Jestem otwarty na wszelkie sugestie, ale jeśli wiąże się to z instalacją więcej niż 1 lub 2 modułów i mnóstwem zakodowanej konfiguracji kontekstowej, prawdopodobnie w tym przypadku nie pomoże.

Clive
źródło
1
Myślę, że widziałem ... Podobny temat zawiera pomysł na temat używania reguł do tworzenia pozycji menu opartych na taksonomii, ale wydaje się to również dalekie od ideału.
Mołot
Jeśli dobrze zrozumiałem, czy wyglądasz podobnie jak ten moduł drupal.org/project/taxonomy_treemenu , można go zintegrować z ładnym menu, ale w przypadku D6
Bala
Czy musisz mieć rzeczywiste pozycje menu, czy jest możliwe dodanie drzewa terminów taksonomii do menu, gdy jest renderowane?
rooby
Dzięki @Bala, potrzebuję rozwiązania D7
Clive
1
Clive Mam jedną sugestię. Jak wiem, możesz wygenerować menu taksonomu z dołączoną nazwą słownika, a następnie po prostu dodać inne linki menu bezpośrednio do wygenerowanego menu. Elementy taksonomii mogą być aktualizowane automatycznie ... Nie wiem, czy to zadziała, po prostu spróbuj.
milkovsky

Odpowiedzi:

13

Opcja a) O ile się nie mylę, czy nie możesz po prostu wybrać miejsce, w którym twoje menu taksonomii będzie rodzone (lokalizacja menu) podczas jego tworzenia? Myślę, że jedynym problemem, który możesz z tym zrobić, jest to , że wymaga to przebudowania menu za każdym razem, gdy taksonomia jest aktualizowana

Opcja b) Zrobiłem coś dość podobnego do tego na mojej stronie, użyłem modułu Widoki menu , aby umożliwić mi umieszczenie widoku w moim głównym menu.

Jeśli utworzysz nowy widok z listą wszystkich terminów taksonomii, jako wyświetlanie blokowe, w razie potrzeby zastosuj dodatkowe filtrowanie / modyfikację w widoku (możesz nie, ale w moim przykładzie chciałem). Następnie, gdy dodajesz nowy link do menu głównego, możesz wybrać widok zamiast łącza. Następnie wybierz widok, którego chcesz użyć, wybierz element menu „Kategoria” jako jego element nadrzędny i zapisz (po zapisaniu musisz włączyć go w menu, co wydaje się być błędem w samym module)

Nie mogę zagwarantować, że jest to najlepsze rozwiązanie dla ciebie, ale zadziałało, kiedy właśnie go przetestowałem

Andrew Morris
źródło
1
Tak, okazuje się, że byłem raczej głupi - menu taksonomii ma dokładnie tę wbudowaną funkcję (twoja opcja a). Konkretne menu, z którym mam do czynienia, jest dość małe, a kategorie często się nie zmieniają, więc przebudowa nie stanowi problemu. Wielkie dzięki za kontrolę poczytalności
Clive
3

Menupoly posiada interfejs API dla niestandardowych „źródeł drzewa menu”. Nigdy tak naprawdę nie wykorzystałem tego do czegoś innego niż linki menu, więc mogą pojawić się problemy, które musimy rozwiązać po drodze. Ale istnieje podstawowa architektura.

Jeśli pójdziesz tą drogą, zrobiłbyś to

  • Użyj istniejącego menu głównego, bez linków terminów taksonomicznych poza stroną „Kategorie”.
  • Utwórz niezależne od tego drzewo taksonomii.
  • Napisz niestandardowe „źródło drzewa menu”, które normalnie pobiera z menu_links, ale gdy znajdzie termin taksonomiczny, zamiast tego pobiera taksonomię.
    Więc w jakiś sposób musisz być w stanie wykryć, że link „Kategorie” jest związany z taksonomią.
  • Jeśli łącze menu jest związane z taksonomią i jednocześnie ma zwykłe podmenu, musisz w jakiś sposób połączyć oba rodzaje dzieci razem.

Ta trasa byłaby trochę pracy, ale może być przydatna dla innych i jest prawdopodobnie bardziej elegancka i wielokrotnego użytku niż logika specyficzna dla witryny.

Obecnie nie istnieje nawet „źródło drzewa menu” oparte wyłącznie na taksonomii, więc być może byłby to rozsądny pierwszy krok przed uruchomieniem mieszanej wtyczki.

Don Kichot
źródło
Biorąc to pod uwagę, zaakceptowana odpowiedź Andrew Morrisa może być wystarczająco dobra. A to oznacza dla mnie mniej pracy :) Nadal chciałem opublikować to dla każdego, kto może uznać to za przydatne.
donquixote
V. interesujące, dzięki. Zaakceptowana odpowiedź dobrze sobie radzi, ale jestem bardzo zainteresowana uzyskaniem rozwiązań kodowych. Czy mogę założyć, że jest to jeden z modułów, który jest zbudowany na dobroci PSR-0? :)
Clive
Ten używa trybu kompatybilności z PHP 5.2 xautoload, który jest trochę podobny do PEAR, ale z płytkimi katalogami. Więc nie zatwierdzony przez PSR. Mogę kiedyś przejść na PSR-0.
donquixote
chociaż bardzo interesuje mnie PSR-X (który może niestety nigdy nie dostać się do D8)
donquixote
2

Menu Metro spełni twoje wymagania, a nawet ma wbudowane skórki i może tworzyć własne, które działają tak samo jak ładne menu. Za pomocą tego modułu możesz wybrać dowolne elementy podrzędne o dowolnej głębokości z menu lub systematyki i nie używam tego wcześniej.

Kompatybilność z ekranem dotykowym (iPad, iPhone itp.).

wprowadź opis zdjęcia tutaj

Bala
źródło
2

Do tego samego możesz użyć modułu menu Om Maxi . Pozwoli to administratorowi tworzyć menu z blokami, które chcesz jako załączniki, moduły, takie jak widoki, pokaz slajdów, menu, użytkownik, ładne menu, skrócone tabele i niestandardowe bloki z tabelami, listami, obrazami, wideo itp.

Możesz utworzyć osobne menu za pomocą menu taksonomii i możesz dołączyć to menu jako podlinki do menu generowanego przez menu om maxi.

Dzięki

Jayendra Kainthola
źródło
2

Ostatnio zrobiłem coś podobnego dla menu kategorii produktów. Było to tylko dla głębokości 1 poziomu, ale można go łatwo zmodyfikować, aby wyświetlać kolejne poziomy.

/**
 * Implements theme_menu_link().
 */
function THEME_menu_link__main_menu($variables) {

  $sub_menu = '';
  $element = $variables['element'];
  $menu_string = $element['#title'];

  if (module_load_include('inc','pathauto','pathauto') !== FALSE) {
    $menu_string =  pathauto_cleanstring($menu_string);
  }

  if ($menu_string == 'categories') {
    $sub_menu = get_categories_menu();
  }

  if ($sub_menu) {
    $element['#attributes']['class'][] = 'haschildren';
  }

  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}

function get_categories_menu() {

  $current_category = arg(2); // Get current category from path
  $volcab = taxonomy_vocabulary_machine_name_load('product-categories');
  $tree = taxonomy_get_tree($volcab->vid,0,1);

  $output = '<ul class="menu product-category">';
  foreach ($tree as $term) {
    $safe_term = pathauto_cleanstring($term->name);
    $class = ($current_category==$safe_term) ? ' class="active"' : '';
    $output .= '<li><a' . $class . ' href="/drupal//path/to/' . $safe_term . '">' . $term->name . '</a></li>';
  }
  $output .= '</ul>';

  return $output;
}

Funkcja get_category_menu jest lepsza jako blok, ale dla wygody jest pokazana tutaj jako inna funkcja w template.php.

Mam nadzieję, że to pomaga lub jest przynajmniej krokiem w kierunku rozwiązania.

Paweł

paul.linney
źródło