Drucken Sie $ Messages in der Datei node.tpl.php

23

In Drupal 7 wird die $messagesVariable standardmäßig in page.tpl.php gedruckt.

Gibt es eine Möglichkeit, $messagesin einer node.tpl.php-Datei zu drucken (zB $ node-mycontenttype.tpl.php)?

Einfach setzen <?php print $messages; ?>oder <?php print render($page['messages']); ?>geht nicht.

Es gibt ein Tutorial hier zum Drucken von $ messages in einem Block, aber ich mag es in meiner node.tpl.php Datei setzen.

big_smile
quelle
Ich denke, theme_status_messages wird aufgerufen, bevor template_preprocess_nodedrupal_get_messages leer ist, wenn Sie es aufrufen.
Anonym-Entwickler

Antworten:

30

Eigentlich möchten Sie Folgendes tun:

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

So funktioniert das: Drupal Core überprüft den Wert von show_messages in theme_process_page. Wenn es TRUE (Standardeinstellung) ist, wird das Thema ('status_messages') wie oben beschrieben aufgerufen und der Nachrichtenspeicher geleert. Wenn Sie also dieselbe Themenfunktion später aufrufen, wird nur eine leere Zeichenfolge zurückgegeben. Wenn wir diese Variable jedoch auf FALSE setzen, wird verhindert, dass die Themenfunktion in process_page aufgerufen wird, sodass wir alle Nachrichten mit derselben Themenfunktion in einer Vorlage unserer Wahl abrufen können.

Freek
quelle
1
Wenn dies nur auf Knotenseiten erfolgen soll, müssen Sie nur die $ -Variablen ['show_message'] = FALSE mit einer Bedingung versehen, um festzustellen, ob (isset ($ variables ['node'])).
Areynolds
Und Sie müssen das gleiche für alle anderen Seiten tun (Ansichten, Panels usw.)
Maria Ioannidou
8

Die Antwort unter So zeigen Sie Nachrichten aus einem Block getrennt von $ messages in page.tpl.php an, auf die Sie in Ihrer Frage verwiesen haben, ist ein guter Weg. Im Wesentlichen benötigen Sie so etwas, bei dem YOURTHEME der Name Ihres Themas ist und diese Funktion in Ihrer template.php enthalten sein sollte. Ich habe diesen Code noch nicht ausgeführt, aber ich habe einen Riss drauf.

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

Sie sollten dann in der Lage sein, $ messages in Ihrer node.tpl.php auszugeben

Stewart Robinson
quelle
Danke für die Lösung. Ich habe es versucht, aber es scheint nicht zu funktionieren. Ich benutze folgendes, um die $ messages auszudrucken: <? Php print $ messages; ?> Ist das richtig?
big_smile
8
Seien Sie vorsichtig, wenn Sie etwas aus page.tpl.php entfernen. Die Knotenvorlage wird nicht für jede Seite verwendet, daher fehlen möglicherweise Nachrichten, die auf Nicht-Knotenseiten angezeigt werden (z. B. Verwaltungsseiten). Wenn Sie dies tun, empfehle ich Ihnen, in page.tpl.php einen Fallback zu speichern, der Ihre Nachrichten anzeigt, wenn sie noch nicht von node.tpl.php abgefangen wurden.
Marcvangend