Як додати класи CSS до блоку, створеного переглядом? (НЕ до створеного контенту, сам блок!)


8

Я не знаю чому, але Views не додає імена CSS класів, "читаних людиною" (наприклад, ім'я машини представлення даних) до створених ним блоків ( він додає лише свої класи до створеної частини "вмісту", коли додавання класів до частини " CSS class " у редакторі перегляду (див. скріншоти нижче!)).
Він лише додає звичайні block block-viewsта, можливо, contextual-links-regionCSS-класи до блоків (-ів), і генерує унікальний ідентифікатор (не клас) на зразок цього: block-views-3d8f7966168beeec655c8ead69336789(тому що його дельта - це генерований хеш-код).
Немає сенсу писати правила CSS для цих класів та ідентифікаторів (наприклад .block-views-3d8f7966168beeec655c8ead69336789 { /* ... */ }), оскільки ці класи / ідентифікатори можуть змінюватися при зміні блоку Views.

Як я можу додати деякі спеціальні класи CSS у реалізацію hook_block_view_alter(), якщо я навіть не можу ідентифікувати ці блоки через їх генеровану дельту хешу?


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

Тому я хотів би вирішити це з власного модуля.


EDIT

Приклад:

Мій погляд з назвою машини та доданими класами CSS: Вид - назва машини та клас

HTML-код згенерованого блоку в інспекторі: Перегляд - згенерований HTML-код блоку в інспекторі

Відповіді:


7

Спочатку. У вас є "хеш" - тому що ви переглядаєте ім'я машини занадто довго.

Друге - ви можете додати свої власні класи для перегляду

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


Цей знімок екрана, який ви маєте щодо блоків перегляду, правда?
cherouvim

немає - це на редагування вид сторінки - адмін / Структура / вид / вид / [youviewname]
Gaydabura

1
"У вас" хеш "- тому що ви переглядаєте ім'я машини занадто довго." - а чому це важливо? Я можу додати правила до таблиць стилів CSS до РЕАЛЬНО довгих імен класів теж без проблем ... Частина "Клас CSS", яку ви позначили, НЕ коректна, оскільки ці класи генеруються лише у частині "змісту" - саме з цього я і почав свою питання з! Тому я повинен додати класи до обгортки вмісту. Дивіться скріншоти, які я щойно вставив у оригінальному запитанні.
Sk8erPeter

добре. в цьому випадку найпростішим способом є створення власних шаблонів для блоку - ви хочете зміни. це посилання може бути корисним drupal.org/node/1089656 - це пояснює пропозиції щодо назви шаблонів
Gaydabura

Але таким чином мені довелося використовувати block--views--3d8f7966168beeec655c8ead69336789.tpl.phpфайл, і в цьому випадку я перебуваю в тій самій точці, ніби я використовував if($variables['block']->delta == '3d8f7966168beeec655c8ead69336789')умову в hook_preprocess_block(). Цього я хотів уникнути, тому що думав, що можу використовувати в моєму гачку більш іменитіше ім’я. Наприклад, що, якщо я хочу перенести подання в інше з тими ж параметрами, я видаляю попереднє, але використовую те саме ім’я машини та класи CSS, але генеровані унікальні зміни хешу? У цьому випадку я втрачаю свої модифікації.
Sk8erPeter

2

Це старе питання, але належної відповіді немає. Я зіткнувся з тією ж проблемою. Рішення, про яке я міг придумати, - це вибір селектора CSS (який ще не існує) АБО інша маніпуляція з Drupal.

Я додав крючок_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';
  }
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.