Comment ajouter des classes CSS à un bloc généré par Views? (PAS à son contenu généré, le bloc lui-même!)

8

Je ne sais pas pourquoi, mais Views n'ajoute pas de noms de classes CSS "lisibles par l'homme" (comme par exemple le nom de la machine de la vue) aux blocs qu'il crée ( il ajoute uniquement ses classes à la partie "contenu" générée lorsque ajout de classes à la partie " classe CSS " dans l'éditeur de vue (voir les captures d'écran ci-dessous!)).
Il ajoute uniquement les classes habituelles block block-viewset éventuellement contextual-links-regionCSS aux blocs et génère un identifiant unique (pas une classe) comme ceci: block-views-3d8f7966168beeec655c8ead69336789(car son delta est ce code de hachage généré).
Cela n'a pas de sens d'écrire des règles CSS pour ces classes et id (comme .block-views-3d8f7966168beeec655c8ead69336789 { /* ... */ }), car ces classes / id peuvent changer lors de la modification du bloc Views.

Comment puis-je ajouter des classes CSS personnalisées dans une implémentation de hook_block_view_alter(), si je ne peux même pas identifier ces blocs en raison de leur delta de hachage généré?


Je ne veux pas utiliser Block Class , car je pense que c'est comme une surpuissance pour simplement ajouter des classes à un ou deux blocs générés par Views (BTW j'ai vérifié le module, et je sens que la SELECT css_class, module, delta FROM {block_class}requête est block_class_preprocess_block()comme une surpuissance, car elle vérifie TOUS les classes ajoutées, même si le bloc est caché ...).

Je voudrais donc le résoudre à partir de mon propre module.


ÉDITER

Un exemple:

Ma vue avec le nom de la machine et les classes CSS ajoutées: Vue - nom et classe de la machine

Le code HTML du bloc généré dans l'inspecteur: Affichage - code HTML du bloc généré dans l'inspecteur

Sk8erPeter
la source

Réponses:

7

Première. Vous avez "hachage" - car vous voyez que le nom de la machine est trop long.

Deuxièmement - vous pouvez ajouter vos propres classes pour afficher

entrez la description de l'image ici

Gaydabura
la source
Cette capture d'écran que vous avez concernant les blocs de vue, non?
cherouvim
non - c'est sur la page d'édition des vues - admin / structure / views / view / [youviewname]
Gaydabura
1
"Vous avez" hachage "- parce que vous voyez que le nom de la machine est trop long." - et pourquoi est-ce important? Je peux également ajouter des règles dans les feuilles de style CSS aux noms de classe VRAIMENT longs sans aucun problème ... La partie "classe CSS" que vous avez marquée n'est PAS correcte, car ces classes ne sont générées que dans la partie "contenu" - c'est ce que j'ai commencé ma question avec! Je dois donc ajouter des classes à l' encapsuleur du contenu. Voir les captures d'écran que je viens de coller dans la question d'origine.
Sk8erPeter
D'accord. dans ce cas, la manière la plus simple est de créer des modèles personnalisés pour le bloc - vous voulez changer. ce lien peut être utile drupal.org/node/1089656 - il explique les suggestions de noms de modèles
Gaydabura
Mais de cette façon, j'ai dû utiliser un block--views--3d8f7966168beeec655c8ead69336789.tpl.phpfichier, et dans ce cas, je suis au même point que si j'avais utilisé une if($variables['block']->delta == '3d8f7966168beeec655c8ead69336789')condition dans hook_preprocess_block(). C'est ce que je voulais éviter, car je pensais pouvoir utiliser un nom plus lisible par l'homme dans mon crochet. Par exemple, que se passe-t-il si je souhaite déplacer la vue dans une autre avec les mêmes paramètres, je supprime la précédente, mais utilise le même nom de machine et les mêmes classes CSS, mais le hachage unique généré change? Dans ce cas, je perds mes modifications.
Sk8erPeter
2

C'est une vieille question, mais il n'y a pas de bonne réponse. J'ai rencontré le même problème. Les solutions auxquelles je pouvais penser étaient le sélecteur parent CSS (qui n'existe pas encore) OU une manipulation Drupal.

J'ai ajouté un hook_preprocess_block pour ajouter une classe CSS wrapper à tous les blocs de vue qui définissent une classe CSS. Ce n'est pas anodin, je vais donc mettre mon code ici. Il peut ne pas fonctionner avec tous les blocs de vue, si vous avez un problème avec ce code, n'hésitez pas à le mettre à jour et à publier votre propre version.

Exemple: La vue avec la classe CSS "test" sera contenue dans un bloc avec la classe 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
la source
1

Pour moi hook_preprocess_block(), ça n'a pas marché. (Peut-être parce que j'ai dû ajouter le bloc directement à partir d'un fichier de modèle via views_embed_view().)

Cependant, hook_preprocess_views_view()avec une simple vérification, $vars['view']->current_displaycela a fonctionné:

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
la source
0

La façon la plus simple pour moi était de dupliquer le fichier block.tpl.php, de le renommer block--myregion.tpl.phppuis d'y ajouter mes classes.

Voir: page Blocs thématiques .

Ricardo Silva
la source