Làm cách nào để thêm JavaScript cụ thể cho chế độ xem?


26

Tôi có một cái nhìn trong trang web của tôi có một tên lớp cụ thể. Tôi muốn biết, bên trong tệp template.php của một chủ đề, làm thế nào tôi có thể biết liệu một khung nhìn với tên lớp cụ thể có sẵn trong trang được yêu cầu hay không.

Điều này rất quan trọng đối với tôi vì tôi cần bao gồm JavaScript và CSS cụ thể, khi chế độ xem với tên lớp cụ thể (như thư viện ảnh) được sử dụng trong một trang.

Câu trả lời:


40

Bạn có thể sử dụng template_preprocess_views_view()móc để làm điều này:

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');
  }
}

Lưu ý rằng bạn cũng có thể kiểm tra màn hình cụ thể của chế độ xem bằng cách sử dụng:

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

Bạn sẽ có thể kiểm tra một lớp css tùy chỉnh như thế này:

if ($view->name == 'your-view-name' && $view->display[$view->current_display]->display_options['css_class'] == 'your-css-class') {
   // include javascript & css here
}

Cảm ơn rất nhiều, nhưng chức năng này nhận ra chế độ xem theo tên, tôi muốn nhận ra tên lớp, bởi vì có một số lượt xem trong một trang có cùng tên lớp. ví dụ: 2 khung nhìn có tên lớp 'gallery-image' và 3 khung nhìn có tên lớp 'hộp đèn'. Tôi muốn thêm js chẳng hạn nếu một chế độ xem với tên lớp css 'hộp đèn' có sẵn trong trang.
Mehrdad201

Bạn có thể kiểm tra màn hình không? if($view->name == 'your-view-name' && $view->display_id == 'your-display-id')
Cyclonecode

không, vì không rõ ràng có bao nhiêu lượt xem trong trang. có thể đã ăn 10 lượt xem rằng tất cả chúng đều có cùng tên lớp css.
Mehrdad201

Tôi đã thực hiện hook này và xóa tất cả bộ nhớ cache - nhưng nó không được gọi. Không chắc chắn lý do tại sao. Có tôi đã kiểm tra lại tên.
jdhildeb

Điều đó có vẻ rất lạ? Bạn đã thay thế THEME bằng tên của chủ đề thực tế của bạn? Điều này sẽ hoạt động tốt miễn là bạn thực hiện nó một cách chính xác.
Cyclonecode

8

Bạn có thể sử dụng chức năng view_get_page_view để tìm ra chế độ xem nào đang được phục vụ trên trang. Nó trả về lượt xem đối tượng. Lưu ý rằng trong đoạn mã bên dưới, bạn nên so sánh với tên máy có thể đọc được, nhưng tất nhiên bạn có thể viết comparaison của riêng mình dựa trên đối tượng xem được trả về bởi Views_get_page_view

function YOURTHEMENAME_preprocess_page(&$variables) {
    $view = views_get_page_view();
    if($view->name == 'YOURVIEW') {
    //Do what ever you want 
    }

6

Chỉ trong trường hợp điều này hữu ích cho bất kỳ ai khác vấp phải câu hỏi này, tìm kiếm như tôi đã làm để đính kèm JavaScript vào Chế độ xem Drupal . Về mặt D7 & Lượt xem 3.7, những điều sau đây phù hợp nhất với tôi:

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);
    }
  }
}

Điều này có lợi vì tôi muốn giữ mã trong mô-đun của mình, thay vì chủ đề - bởi vì các cải tiến do JavaScript mang lại không liên quan gì đến ngoại hình.

LƯU Ý: Rõ ràng HOOKnên được thay thế bằng tên mô-đun của bạn, ở cả hai vị trí và CLASS GOES HEREcũng nên được thay thế bằng lớp bạn đang tìm kiếm.


Để rõ ràng, tại sao pre numnder tốt hơn pre_ process?
Nick

@Nick ~ Không có HOOK_views_pre_process( api.drupal.org/api/view/view.api.php/7 ) trừ khi bạn có nghĩa là lý do tại sao sử dụng nó hơn THEME_preprocess_views_view- trong trường hợp đó chỉ là ngoài sở thích bạn muốn thêm sửa đổi mã của bạn. HOOK_views_pre_rendercó thể được nối vào từ một mô-đun, trong khi đó THEME_preprocess_views_viewnên đi vào tệp chủ đề / mẫu của bạn. Bạn cũng có thể sử dụng HOOK_views_post_rendernếu bạn thích.
Pebbl

Xin lỗi, ý tôi là THEME_preprocess_views_view, vâng ... Tôi chắc chắn rằng tôi đã thực hiện hook_preprocess_views_viewcác mô-đun trước đây.
Nick

4

Nếu bạn đang ở trên 6 hoặc 7, bạn cũng có thể bao gồm các tài sản javascript với bối cảnh mô-đun thêm tài sản. Điều này không yêu cầu bối cảnh nhưng bạn sẽ yên tâm rằng nó sẽ luôn được đưa vào khi chế độ xem được hiển thị.

https://drupal.org/project/context_addassets

Từ trang dự án của mô-đun:

Bạn đã bao giờ muốn bao gồm javascript hoặc css khi một chế độ xem hoặc khối cụ thể được hiển thị chưa? Hoặc bạn đã bao giờ muốn bao gồm javascript hoặc css cho trang đầu mà không phải viết mã?

Bối cảnh thêm tài sản cho phép bạn làm điều này. Nó có một giao diện người dùng dễ sử dụng để cho phép bạn thực hiện tất cả điều này mà không cần viết bất kỳ mã nào. Bởi vì nó sử dụng ctools, tất cả điều này cũng có thể xuất khẩu.


2

Viết mã JavaScript tìm kiếm lớp cụ thể trong dạng xem, sử dụng hasClass () của jQuery và bao gồm tệp JavaScript của bạn khi điều kiện được thỏa mãn.

Một cách khác là đặt một mẫu cho chế độ xem của bạn và thêm mã JavaScript thông qua mẫu đó bằng cách sử dụng drupal_add_js () .


Bạn có thể cho tôi biết, làm thế nào tôi có thể làm điều này. Thật vậy, làm thế nào có thể bao gồm các tệp css và js sau khi một biểu thức có điều kiện trong tập lệnh java là đúng ??!
Mehrdad201

Đối với Drupal 8, câu trả lời này phác thảo cách tạo mẫu chế độ xem tùy chỉnh cho đầu ra chế độ xem để thực hiện việc này: stackoverflow.com/a/43131240/227926
Therobyouledge 17/10/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.