Truyền biến từ hàm tiền xử lý html sang chức năng tiền xử lý trang?


10

Trong các chức năng hook_preprocess_page()và chủ đề tùy chỉnh của hook_preprocess_html()tôi, tôi thường cần xác định cùng một thông tin. Thay vì chạy về cơ bản giống nhau nếu câu lệnh kiểm tra cả hai thông tin xác định cùng một thông tin, sẽ có ý nghĩa hơn nếu chỉ thực hiện một lần trong cả hai và sau đó chuyển thông tin đó cho hàm tiền xử lý khác. Tôi có thể làm cái này như thế nào? Tôi đã thử cách sau nhưng không được:

function myTheme_preprocess_page(&$vars){
    $vars['myValue'] = 7;
}

function myTheme_preprocess_html(&$vars){
    //$vars['myValue'] should equal 7...
}

Tôi cũng đã thử cách khác (đặt giá trị trong hàm html tiền xử lý và sau đó truy xuất nó trong chức năng tiền xử lý trang) nhưng điều đó cũng không hoạt động. Điều này đưa đến một câu hỏi liên quan: các hàm tiền xử lý này được xử lý theo thứ tự nào? Dường như với tôi rằng chức năng tiền xử lý trang xuất hiện trước html, điều đó có đúng không?

Câu trả lời:


14

Bạn sẽ cần một globalhoặc một staticbiến để thực hiện điều này ... cá nhân tôi khuyên bạn nên staticthực hiện và thực hiện chức năng trợ giúp chung bằng cách sử dụng mô hình tĩnh của Drupal như vậy:

function _myTheme_var($var_name, $new_val = NULL) {
  $vars = &drupal_static(__FUNCTION__, array());

  // If a new value has been passed
  if ($new_val) {
    $vars[$var_name] = $new_val;
  }

  return isset($vars[$var_name]) ? $vars[$var_name] : NULL;
}

function myTheme_preprocess_page(&$vars){
  $vars['some_var'] = _myTheme_var('my_var', 7); // Set the value and retrieve it
}

function myTheme_preprocess_html(&$vars){
  $vars['some_var'] = _myTheme_var('my_var'); // Get the value
}

Các $varsmảng cho mỗi chức năng tiền xử lý là các đối tượng hoàn toàn khác nhau trong bộ nhớ, do đó bạn sẽ không thể sử dụng mảng đó để truyền mọi thứ xung quanh. Tôi đã thấy loại mô hình này được sử dụng rất nhiều trong lõi Drupal vì vậy tôi nghĩ rằng nó sẽ là cách tốt nhất để đi.

BIÊN TẬP

Ồ và vâng, hook_preprocess_page()được gọi trước đó hook_preprocess_html()... theo như tôi biết Drupal hoạt động theo kiểu "từ trong ra ngoài" nên hook_preprocess_html()có lẽ sẽ là cái cuối cùng chạy trong quá trình xây dựng trang.


3

Tôi đã thực hiện điều này với một trường hợp tương tự là 'nút' và 'trang' bằng cách thực hiện:

function mymodule_preprocess_node(&$vars) {
  _mymodule_preprocess_vars($vars,'node');
}

function mymodule_preprocess_page(&$vars) {
  _mymodule_preprocess_vars($vars,'page');
}

function _mymodule_preprocess_vars(&$vars, $where) {

  // all vars common to both node and page set here

  switch($where) {

    case 'node':

      // node only vars set here;

      break;

    case 'page':

      // page only vars set here;

      break;
  }
}

vì vậy tôi tưởng tượng nó sẽ hoạt động tương tự với 'trang' và 'html'.


Vâng, điều đó sẽ làm việc. Nhưng nó không hiệu quả lắm vì những vars $ cần một số loại xử lý sẽ khiến việc xử lý đó được thực hiện nhiều lần.
maxedison

đúng, nếu đó là điểm chung giữa các hàm tiền xử lý, như đặt biến cho một số kết quả sql phức tạp, vâng, có lẽ bạn không muốn thực hiện nhiều lần, nhưng điều đó dễ dàng được giải quyết bằng một số static xử lý như câu trả lời đầu tiên. và cài đặt trọng lượng nhẹ thực sự có thể nhanh hơn vì bạn không có chức năng gọi qua chức năng cho từng và mọi bộ biến, chỉ lần đầu tiên gọi từ chức năng chính. Và rõ ràng các phần chính (nút & trang) chỉ được đặt một lần.
Jimajamma
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.