Tôi chỉ gặp một vấn đề tương tự , đó là lý do tại sao google đưa tôi đến trang này: chức năng tiền xử lý nút của tôi đang phát triển rất lớn, rằng tôi muốn chia chức năng thành nhiều tệp.
Tôi đã thực hiện một cách tiếp cận tương tự trong tệp template.php chứa tất cả các hàm thay đổi và vì cùng một phương thức hoạt động hoàn hảo ở đây, tôi nghĩ tôi muốn chia sẻ cách tiếp cận của mình:
thiết lập tập tin bên trong thư mục MYTHEME/preprocess
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
bạn nên có node.preprocess.inc
, những người khác bạn có thể tự tạo ra. Làm thế nào bạn gọi chúng thực sự là khá độc đoán, nhưng tốt hơn là đặt cho chúng những cái tên độc đáo xác định chúng và phù hợp với toàn bộ hệ thống đặt tên drupal.
trở đi nội dung của các tập tin này!
node.preprocess.inc
, ở đây tôi đang làm một cái gì đó như thế này:
<?php
function MYTHEME_preprocess_node(&$variables) {
switch($variables['type']) {
case 'blog_post':
// if the type of the node is a Blog Post, include this:
include 'node--blog-post.preprocess.inc';
break;
case 'device_variation':
// if Device Variation, include this:
include 'node--device-variation.preprocess.inc';
break;
case 'foo':
// ...
break;
}
// additional stuff for all nodes
}
về cơ bản chúng ta chuyển qua loại nút hiện tại. những gì bạn chuyển qua là tùy thuộc vào bạn; #id
,, #view_mode
tất cả tùy thuộc vào nhu cầu chính xác của bạn.
một khi có sự trùng khớp, nó sẽ tải tập tin được chỉ định và hành động theo nội dung của nó giống như nó được viết ngay bên trong hàm này.
nội dung của các included
tệp này trông giống hệt như bạn đặt nó vào node.preprocess.inc
tệp, ngoại trừ chúng tôi không gọi lại chức năng tiền xử lý:
node--device-variation.preprocess.inc
<?php
// Device Name
$device = drupal_clean_css_identifier(strtolower($variables['title']));
// Determine whether only Device Version is of type 'N/A' and set ppvHasVariations accordingly
$deviceHasVariations = true;
if( $variables['content']['product:field_model_variation'][0]['#options']['entity']->weight == 0 ) {
$deviceHasVariations = false;
}
//...
về cơ bản bạn có thể thực hiện việc này với nhiều tệp như bạn muốn và thậm chí xếp tầng nhiều công tắc, ví dụ như chia nhỏ hơn các tệp tiền xử lý nút cụ thể tùy thuộc vào #view_mode
, có một tệp cho full
chế độ xem và một tệp khác choteaser
hy vọng điều này có ích, nếu ai đó vấp phải câu hỏi này một lần nữa (:
foo_preprocess_node
bằng cách thực hiện nó nhưcall_user_func('_preprocess_' . $vars['type'], $vars);
để tránh lặp lại ifs nhưng tốt nhất là giữ đơn giản.