Imprime $ Messages en el archivo node.tpl.php


23

En Drupal 7, por defecto, la $messagesvariable se imprime en page.tpl.php.

¿Hay alguna manera de imprimir $messagesen un archivo node.tpl.php (por ejemplo, $ node-mycontenttype.tpl.php).

Simplemente poner <?php print $messages; ?>o <?php print render($page['messages']); ?>no funciona.

Hay un tutorial aquí para imprimir $ mensajes en un bloque, pero me gustaría ponerlo en mi archivo node.tpl.php.


Creo theme_status_messages se está llamando antes de template_preprocess_nodelo que drupal_get_messages está vacío cuando se llama a ella.
anonym-developer

Respuestas:


30

En realidad, lo que quieres hacer es esto:

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ómo funciona esto: Drupal core verifica el valor de show_messages en theme_process_page. Si es VERDADERO (predeterminado), entonces llama al tema ('status_messages') como se indica arriba, y efectivamente vacía el almacenamiento de mensajes, por lo que llamar a la misma función de tema más tarde solo devolverá una cadena vacía. Sin embargo, si establecemos esa variable en FALSE, esto evita que dicha función de tema se invoque en process_page, lo que nos permite obtener todos los mensajes utilizando la misma función de tema, en una plantilla de nuestra elección.


1
Y si solo desea que esto actúe en las páginas de nodo, simplemente ajuste las variables $ ['show_message'] = FALSE con un condicional para ver si (isset ($ variables ['node'])).
areynolds

Y tiene que hacer lo mismo para todas las demás páginas (vistas, paneles, etc.)
Maria Ioannidou

8

La respuesta en Cómo mostrar mensajes de un bloque por separado de $ messages en page.tpl.php a los que hizo referencia en su pregunta es un buen camino a seguir. Esencialmente, necesita algo como esto donde YOURTHEME es el nombre de su tema y esta función debe estar en su template.php. En realidad no he ejecutado este código, pero tengo una grieta en él.

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

Entonces deberías poder generar $ mensajes en tu nodo.tpl.php


Gracias por la solucion. Lo he intentado pero no parece funcionar. Estoy usando lo siguiente para imprimir los $ mensajes: <? Php print $ messages; ?> ¿Es eso correcto?
big_smile

8
Tenga cuidado al sacar cosas de page.tpl.php. La plantilla de nodo no se usa para todas las páginas, por lo que es posible que le falten mensajes que se muestran en páginas que no son de nodo (como las páginas de administrador, por ejemplo). Cuando vaya a hacer esto, le recomiendo que mantenga una copia de seguridad en page.tpl.php que mostrará sus mensajes cuando todavía no sean interceptados por node.tpl.php.
marcvangend
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.