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 seulement ses classes à la partie générée "contenu" lors de l'ajout de classes à la partie " classe CSS" dans l'éditeur de vue ( voir les captures d'écran ci-dessous!)).
Il ajoute uniquement les classes CSS habituelles block block-views
, Et éventuellement contextual-links-region
CSS au (x) bloc (s), et génère un identifiant unique (pas de 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 ids (comme .block-views-3d8f7966168beeec655c8ead69336789 { /* ... */ }
), Car ces classes/ids 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 quelques classes à une ou deux Blocs générés par les vues (BTW j'ai vérifié le module, et je sens que SELECT css_class, module, delta FROM {block_class}
Interroger dans block_class_preprocess_block()
comme une surpuissance, car il vérifie TOUTES 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:
Première. Vous avez "hachage" - parce que vous voyez que le nom de la machine est trop long.
Deuxièmement - vous pouvez ajouter vos propres classes pour afficher
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) OR some Drupal manipulation).
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";
}
}
}
}
}
Il existe un module à cet effet.
Pour moi hook_preprocess_block()
n'a pas fonctionné. (Peut-être parce que je devais 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 de $vars['view']->current_display
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';
}
}
La façon la plus simple pour moi était de dupliquer le fichier block.tpl.php, de le renommer en block--myregion.tpl.php
puis ajoutez mes classes à l'intérieur.
Voir: page Blocs thématiques .