Jak dynamicznie dodawać klasy do znacznika BODY na podstawie ścieżki / głębokości strony?

22

Jak dynamicznie dodawać klasy do znacznika body, tak jak w tym przykładzie poniżej?

-Home
-Cities      
--Melbourne       <body class="melbourne">
--- parki tematyczne       <body class="melbourne theme_parks">
--- restauracje       <body class="melbourne restaurants">
--new York       <body class="new_york">
--- parki tematyczne       <body class="new_york theme_parks">
--- restauracje       <body class="new_york restaurants">
-Kontakt z nami       <body class="contact_us">

Drupal nowicjusz tutaj i bez programowania. Dlatego byłbym bardzo wdzięczny, gdybyś mógł podać jak najwięcej szczegółów podczas udostępniania rozwiązania.

kyooriouskoala
źródło

Odpowiedzi:

37

Aby objaśnić odpowiedź Nikhila Mohana, możesz zaimplementować go template_preprocess_html()w pliku template.php kompozycji. Przeczytaj dokumentację na temat przesłonięcia wyjścia tematycznego, aby zrozumieć podstawy tego, co się tutaj dzieje.

W ramach tej funkcji masz dostęp do zmiennej $vars['classes_array'], która zawiera listę klas, które zostaną zastosowane do <body>znacznika HTML na stronie.

Niestety informacje o lokalizacji bieżącej strony w menu nie są natychmiast dostępne. Możesz użyć, menu_get_item()a następnie menu_get_ancestors()uzyskać te informacje, ale jest to duża moc obliczeniowa dla czegoś, co prawdopodobnie możemy uzyskać dzięki podejściu opartemu na uproszczeniu.

Zakładając, że używasz modułu pathauto do automatycznego tworzenia ścieżek semantycznych dla swoich stron z treściami na podstawie ścieżki menu (tj. Strona parków rozrywki w Melbourne miałaby ścieżkę „melbourne / theme_parks”), możesz użyć ścieżki strony do stworzenia klas, które szuka:

function THEMENAME_preprocess_html(&$vars) {
  $path = drupal_get_path_alias();
  $aliases = explode('/', $path);

  foreach($aliases as $alias) {
    $vars['classes_array'][] = drupal_clean_css_identifier($alias);
  } 
}

to jest to! Drupal spojrzy teraz na alias ścieżki bieżącej strony i doda klasę do <body>tagu dla każdego fragmentu aliasu ścieżki.

sheena_d
źródło
1
Jeśli ścieżki nie działają, wówczas opcją jest także parsowanie menu_get_active_breadcrumb . Prawdopodobnie w statictym momencie jest w pamięci podręcznej, więc prawie nie ma narzutu.
mpdonadio
3
Dziękuję wszystkim, szczególnie @sheena_d za wyjaśnienie, a także kod! Musiałem trochę poszukać, jak sprawić, by działał na Omega Theme i udało się go uruchomić: D To jest linia, która sprawi, że będzie działać na Omega Theme: $vars['attributes_array']['class'][] = drupal_clean_css_identifier($alias);
kyooriouskoala
1

Możesz wykorzystać template_preprocess_html, które zmienne Przetwarzania wstępnego dla html.tpl.php

Zobacz także html.tpl.php

Domyślna implementacja motywu wyświetlająca podstawową strukturę HTML pojedynczej strony Drupal

niksmac
źródło
1

Oto moduł dodawania klas do znacznika body na podstawie roli lub stron.

Common Body Class

Thakur Sanjay Singh Chauhan
źródło
0

W tym celu utworzono moduł Drupal Body Classes . Twórz problemy, aby dodać więcej punktów integracji klasy ciała.

RobLoach
źródło