In $ Tin nhắn trong tệp node.tpl.php


23

Trong Drupal 7, theo mặc định, $messagesbiến được in trong page.tpl.php.

Có cách nào để in $messagestrong tệp node.tpl.php (ví dụ: $ node-mycontenttype.tpl.php).

Chỉ cần đặt <?php print $messages; ?>hoặc <?php print render($page['messages']); ?>không hoạt động.

Có một hướng dẫn ở đây để in $ message trong một khối, nhưng tôi muốn đặt nó trong tệp node.tpl.php của mình.


Tôi nghĩ theme_status_messages đang được gọi trước template_preprocess_nodenên drupal_get_messages trống khi bạn gọi nó.
nhà phát triển ẩn danh

Câu trả lời:


30

Trên thực tế, những gì bạn muốn làm là đây:

function YOURTHEME_preprocess_page(&$variables) {
  // This disables message-printing on ALL page displays
  $variables['show_messages'] = FALSE;
}

function YOURTHEME_preprocess_node(&$variables) {
  $variables['messages'] = theme('status_messages');
}

Cách thức hoạt động: Lõi Drupal kiểm tra giá trị của show_messages trong theme_ process_page. Nếu đó là TRUE (mặc định) thì nó gọi chủ đề ('status_messages') như trên và làm trống hiệu quả bộ lưu trữ thư, do đó, việc gọi cùng chức năng chủ đề sẽ chỉ trả về một chuỗi trống. Tuy nhiên, nếu chúng ta đặt biến đó thành FALSE, điều này sẽ ngăn chức năng chủ đề đã nói được gọi trong process_page, cho phép chúng ta nhận được tất cả các tin nhắn bằng cùng một chức năng chủ đề, trong một mẫu mà chúng ta chọn.


1
Và nếu bạn chỉ muốn điều này thực hiện hành động trên các trang nút, chỉ cần bọc các biến $ ['show_message'] = FALSE với một điều kiện để xem nếu (isset ($ biến ['nút'])).
chia sẻ vào

Và bạn phải làm tương tự cho tất cả các trang khác (lượt xem, bảng điều khiển, v.v.)
Maria Ioannidou

8

Câu trả lời trong Cách hiển thị các tin nhắn từ một khối riêng biệt với các tin nhắn $ trong page.tpl.php mà bạn đã tham chiếu trong câu hỏi của mình là một cách hay. Về cơ bản, bạn cần một cái gì đó như thế này trong đó YOUTHEME là tên của chủ đề của bạn và chức năng này phải có trong template.php của bạn. Tôi thực sự không chạy mã này nhưng có một vết nứt.

function YOURTHEME_preprocess_node(&$vars) {
  $output = '';
  foreach (drupal_get_messages(NULL, FALSE) as $type => $messages) {
    $output .= "<div class=\"messages $type\">\n";
    if (count($messages) > 1) {
      $output .= " <ul>\n";
      foreach ($messages as $message) {
        $output .= '  <li>' . $message . "</li>\n";
      }
      $output .= " </ul>\n";
    }
    else {
      $output .= $messages[0];
    }
    $output .= "</div>\n";
  }

  $vars['messages'] = $output;
}

Sau đó, bạn sẽ có thể xuất thông điệp $ trong node.tpl.php của bạn


Cảm ơn giải pháp. Tôi đã thử nó nhưng nó dường như không hoạt động. Tôi đang sử dụng cách sau để in các tin nhắn $: <? Php in tin nhắn $; ?> Có đúng không?
big_smile

8
Hãy cẩn thận khi lấy những thứ ra khỏi page.tpl.php. Mẫu nút không được sử dụng cho mọi trang, do đó bạn có thể thiếu các thông báo được hiển thị trên các trang không phải nút (ví dụ như trang quản trị). Khi bạn sẽ làm điều này, tôi khuyên bạn nên giữ một dự phòng trong page.tpl.php sẽ hiển thị các tin nhắn của bạn khi chúng chưa bị chặn bởi node.tpl.php.
marcvangend
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.