Làm cách nào để tạo một biến mà tệp page.tpl.php của tôi có thể truy cập?


7

Trong Drupal 7, tôi có một mô-đun triển khai hook_node_load. Nó tạo ra một biến mà tôi muốn sử dụng trong tệp page.tpl.php của mình. Hãy giả vờ rằng đó là số lượng các nút cùng loại với nút hiện đang được tải. Đến bây giờ, tôi chỉ biến biến toàn cầu, như vậy:

global $node_count;
$node_count = db_query("SELECT count FROM {node} WHERE type = :type", array(":type" => $node->type"))->fetchAll()[0]->count;

Sau đó, trong tệp page.tpl.php của tôi, tôi phải làm một cái gì đó như sau:

global $node_count;
echo "<p>$node_count</p>";

Tôi biết rằng có một cách để $node_countbiến biến của tôi trong phạm vi, giống như cách đó $nodehoặc $userlà. Các hướng dẫn tôi tìm thấy về chủ đề này dường như liên quan đến việc viết lại toàn bộ chức năng chủ đề - Tôi không cố làm bất cứ điều gì phức tạp. Có cách nào đơn giản để biến biến này trong phạm vi trong tệp .tpl.php của tôi không? Một cái gì đó giống như một chức năng?

Câu trả lời:


6

Trong chủ đề Drupal, các hàm tiền xử lý mẫu là các hàm chuẩn bị các biến có thể được sử dụng trong một mẫu nhất định. Các hàm tiền xử lý mẫu được thực hiện lần lượt từng cái và chúng đi xung quanh một mảng với tất cả các biến. Bạn có thể thêm cái riêng của bạn trong template.php của chủ đề, dưới dạng function THEMENAME_preprocess_TEMPLATENAME(&$variables) { // Your code here. }.

Nếu bạn đang thêm một giá trị cho một đối tượng nút trong triển khai hook_node_load, thì đó có thể trông giống như thế này:

function mymodule_node_load($nodes, $types) {
  foreach ($nodes as $node) {
    $node->myvariable = 'somevalue';
  }
}

Bây giờ bạn muốn truy cập $ node-> myvariable trong page.tpl.php của bạn. Đối với điều này, bạn thậm chí không cần phải viết một hàm tiền xử lý, bởi vì Drupal đã thêm đối tượng nút hiện tại vào các biến theo mặc định. (Điều này xảy ra trong template_prepocess_page .) Điều này có nghĩa là bạn chỉ cần thêm phần này vào trang của mình.tpl.php:

<?php if ($node->myvariable): ?>
  <div class="myvariable">
    <?php print $node->myvariable; ?>
  </div>
<?php endif; ?>

Tôi có thể không hiểu chính xác điều này, nhưng tôi không chắc chắn đây là điều tôi muốn. Vấn đề là, tôi muốn tạo biến trong hàm hook_node_load (). Điều này sẽ sống trong mô-đun của tôi, không phải chủ đề của tôi. Tôi có thể làm điều này với themename_pre process_page không? Nếu vậy, bất kỳ cơ hội bạn có thể đưa ra một ví dụ? Cảm ơn.
rybosome

OK, tôi hiểu rồi, tôi sẽ cập nhật câu trả lời của tôi.
marcvangend

Trả lời cập nhật. Mong rằng sẽ giúp!
marcvangend

0

Các biến có thể truy cập từ tệp mẫu có thể được đặt trong chức năng tiền xử lý, cũng có thể được thực hiện trong mô-đun.

Trong trường hợp của bạn, mô-đun của bạn nên triển khai mã tương tự như mã sau (thay thế "mymodule" bằng tên viết tắt của mô-đun của bạn):

function mymodule_preprocess_page(&$variables) {
  if (!empty($variables['node'])) {
    $variables['node_count'] = db_query("SELECT count FROM {node} WHERE type = :type", array(":type" => $variables['node']->type"))->fetchField();
  }
}

Tôi xác minh $variables['node']không trống vì mẫu trang cũng được sử dụng cho các trang không được liên kết với một nút.
Trong page.tpl.php, bạn truy cập cùng một bộ biến từ hàm tiền xử lý bằng cách sử dụng $node_count.

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.