Jak dodać klasy CSS do bloku generowanego przez widoki? (NIE do generowanej treści, sam blok!)

8

Nie wiem dlaczego, ale widoki nie dodają nazw klas CSS „czytelnych dla człowieka” (takich jak np. Nazwa komputera widoku) do tworzonych bloków ( dodaje klasy tylko do wygenerowanej części „treści”, gdy dodawanie klas do części „ Klasa CSS ” w edytorze widoków (patrz zrzuty ekranu poniżej!)).
Dodaje tylko zwykłe block block-viewsi prawdopodobnie contextual-links-regionklasy CSS do bloku (bloków) i generuje unikalny identyfikator (nie klasy), taki jak ten: block-views-3d8f7966168beeec655c8ead69336789(ponieważ jego delta to wygenerowany kod skrótu).
Nie ma sensu pisać reguł CSS dla tych klas i identyfikatorów (jak .block-views-3d8f7966168beeec655c8ead69336789 { /* ... */ }), ponieważ te klasy / identyfikatory mogą ulec zmianie podczas zmiany bloku Widoki.

Jak mogę dodać niektóre niestandardowe klasy CSS w implementacji hook_block_view_alter(), jeśli nie mogę nawet zidentyfikować tych bloków z powodu ich wygenerowanej delty skrótu?


Nie chcę używać klasy bloku , ponieważ uważam, że to jak przesada w dodawaniu niektórych klas do jednego lub dwóch bloków generowanych przez widoki (BTW sprawdziłem moduł i czuję, że SELECT css_class, module, delta FROM {block_class}zapytanie jest block_class_preprocess_block()jak przesada, ponieważ sprawdza WSZYSTKIE dodane klasy, nawet jeśli blok jest ukryty ...).

Chciałbym więc rozwiązać to z własnego modułu.


EDYTOWAĆ

Przykład:

Mój widok z nazwą komputera i dodanymi klasami CSS: Widok - nazwa i klasa maszyny

Wygenerowany kod HTML bloku w inspektorze: Widok - wygenerowany kod HTML bloku w inspektorze

Sk8erPeter
źródło

Odpowiedzi:

7

Pierwszy. Masz „skrót” - ponieważ wyświetlana nazwa komputera jest za długa.

Po drugie - możesz dodać własne klasy do obejrzenia

wprowadź opis zdjęcia tutaj

Gaydabura
źródło
Zrzut ekranu, który masz według widoków bloków, prawda?
cherouvim
nie - jest na stronie edycji widoku - admin / structure / views / view / [youviewname]
Gaydabura,
1
„Masz„ skrót ”- ponieważ wyświetlana nazwa komputera jest za długa.” - i dlaczego to ma znaczenie? Mogę bez żadnych problemów dodawać reguły w arkuszach stylów CSS do NAPRAWDĘ długich nazw klas ... Oznaczona przez ciebie część „Klasa CSS” NIE jest poprawna, ponieważ klasy te są generowane tylko w części „treść” - to zacząłem pytanie z! Muszę więc dodać klasy do opakowania zawartości. Zobacz zrzuty ekranu, które właśnie wkleiłem w pierwotnym pytaniu.
Sk8erPeter,
ok. w tym przypadku najprostszym sposobem jest utworzenie niestandardowych szablonów dla bloku - chcesz zmienić. ten link może być przydatny drupal.org/node/1089656 - wyjaśnia sugestie dotyczące nazwy szablonu
Gaydabura,
Ale w ten sposób musiałem użyć block--views--3d8f7966168beeec655c8ead69336789.tpl.phppliku, aw tym przypadku jestem w tym samym momencie, jak gdybym użył if($variables['block']->delta == '3d8f7966168beeec655c8ead69336789')warunku hook_preprocess_block(). Właśnie tego chciałem uniknąć, ponieważ myślałem, że mogę użyć w haczyku bardziej czytelnej dla człowieka nazwy. Na przykład, jeśli chcę przenieść widok do innego z tymi samymi parametrami, usuwam poprzedni, ale używam tej samej nazwy komputera i klas CSS, ale wygenerowany unikatowy skrót zmienia się? W takim przypadku tracę modyfikacje.
Sk8erPeter,
2

To stare pytanie, ale nie ma właściwej odpowiedzi. Natknąłem się na ten sam problem. Rozwiązaniami, o których mogłem pomyśleć, był selektor nadrzędny CSS (który jeszcze nie istnieje) LUB pewne manipulacje Drupalem.

Dodałem hook_preprocess_block, aby dodać opakowującą klasę CSS do wszystkich bloków widoku, które definiują klasę CSS. To nie jest trywialne, więc umieszczę tutaj mój kod. Może nie działać ze wszystkimi blokami widoku, jeśli masz problem z tym kodem, możesz go zaktualizować i opublikować własną wersję.

Przykład: Widok z klasą CSS „test” będzie zawarty w bloku z klasą 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";
                }
            }
        }
    }
}
Gael Lafond
źródło
1

Dla mnie hook_preprocess_block()nie działało. (Może dlatego, że musiałem dodać blok bezpośrednio z pliku szablonu przez views_embed_view().)

Jednak hook_preprocess_views_view()przy prostym sprawdzeniu, $vars['view']->current_displayczy zadziałało:

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';
  }
}
leymannx
źródło
0

Najprostszym sposobem było zduplikowanie pliku block.tpl.php, zmiana jego nazwy, block--myregion.tpl.phpa następnie dodanie w nim moich klas.

Zobacz: strona Bloki tematyczne .

Ricardo Silva
źródło