Как добавить JavaScript, специфичный для вида?

26

У меня есть вид на моем сайте, который имеет определенное имя класса. Я хочу знать, внутри файла template.php темы, как узнать, доступно ли представление с конкретным именем класса на запрашиваемой странице.

Это очень важно для меня, потому что мне нужно включить определенный JavaScript и CSS, когда на странице используется представление с определенным именем класса (например, галерея изображений).

Mehrdad201
источник

Ответы:

40

Вы можете использовать template_preprocess_views_view()крючок для этого:

function THEME_preprocess_views_view(&$vars) {
  $view = &$vars['view'];
  // Make sure it's the correct view
  if ($view->name == 'your-view-name') {
    // add needed javascript
    drupal_add_js(drupal_get_path('theme', 'your-theme') . '/your-js.js');
    // add needed stylesheet
    drupal_add_css(drupal_get_path('theme', 'your-theme') . '/your-css.css');
  }
}

Обратите внимание, что вы также можете проверить конкретное отображение вида, используя:

if ($view->name == 'your-view-name' && $view->current_display == 'your-display-id') {
  // include javascript & css here
}

Вы должны быть в состоянии проверить пользовательский класс CSS следующим образом:

if ($view->name == 'your-view-name' && $view->display[$view->current_display]->display_options['css_class'] == 'your-css-class') {
   // include javascript & css here
}
Cyclonecode
источник
Большое спасибо, но эта функция распознает представление по имени, я хочу узнать имя класса, потому что на одной странице есть несколько представлений с одинаковым именем класса. например, 2 представления имеют имя класса 'gallery-image', а 3 представления имеют имя класса 'light-box'. Я хочу добавить js, например, если на странице доступно представление с именем класса css 'light-box'.
Mehrdad201
Разве вы не можете просто проверить дисплей? if($view->name == 'your-view-name' && $view->display_id == 'your-display-id')
Cyclonecode
нет, потому что не понятно, сколько просмотров доступно на странице. может быть, есть 10 просмотров, которые имеют одинаковое имя класса CSS.
Mehrdad201
Я реализовал этот хук и очистил все кэши - но он не вызывался. Не уверен почему. Да, я дважды проверил имя.
jdhildeb
Это кажется очень странным? Вы заменили ТЕМУ на название вашей актуальной темы? Это должно работать нормально, если вы правильно его реализуете.
Циклон-код
8

Вы можете использовать функцию views_get_page_view, чтобы узнать, какой вид обслуживается на странице. Он возвращает вид объекта. Обратите внимание, что в приведенном ниже фрагменте кода вы должны сравнить с машиночитаемым именем представления, но, конечно, вы можете написать собственное сравнение, основываясь на объекте представления, возвращаемого views_get_page_view.

function YOURTHEMENAME_preprocess_page(&$variables) {
    $view = views_get_page_view();
    if($view->name == 'YOURVIEW') {
    //Do what ever you want 
    }
Алекс петров
источник
6

Просто на тот случай, если это пригодится кому-то, кто наткнулся на этот вопрос, выполняя поиск, как я, для добавления JavaScript в Drupal View . С точки зрения D7 & Views 3.7 для меня лучше всего было следующее:

function HOOK_views_pre_render ( &$view ) { 
  /// check to make sure the view has a classname
  if ( $view->display_handler && !empty($view->display_handler->options['css_class']) ) {
    $cln = $view->display_handler->options['css_class'];
    $cls = 'CLASS GOES HERE';
    /// test that the classname contains our class
    if ( preg_match('/(^|\s+)' . preg_quote($cls) . '(\s+|$)/i', $cln) ) {
      /// build the path to the js, which is local to my module, js/view.js
      $sep = DIRECTORY_SEPARATOR;
      $dir = rtrim(drupal_get_path('module', 'HOOK'), $sep);
      $pth = "{$dir}{$sep}js{$sep}view.js";
      drupal_add_js($pth);
    }
  }
}

Это было полезно, так как я хотел сохранить код в моем модуле, а не в теме, потому что улучшения, внесенные в JavaScript, не имели ничего общего с визуальным оформлением.

ПРИМЕЧАНИЕ. Очевидно HOOK, что в обоих местах его CLASS GOES HEREследует заменить именем вашего модуля, а также заменить классом, который вы ищете.

Pebbl
источник
Для ясности, почему pre_render лучше, чем pre_process?
Ник
@Nick ~ HOOK_views_pre_process( api.drupal.org/api/views/views.api.php/7 ) не существует, если только вы не имеете в виду причину, по которой следует использовать это THEME_preprocess_views_view- в этом случае это только из предпочтения того, где Вы хотите добавить свои модификации кода. HOOK_views_pre_renderможет быть подключен из модуля, тогда как THEME_preprocess_views_viewдолжен идти в вашем файле темы / шаблона. Вы также можете использовать, HOOK_views_post_renderесли хотите.
Pebbl
Извините, я имел в виду THEME_preprocess_views_view, да ... Я уверен, что я делал hook_preprocess_views_viewв модулях раньше.
Ник
4

Если вы используете drupal 6 или 7, вы также можете включить ресурсы javascript с активами модуля context context add. Который требует контекста, но вы будете уверены, что он всегда будет включен при визуализации представления.

https://drupal.org/project/context_addassets

Со страницы проекта модуля:

Вы когда-нибудь хотели включить javascript или css при отображении определенного вида или блока? Или вы когда-нибудь хотели включить javascript или css для первой страницы без необходимости писать код?

Активы добавления контекста позволяют вам сделать это. Он имеет простой в использовании интерфейс, позволяющий вам делать все это без написания кода. Поскольку он использует ctools, все это также можно экспортировать.

chrisjlee
источник
2

Напишите код JavaScript, который ищет определенный класс в представлении, с помощью hasQlass () jQuery, и включите ваш файл JavaScript, когда условие будет выполнено.

Другой способ - создать шаблон для вашего представления и добавить код JavaScript через этот шаблон с помощью drupal_add_js () .

niksmac
источник
Можете ли вы сказать мне, как я могу это сделать. Действительно, как можно включить файлы CSS и JS после того, как условное выражение в сценарии Java является истиной ??!
Mehrdad201
Для Drupal 8 в этом ответе описывается, как создать собственный шаблон представления для вывода представления, чтобы сделать это: stackoverflow.com/a/43131240/227926
therobyouknow