hook_pre process_page (): làm thế nào để biết một trang xem?


10

Tôi đang viết một mô-đun tùy chỉnh cần chèn một số tệp javascript và css chỉ trong trang Lượt xem.

Tôi đang sử dụng hook_pre process_page, nhưng tôi không thể biết trang hiện tại có ở chế độ xem hay không:

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if([view page])
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
        // Rebuild scripts 
        $scripts = drupal_get_js();
        $vars['scripts'] = $scripts;
        // Same for css
    }
}

Tôi biết tôi có thể sử dụng tệp mẫu (page-my_view_page_path.tpl.php), nhưng chỉ bao gồm js và css bổ sung nếu mô-đun của tôi được bật; vì vậy tôi muốn giữ những thứ này trực tiếp bên trong mã mô-đun của mình .

Ý tưởng?


Bạn có thể sử dụng các tệp mẫu trong mô-đun của bạn.
Jeremy Pháp

@Jeremy: thêm câu trả lời của bạn giải thích làm thế nào để mọi người có thể bỏ phiếu và tranh luận.
Strae

Nó không liên quan trực tiếp đến câu trả lời, chỉ ra rằng một tệp tpl có thể được bao gồm trong một mô-đun. một DANieL dường như chỉ ra rằng nó không thể.
Jeremy Pháp

tốt .. tôi có thể bao gồm trang chủ đề.tpl, nhưng mục tiêu của tôi là giữ cho mô-đun này hoàn toàn phụ thuộc vào chủ đề ..
Strae

Bạn có thể triển khai các mẫu của Chế độ xem trước khi xử lý mô-đun của mình, như được đề xuất trong câu trả lời của Jeremy French.
Pierre Buyle

Câu trả lời:


12

views_get_page_view()tìm ra những gì, nếu có, xem trang hiện đang được sử dụng. Nếu nó trả về NULL, thì trang hiện tại không phải là trang của chế độ xem.

Nhưng sử dụng drupal_add_js()drupal_add_css()trong một hook_preprocess_page()sẽ không hoạt động như mong đợi vì các biến $script$stylecác biến đã được thiết lập bởi template_preprocess_page(). Tiền xử lý mẫu của Lượt xem (xem câu trả lời của Jeremy Pháp) có lẽ là nơi tốt hơn để thêm CSS và JavaScript của bạn.


Tôi đã cập nhật câu trả lời của mình cho bạn đoạn thứ hai - tôi biết là một cách thực hành tốt để thêm css hoặc js trong chủ đề (theme_pre process_ *), nhưng nhu cầu của tôi là phụ thuộc mô-đun.
Strae

Tuyệt vời, Views_get_page_view chỉ nhận được chế độ xem đã được tải từ bộ đệm, do đó, nó không có tác động hiệu suất. IMHO đây sẽ là câu trả lời được chấp nhận.
marcvangend

@Strae Đề xuất của tôi là sử dụng HOOK_preprocess_views_view(&$variables)hoặc móc tiền xử lý mẫu của Chế độ xem khác thay vì HOOK_preprocess_page(&$variables). Bằng cách này bạn có thể nhận được các quan điểm trong $variablesvà sử dụng drupal_add_js()drupal_add_css()an toàn.
Pierre Buyle

11

Có một chuỗi dài trên các bộ tiền xử lý cho các khung nhìn ở đây. Nhận xét này trông rất đơn giản với tôi.

function mymodule_theme_registry_alter(&$theme_registry) {
  //dpm($theme_registry);
  $theme_registry['views_view__YOUR_VIEW_NAME_HERE']['preprocess functions'][] = 'mymodule_preprocess_func';
}

// now go on and play with your new preprocess function
function mymodule_preprocess_func(&$vars) {
  // etc
}

Tôi đồng ý rằng tiền xử lý đầu ra của Chế độ xem thay vì toàn bộ trang có lẽ là cách tiếp cận đúng hơn.
Garrett Albright

8

Nếu bạn đang ở trong hook_pre process_page () thì theo định nghĩa, chế độ xem của bạn có hiển thị trang và đường dẫn menu, phải là duy nhất - vì vậy bạn có thể làm điều này:

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if($_GET['q'] == 'my/view/path')
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
    }
}

Nếu bạn có các đối số được chuyển đến trang này, vì vậy bạn cần các phần của $_GET['q'], sau đó thực hiện việc này thay vì với arg()chức năng của Drupal :

if(arg(0) == 'my' && arg(1) == 'view' && arg(2) == 'path')

http://api.drupal.org/api/drupal/includes--bootstrap.inc/feft/arg


Tôi không khuyên bạn nên kiểm tra $ _GET ['q']. Sử dụng menu_get_item () hoặc menu_get_object () để thay thế. Không yêu cầu đối số nếu bạn đang kiểm tra trang hiện tại và cả hai đều lưu trữ kết quả của họ.
Mikey P

Sử dụng drupal_add_js () và drupal_add_css () trong hook_pre process_page () sẽ không hoạt động như mong đợi vì biến $ script và biến kiểu $ đã được đặt bởi template_pre process_page (). Người dùng view_get_page_view () để truy xuất chế độ xem cho trang hiện tại (nếu có).
Pierre Buyle

3

Đối với tôi cái này hoạt động:

function MYMODULE_preprocess_page(&$vars) {
  $view = (array)views_get_page_view();
  if (!empty($view)) {
    // do stuff
  }
}

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.