Puncte:0

theme_preprocess_menu nu vede meniul principal

drapel in

Context: am un site web de eveniment unde vreau să ascund elementul de meniu de înregistrare la eveniment când înregistrarea pentru eveniment este închisă.

theme_preprocess_menu nu se declanșează pe nimic, cu excepția „menu__toolbar”. Codul:

funcția myTheme_preprocess_menu(&$variabile, $hook) {
  dpm($hook);
}

oferă doar rezultatul „menu__toolbar” pe orice pagină în care tema mea este activă. Tema mea se bazează pe Bartik.

Cum îl fac să se declanșeze în meniul principal?

leymannx avatar
drapel ne
Este doar `hook_preprocess_menu(&$variables)` fără `$hook` și apoi `dpm($variables);`. Numele temei trebuie să conțină numai litere mici și liniuțe de subliniere. Ai golit memoria cache? Același cârlig este declanșat de la un modul personalizat? Unde ai pus exact carligul? Meniul principal este vizibil în prezent pe pagina pe care o verificați? Actualizați-vă întrebarea pentru clarificare.
No Sssweat avatar
drapel ua
Încercați cu **[hook_menu_links_discovered_alter](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Menu%21menu.api.php/function/hook_menu_links_discovered_alter/9.3.x)**
No Sssweat avatar
drapel ua
Dar soluția mai potrivită ar fi să refuzi accesul cu **[hook_entity_access](https://www.prometsource.com/blog/how-manage-hook-entity-access-with-drupal)**, ca atunci când accesul este interzis, ascunde linkul automat.
apaderno avatar
drapel us
Funcțiile de preprocesare primesc trei argumente de la [`ThemeManager::render()`](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Theme%21ThemeManager.php/function/ThemeManager%3A %3Arender/9.3.x), care le numește `$preprocessor_function($variables, $hook, $info);`. Totuși, valoarea lui `$hook` este stocată și în `$variables['theme_hook_original']`; nu este nevoie să folosiți al doilea parametru și de aceea funcțiile de preprocesare nu îl folosesc de obicei.
apaderno avatar
drapel us
Pentru a ascunde un element de meniu, este mai bine să îi schimbați valoarea #access, așa cum a spus @NoSssweat. O funcție de preprocesare ar fi prea târziu pentru aceasta și ar fi un cârlig greșit de utilizat, deoarece scopul ei este schimbarea modului în care este redat un element.
drapel in
Multumesc foarte mult. hook_entity_access rezolvă una dintre problemele mele cu grijă (cea pe care am descris-o mai sus). Există un alt element de meniu pe care aș dori să-l ascund, dar să nu îl dezactivez: „login”. Odată ce evenimentul este închis, nimeni, cu excepția administratorului, nu trebuie să se autentifice, așa că aș dori să-l ascund, dar totuși permit administratorului să folosească /user/login pentru a accesa site-ul.
Puncte:0
drapel us

În ce intri $hook nu spune pentru ce meniu este apelată funcția de preprocesare. Este simplă o sugestie pe care o primește Drupal ThemeManager::render().

  // Invocă hook_theme_suggestions_HOOK().
  $suggestions = $this->moduleHandler->invokeAll('theme_suggestions_' . $base_theme_hook, [
    $variabile,
  ]);

  // Dacă implementarea temei a fost invocată cu o sugestie directă a temei
  // cum ar fi '#theme' => 'node__article', adăugați-l la matricea de sugestii înainte
  // invocând sugestia alter hooks.
  if (isset($info['carlig de bază'])) {
    $sugestii[] = $hook;
  }

  // Invocă hook_theme_suggestions_alter() și
  // hook_theme_suggestions_HOOK_alter().
  $hooks = [
    „sugestii_teme”,
    'temă_sugestii_' . $base_theme_hook,
  ];
  $this->moduleHandler->alter($hooks, $suggestions, $variables, $base_theme_hook);
  $this->alter($hooks, $sugestii, $variables, $base_theme_hook);

  // Verificați dacă fiecare sugestie există în registrul de teme și, dacă da,
  // folosiți-l în locul cârligului de bază. De exemplu, o funcție poate folosi
  // '#theme' => 'nod', dar un modul poate adăuga 'node__article' ca sugestie
  // prin hook_theme_suggestions_HOOK_alter(), permițând ca o temă să aibă
  // un fișier șablon alternativ pentru nodurile articol.
  foreach (array_reverse($sugestii) ca $sugestie) {
    dacă ($theme_registry->are($sugestie)) {
      $info = $theme_registry->get($sugestie);
      pauză;
    }
  }

olivero_theme_suggestions_menu_alter() este unul dintre cârligele care modifică sugestiile pentru fișierul șablon de meniu. Ar putea exista un modul care să facă o sugestie similară, în cazul dvs.

funcția olivero_theme_suggestions_menu_alter(&$sugestii, matrice $variabile) {
  if (isset($variables['atribute']['regiune'])) {
    $suggestions[] = 'meniu__' . $variables['atribute']['regiune'];
  }
}

Ceea ce căutați este numele aparatului de meniu, stocat în $variables['nume_meniu'] așa cum este documentat în menu.html.twig.

Dacă scopul este ascunderea unui element de meniu, utilizarea acelui cârlig de preprocesare nu este soluția. Pentru a ascunde un element de meniu este suficient, de exemplu, pentru a evita ca utilizatorul conectat în prezent să aibă acces la ruta folosită pentru acel element de meniu. În acest caz, Drupal nu va afișa elementul de meniu.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.