Wie füge ich dynamisch Klassen zum BODY-Tag hinzu, basierend auf dem Seitenpfad / der Seitentiefe?

22

Wie man dynamisch Klassen zum Body-Tag hinzufügt, wie in diesem Beispiel unten?

-Home
-Städte -      
Melbourne       <body class="melbourne">
--- Themenparks       <body class="melbourne theme_parks">
--- Restaurants -       <body class="melbourne restaurants">
New York       <body class="new_york">
--- Themenparks       <body class="new_york theme_parks">
--- Restaurants       <body class="new_york restaurants">
-Kontaktieren Sie uns       <body class="contact_us">

Drupal-Neuling hier und ohne Programmierhintergrund. Daher würde ich mich sehr freuen, wenn Sie beim Teilen einer Lösung so detailliert wie möglich sein könnten.

Kyooriouskoala
quelle

Antworten:

37

Um die Antwort von Nikhil Mohan zu erläutern, können Sie sie template_preprocess_html()in die template.php-Datei Ihres Themas implementieren . Lesen Sie die Dokumentation zu Overriding Themable Output , um die Grundlagen der hier beschriebenen Vorgänge zu verstehen.

Innerhalb dieser Funktion haben Sie Zugriff auf die Variable $vars['classes_array'], die eine Liste von Klassen enthält, die auf das HTML- <body>Tag auf der Seite angewendet werden .

Leider sind Informationen zur Position der aktuellen Seite im Menü nicht sofort verfügbar. Sie könnten menu_get_item()und dann verwenden menu_get_ancestors(), um diese Informationen zu erhalten, aber das ist eine Menge Rechenleistung für etwas, das wir wahrscheinlich mit einem Simpiler-Ansatz erreichen können.

Angenommen, Sie verwenden das pathauto-Modul, um automatisch semantische Pfade für Ihre Inhaltsseiten basierend auf dem Menüpfad zu erstellen (dh Ihre Melbourne Theme Parks-Seite würde den Pfad 'melbourne / theme_parks' haben), können Sie den Pfad der Seite verwenden, um die von Ihnen gewählten Klassen zu erstellen sind auf der Suche nach:

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

Das ist es. Drupal überprüft nun den Pfadalias der aktuellen Seite und fügt dem <body>Tag für jeden Abschnitt des Pfadalias eine Klasse hinzu .

sheena_d
quelle
1
Wenn Pfade nicht funktionieren, ist das Parsen von menu_get_active_breadcrumb ebenfalls eine Option. Es ist staticzu diesem Zeitpunkt wahrscheinlich im Cache, also fast kein Overhead.
mpdonadio
3
Vielen Dank an alle, besonders an @sheena_d für die Erklärung und den Code! Musste ein bisschen suchen, wie es bei Omega Theme funktioniert und habe es geschafft, es zum $vars['attributes_array']['class'][] = drupal_clean_css_identifier($alias);
Laufen
1

Sie können verwenden template_preprocess_html, welche Preprocess-Variablen für html.tpl.php verwendet werden

Siehe auch html.tpl.php

Standard-Theme-Implementierung zur Anzeige der grundlegenden HTML-Struktur einer einzelnen Drupal-Seite

Niksmac
quelle
1

Hier ist das Modul zum Hinzufügen von Klassen zu Body-Tags basierend auf Rollen oder Seiten.

Gemeinsame Körperklasse

Thakur Sanjay Singh Chauhan
quelle
0

Erstellt das Body Classes Drupal-Modul , um dies zu unterstützen. Fühlen Sie sich frei, Probleme zu erstellen, um weitere Integrationspunkte für die Körperklasse hinzuzufügen.

RobLoach
quelle