Как добавить классы CSS в блок, сгенерированный Views? (НЕ для его сгенерированного контента, а самого блока!)

8

Я не знаю почему, но Views не добавляет «читаемые человеком» имена классов CSS (например, имя компьютера представления) в блоки, которые он создает ( он только добавляет свои классы в сгенерированную часть «content», когда добавление классов в раздел « CSS-класс » в редакторе представлений (см. скриншоты ниже!)).
Он только добавляет обычные block block-viewsи, возможно, contextual-links-regionCSS-классы к блоку (-ам) и генерирует уникальный идентификатор (не класс), например: block-views-3d8f7966168beeec655c8ead69336789(потому что его дельта - это сгенерированный хэш-код).
Не имеет смысла писать правила CSS для этих классов и идентификаторов (например .block-views-3d8f7966168beeec655c8ead69336789 { /* ... */ }), потому что эти классы / идентификаторы могут измениться при изменении блока Views.

Как я могу добавить некоторые пользовательские классы CSS в реализацию hook_block_view_alter(), если я не могу даже идентифицировать эти блоки из-за их сгенерированной дельты хеша?


Я не хочу использовать Block Class , потому что чувствую, что это просто излишнее добавление некоторых классов к одному или двум блокам, сгенерированным представлениями (кстати, я проверил модуль и чувствую SELECT css_class, module, delta FROM {block_class}запрос block_class_preprocess_block()как излишнее, потому что он проверяет ВСЕ добавлены классы, даже если блок скрыт ...).

Поэтому я хотел бы решить это из моего собственного модуля.


РЕДАКТИРОВАТЬ

Пример:

Мой взгляд с именем машины и добавленными классами CSS: Вид - имя машины и класс

HTML-код сгенерированного блока в инспекторе: View - сгенерированный HTML-код блока в инспекторе

Sk8erPeter
источник

Ответы:

7

Первый. У вас есть "хэш" - потому что вы видите имя машины слишком длинное.

Второе - вы можете добавить свои собственные классы для просмотра

введите описание изображения здесь

Gaydabura
источник
Этот скриншот у вас есть в отношении блоков просмотра, верно?
Черувим
нет - это на редактирование вид страницы - админ / Структура / вид / вид / [youviewname]
Gaydabura
1
«У вас есть« хэш »- потому что вы видите, что имя машины слишком длинное». - а почему это важно? Я могу добавить правила в таблицы стилей CSS к ДЕЙСТВИТЕЛЬНО длинным именам классов тоже без проблем ... Помеченная вами часть "CSS class" НЕ верна, потому что эти классы генерируются только в части "content" - это то, что я начал вопрос с! Поэтому я должен добавить классы в оболочку содержимого. Смотрите скриншоты, которые я только что вставил в исходный вопрос.
Sk8erPeter
Хорошо. в этом случае самый простой способ - создать пользовательские шаблоны для блока - вы хотите изменить. эта ссылка может быть полезна drupal.org/node/1089656 - она ​​объясняет предложения по названию шаблона
Gaydabura
Но так мне пришлось использовать block--views--3d8f7966168beeec655c8ead69336789.tpl.phpфайл, и в этом случае я нахожусь в той же точке, как если бы я использовал if($variables['block']->delta == '3d8f7966168beeec655c8ead69336789')условие в hook_preprocess_block(). Это то, чего я хотел избежать, потому что я думал, что могу использовать более удобочитаемое имя в своем крючке. Например, что если я захочу переместить представление в другое с теми же параметрами, я удалю предыдущее, но использую то же имя машины и классы CSS, но сгенерированные уникальные изменения хеша? В этом случае я теряю свои модификации.
Sk8erPeter
2

Это старый вопрос, но нет правильного ответа. Я столкнулся с той же проблемой. Решения, о которых я мог подумать, - это родительский селектор CSS (которого пока нет) ИЛИ некоторые манипуляции с Drupal.

Я добавил hook_preprocess_block, чтобы добавить класс CSS-оболочки для всех блоков представления, которые определяют класс CSS. Это не тривиально, поэтому я поставлю свой код здесь. Он может не работать со всеми блоками просмотра, если у вас есть проблемы с этим кодом, не стесняйтесь обновить его и опубликовать свою собственную версию.

Пример: представление с классом 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";
                }
            }
        }
    }
}
Гаэль Лафонд
источник
1

Для меня 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';
  }
}
leymannx
источник
0

Самым простым способом для меня было скопировать файл block.tpl.php, переименовать его, block--myregion.tpl.phpа затем добавить в него мои классы.

Смотрите: Страница тематических блоков .

Рикардо Сильва
источник