Imprimer $ Messages dans le fichier node.tpl.php

23

Dans Drupal 7, par défaut, la $messagesvariable est imprimée dans page.tpl.php.

Existe-t-il un moyen d'imprimer $messagesdans un fichier node.tpl.php (par exemple $ node-mycontenttype.tpl.php).

Juste mettre <?php print $messages; ?>ou <?php print render($page['messages']); ?>ne fonctionne pas.

Il y a un tutoriel ici pour imprimer des messages $ dans un bloc, mais je voudrais le mettre dans mon fichier node.tpl.php.

grand sourire
la source
Je pense que theme_status_messages est appelé avant, template_preprocess_nodedonc drupal_get_messages est vide lorsque vous l'appelez.
anonym-developer

Réponses:

30

En fait, ce que vous voulez faire est le suivant:

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

Comment cela fonctionne: Drupal core vérifie la valeur de show_messages dans theme_process_page. S'il est VRAI (par défaut), il appelle le thème ('status_messages') comme ci-dessus et vide efficacement le stockage des messages, donc appeler la même fonction de thème plus tard renverra simplement une chaîne vide. Cependant, si nous définissons cette variable sur FALSE, cela empêche que ladite fonction de thème soit appelée dans process_page, ce qui nous permet d'obtenir tous les messages en utilisant la même fonction de thème, dans un modèle de notre choix.

Freek
la source
1
Et si vous voulez que cela n'agisse que sur les pages de nœuds, enveloppez simplement les $ variables ['show_message'] = FALSE avec un conditionnel pour voir si (isset ($ variables ['node'])).
areynolds
Et vous devez faire de même pour toutes les autres pages (vues, panneaux, etc.)
Maria Ioannidou
8

La réponse dans Comment afficher les messages d'un bloc séparément de $ messages dans page.tpl.php que vous avez référencé dans votre question est une bonne façon de procéder. Essentiellement, vous avez besoin de quelque chose comme ça où YOURTHEME est le nom de votre thème et cette fonction devrait être dans votre template.php. Je n'ai pas réellement exécuté ce code mais j'ai une fissure.

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

Vous devriez alors pouvoir sortir $ messages dans votre node.tpl.php

Stewart Robinson
la source
Merci pour la solution. Je l'ai essayé mais cela ne semble pas fonctionner. J'utilise les éléments suivants pour imprimer les $ messages: <? Php print $ messages; ?> Est-ce exact?
big_smile
8
Soyez prudent lorsque vous retirez des éléments de page.tpl.php. Le modèle de nœud n'est pas utilisé pour chaque page, il se peut donc que vous manquiez des messages qui s'affichent sur des pages non-nœuds (comme les pages d'administration, par exemple). Lorsque vous allez faire cela, je vous recommande de conserver un repli dans page.tpl.php qui affichera vos messages lorsqu'ils ne sont pas encore interceptés par node.tpl.php.
marcvangend