ページのパス/深さに基づいてクラスをBODYタグに動的に追加する方法は?


22

以下のこの例のように、クラスをbodyタグに動的に追加する方法は?

-ホーム
-      
都市<body class="melbourne">
- メルボルン       ---テーマパーク       <body class="melbourne theme_parks">
---レストラン       <body class="melbourne restaurants">
-ニューヨーク       <body class="new_york">
---テーマパーク       <body class="new_york theme_parks">
---レストラン-お       <body class="new_york restaurants">
問い合わせ       <body class="contact_us">

Drupal初心者はここで、プログラミングの背景はありません。したがって、ソリューションを共有するときにできる限り詳細に説明していただければ幸いです。

回答:


37

Nikhil Mohanの答えを詳しく説明するtemplate_preprocess_html()には、テーマのtemplate.phpファイル内に実装できます。Themable Outputのオーバーライドに関するドキュメントを読んで、ここで行われていることの基本を理解してください。

この関数内では、ページの$vars['classes_array']HTML <body>タグに適用されるクラスのリストを保持する変数にアクセスできます。

残念ながら、メニュー内の現在のページの場所に関する情報はすぐには利用できません。この情報を取得するためにを使用することもできますがmenu_get_item()、それmenu_get_ancestors()はおそらくシンプラーアプローチを使用して取得できるものの処理能力の多くです。

pathautoモジュールを使用して、メニューパスに基づいてコンテンツページのセマンティックパスを自動的に作成すると仮定します(つまり、Melbourne Theme Parksページにはパス 'melbourne / theme_parks'があります)。ページのパスを使用してクラスを作成できます探している:

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

それでおしまい。Drupalは現在のページのパスエイリアスを確認し、パスエイリアスの<body>各チャンクのタグにクラスを追加します。


1
パスが機能しない場合、menu_get_active_breadcrumbの解析もオプションになります。staticその時点でキャッシュにある可能性が高いため、オーバーヘッドはほとんどありません。
mpdonadio

3
皆さん、特に説明とコードについて@sheena_dに感謝します!オメガのテーマで動作させる方法について少し検索しなければならなかったし、それを動作させることができました:Dこれはオメガのテーマで動作させるための行です: $vars['attributes_array']['class'][] = drupal_clean_css_identifier($alias);
kyooriouskoala



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.