Sayfa yolunu / derinliğini temel alarak BODY etiketine dinamik olarak sınıflar nasıl eklenir?


22

Aşağıdaki bu örnekte olduğu gibi vücut etiketine dinamik olarak sınıflar nasıl eklenir?

-Ev
-Şehirler -      
Melbourne       <body class="melbourne">
--- Tema Parkları       <body class="melbourne theme_parks">
--- Restoranlar -       <body class="melbourne restaurants">
New York       <body class="new_york">
--- Tema Parkları       <body class="new_york theme_parks">
--- Restoranlar       <body class="new_york restaurants">
-İletişim       <body class="contact_us">

Drupal acemi burada ve arka plan programlama olmadan. Bu nedenle, bir çözümü paylaşırken mümkün olduğunca ayrıntılı olabilirseniz çok sevinirim.

Yanıtlar:


37

Nikhil Mohan'ın cevabını açıklamak template_preprocess_html()için temanızın template.php dosyasının içine uygulayabilirsiniz . Burada olup bitenlerin temelini anlamak için Tematik Çıktıların Geçersiz Kılınması belgesini okuyun .

Bu işlev içinde , sayfadaki $vars['classes_array']HTML <body>etiketine uygulanacak sınıfların listesini içeren değişkene erişebilirsiniz .

Ne yazık ki, geçerli sayfanın menüdeki konumu ile ilgili bilgiler hemen mevcut değil. Bu bilgiyi almak için menu_get_item()ve sonra kullanabilirsiniz menu_get_ancestors(), ancak bu muhtemelen bir simpiler yaklaşımıyla ulaşabileceğimiz bir şey için çok fazla işlem gücüdür.

Menü yolunu temel alarak içerik sayfalarınız için otomatik olarak anlamsal yollar oluşturmak için pathauto modülünü kullandığınızı varsayalım (yani, Melbourne Tema Parkları sayfanızda 'melbourne / theme_parks' yolunu bulabilir), siz sınıfları oluşturmak için sayfanın yolunu kullanabilirsiniz. arıyoruz:

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

Bu kadar. Drupal şimdi geçerli sayfanın yol diğer adına bakacak ve yol diğer adının <body>her bir parçası için etikete bir sınıf ekleyecektir .


1
Yollar işe yaramazsa, menu_get_active_breadcrumb öğesinin ayrıştırılması da bir seçenek olabilir. Bu staticnoktada önbellekte olması muhtemeldir , bu nedenle neredeyse hiç ek yükü yoktur.
mpdonadio

3
Hepinize, özellikle de kodun yanı sıra açıklama için @sheena_d! Omega $vars['attributes_array']['class'][] = drupal_clean_css_identifier($alias);
Tema'da



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.