Wydrukuj $ Messages w pliku node.tpl.php

23

W Drupal 7 domyślnie $messageszmienna jest drukowana w page.tpl.php.

Czy istnieje sposób drukowania $messagesw pliku node.tpl.php (np. $ Node-mycontenttype.tpl.php).

Po prostu zakładanie <?php print $messages; ?>lub <?php print render($page['messages']); ?>nie działa.

Jest tu tutorial do drukowania $ wiadomości w bloku, ale chciałbym umieścić go w moim pliku node.tpl.php.

szeroki uśmiech
źródło
Myślę, że theme_status_messages jest wywoływany wcześniej, template_preprocess_nodewięc drupal_get_messages jest pusty, kiedy go wywołujesz.
anonimowy programista

Odpowiedzi:

30

Właściwie to, co chcesz zrobić, to:

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');
}

Jak to działa: Rdzeń Drupala sprawdza wartość show_messages w page_process_page. Jeśli ma wartość PRAWDA (domyślnie), wówczas wywołuje motyw („status_messages”) jak wyżej i skutecznie opróżnia pamięć wiadomości, więc wywołanie tej samej funkcji motywu po prostu zwróci pusty ciąg. Jeśli jednak ustawimy tę zmienną na FAŁSZ, uniemożliwi to wywołanie wspomnianej funkcji motywu na stronie proces_strony, co pozwoli nam uzyskać wszystkie wiadomości przy użyciu tej samej funkcji motywu, w wybranym przez nas szablonie.

Freek
źródło
1
A jeśli chcesz, aby to działało tylko na stronach węzłów, po prostu zawiń zmienne $ ['show_message'] = FALSE z warunkiem, aby sprawdzić, czy (isset ($ zmienne ['node'])).
areynolds
I musisz zrobić to samo dla wszystkich innych stron (widoków, paneli itp.)
Maria Ioannidou
8

Odpowiedź na pytanie, jak wyświetlać wiadomości z bloku oddzielnie od $ messages na page.tpl.php, do którego odwołujesz się w swoim pytaniu, jest dobrym rozwiązaniem. Zasadniczo potrzebujesz czegoś takiego, gdzie YOURTHEME to nazwa twojego motywu i ta funkcja powinna znajdować się w pliku template.php. Właściwie nie uruchomiłem tego kodu, ale mam w nim crack.

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;
}

Powinieneś być w stanie wyprowadzać wiadomości $ w pliku node.tpl.php

Stewart Robinson
źródło
Dzięki za rozwiązanie. Próbowałem, ale wydaje się, że nie działa. Korzystam z następujących poleceń, aby wydrukować $ messages: <? Php print $ messages; ?> Czy to prawda?
big_smile
8
Zachowaj ostrożność podczas wyjmowania plików ze strony.tpl.php. Szablon węzła nie jest używany dla każdej strony, więc może brakować komunikatów wyświetlanych na stronach innych niż węzeł (na przykład na stronach administracyjnych). Kiedy masz zamiar to zrobić, zalecamy zachowanie rezerwy na page.tpl.php, która pokaże twoje wiadomości, gdy nie zostaną jeszcze przechwycone przez node.tpl.php.
marcvangend