2012-05-03 31 views
6

Tôi có đoạn mã sau trong Drupal 7 template.php tập tin của tôi:Drupal 7 preprocess_views không làm việc

function mytheme_preprocess_views_view__videos__videos(&$vars) { 
     drupal_add_css(drupal_get_path('theme', 'mytheme') . "/css/qwembed-jquery-1.0.css"); 
     drupal_add_js(drupal_get_path('theme', 'mytheme').'/js/jquery.swfobject.1-1-1.min.js', array('type' => 'file', 'scope' => 'footer')); 
     drupal_add_js(drupal_get_path('theme', 'mytheme').'/js/qwembed-jquery-1.0.js', array('type' => 'file', 'scope' => 'footer')); 
    } 

tôi cần phải tải những css và js nộp chỉ khi quan điểm này sẽ được hiển thị.

nhìn tên hiển thị là: Videos quan điểm Machine Name là: videos

và các tập tin ghi đè là:

views-view--videos--videos.tpl.php 

views-view-unformatted--videos--videos.tpl.php 

views-view-fields--videos--videos.tpl.php 

bất kỳ ý tưởng tại sao điều này không hoạt động?

+0

Đôi "__videos__videos' chỉ là lỗi đánh máy? Nếu tên chế độ xem là 'video', tôi mong đợi '[yourThemeName] _preprocess_views_view__videos (& $ vars)'. –

+0

Tôi cho rằng đó là vì tên disply là video và trong trường hợp này tên máy là video. Các tệp mẫu được liệt kê ở trên hoạt động hoàn hảo và chúng là video - video. Tôi sẽ cố gắng loại bỏ một trong anyway chỉ trong trường hợp. Cảm ơn – Cybercampbell

+1

Chờ đã, tôi nghĩ rằng tôi đã nhầm lẫn bởi một cái gì đó, vì vậy tôi đoán nó sẽ * không * chỉ làm việc với một '__videos'. Sẽ kiểm tra lại và thêm câu trả lời. –

Trả lời

21

Sự cố có thể là bạn cố gắng triển khai hàm tiền xử lý dựa trên cùng một mẫu đặt tên như được sử dụng cho ghi đè mẫu. Nhưng các hàm tiền xử lý có một chút khác biệt theo mặc định, chúng chỉ có thể được thực hiện dựa trên tên của mẫu 'cơ sở', và không có cơ chế tương tự cho các phiên bản 'cụ thể' dựa trên các đề xuất mẫu. Xem số answer to a more generic question của tôi để biết chi tiết.

Vì vậy, bạn sẽ cần phải rơi trở lại để thực hiện 'cơ sở' chức năng xử lý trước, và kiểm tra xem nó được gọi là cho giao diện bạn muốn (và hiển thị tùy chọn) trong phạm vi chức năng, khoảng như vậy:

function [yourThemeName]_preprocess_views_view(&$vars) { 
    $view = $vars['view']; 
    if ('videos' == $view->name) { 
    // Add desired manipulations for all 'videos' views 
    if ('videos' == $view->current_display) { 
     // Add desired manipulations for the 'videos' display only 
    } 
    } 
} 

Bạn có thể cũng thêm hành vi bạn mong đợi bằng cách thực hiện một hàm tiền xử lý chung để cố gắng gọi các phiên bản cụ thể bằng cách kiểm tra các chức năng có tên thích hợp - xem phần cuối của this article. chỉ có ý nghĩa, nếu bạn cần các hàm tiền xử lý cụ thể cho nhiều khung nhìn.

Có nhiều chức năng tiền xử lý 'cơ sở' hơn cho mỗi loại chế độ xem mà bạn có thể triển khai trực tiếp - xem danh sách template_preprocess_views_view_* trong 'chế độ xem/chủ đề/chủ đề.inc' cho các tùy chọn có sẵn.

Làm quy tắc cơ sở, bất cứ khi nào có chức năng template_preprocess_* cho mẫu, bạn cũng có thể triển khai chức năng yourThemeOrModuleName_preprocess_* tương ứng. Nếu bạn cần thao tác cho các khuôn mẫu dựa trên các đề xuất tên mẫu, bạn cần phải tìm tên hàm preprocess 'cơ sở', triển khai thực hiện và kiểm tra trường hợp cụ thể của bạn trong hàm đó (như cho khung nhìn cụ thể như trong ví dụ trên).

+2

Wow !!! cảm ơn bạn rất nhiều vì câu trả lời rõ ràng và chi tiết như vậy. Tôi không thể diễn tả tôi đánh giá cao nỗ lực của bạn đến mức nào để giúp đỡ một người bạn thậm chí không biết. Và tôi có thể xác nhận câu trả lời của bạn chính xác 100% !! thử nghiệm và làm việc !! Cảm ơn một lần nữa @Henrik Opel – Cybercampbell

+0

Đối với độc giả tương lai của câu trả lời tuyệt vời của bạn, tôi muốn chỉ ra rằng điều này chỉ là cần thiết ở nơi đầu tiên vì một lỗi đáng kể trong Drupal 7 lõi. Xem vấn đề này để biết thêm chi tiết: http://drupal.org/node/939462 – CoreDumpError

Các vấn đề liên quan