理由はわかりませんが、ビューは、「人間が読める」CSSクラス名(ビューのマシン名など)を作成するブロックに追加しません( 「CSSクラス」にクラスを追加するときに、生成された「コンテンツ」パートにクラスを追加ビューエディターの一部です(下のスクリーンショットを参照してください!))。
通常の_block block-views
_、および_contextual-links-region
_ CSSクラスのみをブロックに追加し、次のような一意のID(クラスではない)を生成します:_block-views-3d8f7966168beeec655c8ead69336789
_(そのデルタは、この生成されたハッシュコードであるためです)。
ビューブロックを変更するとこれらのクラス/ IDが変更される可能性があるため、これらのクラスおよびID(_.block-views-3d8f7966168beeec655c8ead69336789 { /* ... */ }
_など)のCSSルールを記述することは意味がありません。
生成されたハッシュデルタのためにこれらのブロックを識別できない場合、hook_block_view_alter()
の実装にカスタムCSSクラスを追加するにはどうすればよいですか?
Block Classを使用したくありません。1つまたは2つのクラスにいくつかのクラスを追加するだけでは、やり過ぎのように感じるからです。ビューが生成したブロック(モジュールをチェックしましたが、block_class_preprocess_block()
の_SELECT css_class, module, delta FROM {block_class}
_クエリは、ブロックが非表示であっても、追加されたすべてのクラスをチェックするため、やりすぎのように感じます...) 。
だから私は自分のモジュールからそれを解決したいと思います。
編集
例:
最初。マシン名が長すぎるため、「ハッシュ」があります。
次に、独自のクラスを追加して表示できます
それは古い質問ですが、適切な答えはありません。私は同じ問題に出くわしました。私が考えることができるソリューションはCSSの親セレクター(まだ存在しません)でしたOR some Drupal操作。
CSSクラスを定義するすべてのビューブロックにラッパーCSSクラスを追加するために、hook_preprocess_blockを追加しました。これは簡単ではないので、ここにコードを配置します。すべてのビューブロックで機能しない場合があります。このコードに問題がある場合は、自由に更新して独自のバージョンを投稿してください。
例:CSSクラス「test」のビューは、CSSクラス「test-wrapper」のブロックに含まれます。
function <MY_THEME>_preprocess_block(&$variables) {
$default_display_id = 'default';
// Trying to access the field:
// $display_id = $variables['elements']['#views_contextual_links_info']['views_ui']['view_display_id']
// $default_display = $variables['elements']['#views_contextual_links_info']['views_ui']['view']->display['default']->display_options['css_class']
// $display = $variables['elements']['#views_contextual_links_info']['views_ui']['view']->display[$display_id]->display_options['css_class']
if (isset($variables['elements']['#views_contextual_links_info']['views_ui'])) {
$view_ui = $variables['elements']['#views_contextual_links_info']['views_ui'];
if (isset($view_ui['view_display_id'])) {
$display_id = $view_ui['view_display_id'];
if (isset($view_ui['view']) && property_exists($view_ui['view'], 'display') && isset($view_ui['view']->display[$display_id])) {
$default_css_class = NULL;
if (isset($view_ui['view']->display[$default_display_id])) {
$default_display = $view_ui['view']->display[$default_display_id];
if (property_exists($default_display, 'display_options') && isset($default_display->display_options['css_class'])) {
$default_css_class = $default_display->display_options['css_class'];
}
}
$view_css_class = NULL;
$display = $view_ui['view']->display[$display_id];
if (property_exists($display, 'display_options') && isset($display->display_options['css_class'])) {
$view_css_class = $display->display_options['css_class'];
}
$css_class = $view_css_class ? $view_css_class : $default_css_class;
if ($css_class) {
$variables['classes_array'][] = "$css_class-wrapper";
}
}
}
}
}
このためのモジュールがあります。
私にとって hook_preprocess_block()
は機能しませんでした。 (多分私は views_embed_view()
を介してテンプレートファイルから直接ブロックを追加しなければならなかったためです。)
ただし、 hook_preprocess_views_view()
の単純なチェックで$vars['view']->current_display
は機能しました。
function MYMODULE_preprocess_views_view(&$vars) {
// 'MYBLOCK' usually comes as 'block' if this view only has one
if ($vars['view']->name == 'MYVIEW' && $vars['view']->current_display == 'MYBLOCK') {
// here I add a class that contains the current theme's name
global $theme;
$theme_name = array_pop(explode('/', (drupal_get_path('theme', $theme))));
$vars['classes_array'][] = $theme_name.'-theme';
// but you can simply do the following as well
$vars['classes_array'][] = 'MYSTRING';
}
}
私にとって最も簡単な方法は、block.tpl.phpファイルを複製し、名前をblock--myregion.tpl.php
に変更してから、その中にクラスを追加することでした。
参照: ブロックのテーマ設定ページ 。