Як додати JavaScript, визначений для перегляду?


26

Я маю представлення на своєму сайті, яке має конкретну назву класу. Я хочу знати, що всередині файлу template.php теми, як я можу дізнатися, чи існує перегляд із конкретною назвою класу на сторінці запиту.

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

Відповіді:


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
}

Велике спасибі, але ця функція розпізнає погляд за назвою, я хочу розпізнати ім’я класу, тому що на одній сторінці є кілька переглядів, які мають однакове ім’я класу. наприклад, у 2 переглядах є ім'я класу "галерея-зображення", а в 3 перегляди - назва класу "light-box". Я хочу додати js, наприклад, якщо на сторінці доступний вид з назвою класу "light-box".
Mehrdad201

Ви не можете просто перевірити дисплей? if($view->name == 'your-view-name' && $view->display_id == 'your-display-id')
Cyclonecode

ні, тому що незрозуміло, скільки переглядів доступно на сторінці. можливо, з'їли 10 переглядів, що всі вони мають однакове ім'я класу css.
Mehrdad201

Я реалізував цей гачок і очистив усі кеші - але його не викликали. Не знаю чому. Так, я ще раз перевірив ім'я.
jdhildeb

Це здається дуже дивним? Ви замінили ТЕМУ на ім'я фактичної теми? Це має спрацювати добре, якщо ви правильно його реалізуєте.
Cyclonecode

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 . Щодо D7 та переглядів 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також його слід замінити класом, який ви шукаєте.


Для наочності, чому 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 в контексті модуля додати активи. Що вимагає контексту, але ви будьте впевнені, що він завжди буде включений під час надання представлення.

https://drupal.org/project/context_addassets

На сторінці проекту модуля:

Ви коли-небудь хотіли включити javascript або css, коли певний вид або блок відображається? Або ви коли-небудь хотіли включити javascript або css лише для титульної сторінки, не потребуючи написання коду?

Активність додавання контексту дозволяє вам це зробити. Він має простий користувальницький інтерфейс, який дозволяє вам робити все це без написання коду. Оскільки він використовує ctools, все це також можна експортувати.


2

Напишіть код JavaScript, який шукає конкретний клас у представленні, використовуючи hasClass () jQuery , та додайте файл JavaScript, коли умова буде задоволена.

Інший спосіб - поставити шаблон для перегляду та додати код JavaScript через цей шаблон, використовуючи drupal_add_js () .


Ви можете мені сказати, як я можу це зробити. Дійсно, як можна включати файли css та js після умовного виразу в сценарій java?
Mehrdad201

Для Drupal 8, ця відповідь описує , як зробити шаблон для користувача виду для виведення виду , щоб зробити це: stackoverflow.com/a/43131240/227926
therobyouknow
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.