web-dev-qa-db-ja.com

CSSクラスをビュー生成ブロックに追加する方法は? (生成されたコンテンツではなく、ブロック自体!)

理由はわかりませんが、ビューは、「人間が読める」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クラスを含む私のビュー: View - machine name and class

インスペクターで生成されたブロックのHTMLコード: View - generated block's HTML code in the inspector

8
Sk8erPeter

最初。マシン名が長すぎるため、「ハッシュ」があります。

次に、独自のクラスを追加して表示できます

enter image description here

7
Gaydabura

それは古い質問ですが、適切な答えはありません。私は同じ問題に出くわしました。私が考えることができるソリューションは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";
                }
            }
        }
    }
}
2
Gael Lafond

このためのモジュールがあります。

ブロックトップクラスを表示

Screenshot from module page

1
Kevin Siji

私にとって 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';
  }
}
1
leymannx

私にとって最も簡単な方法は、block.tpl.phpファイルを複製し、名前をblock--myregion.tpl.phpに変更してから、その中にクラスを追加することでした。

参照: ブロックのテーマ設定ページ

0
Ricardo Silva