場合によっては、template.phpのsidebar_first領域をプログラムで削除する必要があります。だから、私は次のようなことをしています:
function template_preprocess_page(&$variables) {
if(my_condition){
unset($variables['page']['sidebar_first']);
}
}
これは確かにサイドバーを削除しますが、ボディクラスは変更しません。だから、私はまだクラスがあります
body.two-sidebars
...そのうちの1つを設定解除した場合でも(適切なクラスはbody.one-sidebarになります)。
プログラムでサイドバーを削除し、ボディクラスを適切に変更するにはどうすればよいですか?
(さまざまな理由で、新しいテンプレートの提案を作成してサイドバーを変更することを推奨しないでください。私の場合は機能しません。プログラムで領域を削除する方法を具体的に尋ねています)
私は基本的に、問題は2つの異なるtemplate.php関数で実行する必要があることを理解しました:template_preprocess_page(サイドバーを削除するため)およびtemplate_preprocess_html(不要なボディクラスを取り除くため)。
したがって、最初にpreprocess_pageで:
$variables['page']['sidebar_first'] = NULL;
次に、preprocess_htmlでmenu_get_object()を使用してノード情報を取得し、ノードデータで状態を確認してから、$ variables ['classes_array']を解析して、手動で「two-sidebars」クラスを置き換え、必要なものを追加しました。
Sheesh。はるかに簡単になるはずですが、他の回答の人たちには、それが本来あるべきほど単純ではないことを確認するのを助けてくれたことに感謝します。
デフォルトを見れば template_preprocess_html
、表示されます
// Add information about the number of sidebars.
if (!empty($variables['page']['sidebar_first']) && !empty($variables['page']['sidebar_second'])) {
$variables['classes_array'][] = 'two-sidebars';
}
elseif (!empty($variables['page']['sidebar_first'])) {
$variables['classes_array'][] = 'one-sidebar sidebar-first';
}
elseif (!empty($variables['page']['sidebar_second'])) {
$variables['classes_array'][] = 'one-sidebar sidebar-second';
}
else {
$variables['classes_array'][] = 'no-sidebars';
}
この動作を望まない場合は、後で実行する独自のバージョンを実装する必要があります。次に、状態を確認し、$variables['classes_array']
必要に応じて。
必要な情報は$variabless['classes_array']
にあり、ボディクラスの配列が含まれています。値が2つのサイドバーになっているものを削除するだけです。