Imprimir $ mensagens no arquivo node.tpl.php

23

No Drupal 7, por padrão, a $messagesvariável é impressa em page.tpl.php.

Existe uma maneira de imprimir $messagesem um arquivo node.tpl.php (por exemplo, $ node-mycontenttype.tpl.php).

Apenas colocando <?php print $messages; ?>ou <?php print render($page['messages']); ?>não funciona.

Há um tutorial aqui para imprimir $ messages em um bloco, mas eu gostaria de colocá-lo no meu arquivo node.tpl.php.

grande sorriso
fonte
Eu acho que theme_status_messages está sendo chamado antes, template_preprocess_nodeentão drupal_get_messages está vazio quando você o chama.
anonym-developer

Respostas:

30

Na verdade, o que você quer fazer é o seguinte:

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

Como isso funciona: O núcleo do Drupal verifica o valor de show_messages em theme_process_page. Se for VERDADEIRO (padrão), ele chamará theme ('status_messages') como acima, e esvaziará efetivamente o armazenamento de mensagens; portanto, chamar a mesma função de tema mais tarde retornará uma string vazia. No entanto, se definirmos essa variável como FALSE, isso impedirá que a referida função tema seja chamada na process_page, permitindo obter todas as mensagens usando a mesma função tema, em um modelo de nossa escolha.

Freek
fonte
1
E se você quiser que isso execute ações nas páginas dos nós, apenas envolva as $ variable ['show_message'] = FALSE com uma condicional para ver se (isset ($ variable ['node'])).
areynolds
E você tem que fazer o mesmo para todas as outras páginas (vistas, painéis, etc)
Maria Ioannidou
8

A resposta em Como exibir mensagens de um bloco separadamente de $ messages no page.tpl.php que você referenciou na sua pergunta é um bom caminho a percorrer. Essencialmente, você precisa de algo parecido com esse: YOURTHEME é o nome do seu tema e essa função deve estar no seu template.php. Na verdade, eu não executei esse código, mas tenho uma rachadura nele.

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

Você deve conseguir enviar $ messages no seu node.tpl.php

Stewart Robinson
fonte
Obrigado pela solução. Eu tentei, mas parece não funcionar. Estou usando o seguinte para imprimir as $ messages: <? Php print $ messages; ?> Isso está correto?
Big_smile 10/11/11
8
Tenha cuidado ao remover itens do page.tpl.php. O modelo de nó não é usado para todas as páginas; portanto, pode haver mensagens ausentes exibidas em páginas que não são do nó (como páginas de administração, por exemplo). Quando você fizer isso, recomendo que você mantenha um fallback no page.tpl.php que mostrará suas mensagens quando elas ainda não foram interceptadas pelo node.tpl.php.
marcvangend