Распечатать $ Messages в файле node.tpl.php


23

В Drupal 7 по умолчанию $messagesпеременная печатается в page.tpl.php.

Есть ли способ печати $messagesв файле node.tpl.php (например, $ node-mycontenttype.tpl.php).

Просто ставлю <?php print $messages; ?>или <?php print render($page['messages']); ?>не работает.

Там в учебнике здесь для печати $ сообщений в блоке, но я хотел бы, чтобы поместить его в своем файле node.tpl.php.


Я думаю, что theme_status_messages вызывается раньше, template_preprocess_nodeпоэтому drupal_get_messages пуст, когда вы вызываете его.
аноним-разработчик

Ответы:


30

На самом деле, то, что вы хотите сделать, это:

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

Как это работает: ядро ​​Drupal проверяет значение show_messages в theme_process_page. Если это TRUE (по умолчанию), тогда он вызывает theme ('status_messages'), как указано выше, и эффективно очищает хранилище сообщений, поэтому последующий вызов той же функции theme просто вернет пустую строку. Однако, если мы установим для этой переменной значение FALSE, это предотвратит вызов указанной функции темы на странице process_page, что позволит нам получать все сообщения с использованием одной и той же функции темы в выбранном нами шаблоне.


1
И если вы хотите, чтобы это действовало только на страницах узлов, просто оберните переменную $ variable ['show_message'] = FALSE условной проверкой if (isset ($ variable ['node'])).
Арейнольдс

И вы должны сделать то же самое для всех других страниц (просмотров, панелей и т. Д.)
Мария Янниду

8

Ответ в разделе Как отображать сообщения из блока отдельно от $ messages в page.tpl.php, на который вы ссылались в своем вопросе, является хорошим способом. По сути, вам нужно что-то вроде этого, где YOURTHEME - это название вашей темы, и эта функция должна быть в вашем template.php. Я на самом деле не запускал этот код, но у меня есть трещина в нем.

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

После этого вы сможете выводить $ messages в вашем node.tpl.php


Спасибо за решение. Я пробовал это, но это не похоже на работу. Я использую следующее для печати $ messages: <? Php print $ messages; ?> Это правильно?
big_smile

8
Будьте осторожны при извлечении материала из page.tpl.php. Шаблон узла используется не для каждой страницы, поэтому могут отсутствовать сообщения, отображаемые на страницах, не относящихся к узлу (например, на страницах администратора). Когда вы собираетесь это сделать, я рекомендую сохранить резервный файл page.tpl.php, который будет показывать ваши сообщения, когда они еще не перехвачены node.tpl.php.
marcvangend
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.