node.tpl.php 파일에서 $ Messages 인쇄


23

Drupal 7에서 기본적으로 $messages변수는 page.tpl.php에 인쇄됩니다.

$messagesnode.tpl.php 파일 (예 : $ node-mycontenttype.tpl.php) 로 인쇄하는 방법이 있습니까?

그냥 퍼팅 <?php print $messages; ?>또는 <?php print render($page['messages']); ?>작동하지 않습니다.

여기 에 $ 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 코어는 theme_process_page에서 show_messages의 값을 확인합니다. TRUE (기본값) 인 경우 위와 같이 theme ( 'status_messages')를 호출하고 효과적으로 메시지 스토리지를 비우므로 나중에 동일한 테마 함수를 호출하면 빈 문자열이 리턴됩니다. 그러나 해당 변수를 FALSE로 설정하면 process_page에서 테마 기능이 호출되는 것을 방지하여 선택한 템플릿에서 동일한 테마 기능을 사용하여 모든 메시지를 가져올 수 있습니다.


1
노드 페이지에서만이 작업을 수행하려면 $ variables [ 'show_message'] = FALSE를 조건부로 감싸서 if (isset ($ variables [ 'node'])를 확인하십시오.
areynolds

그리고 당신은 다른 모든 페이지 (보기, 패널 등)에 대해서도 동일하게해야합니다.
Maria Ioannidou

8

질문에서 참조 한 page.tpl.php의 $ messages와 별도로 블록의 메시지를 표시하는 방법 에 대한 답변은 좋은 방법입니다. 본질적으로 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;
}

그런 다음 node에서 $ messages를 출력 할 수 있어야합니다.


솔루션 주셔서 감사합니다. 나는 그것을 시도했지만 작동하지 않는 것 같습니다. $ messages를 인쇄하기 위해 다음을 사용하고 있습니다. <? php print $ messages; ?> 맞습니까?
big_smile

8
page.tpl.php에서 물건을 가져올 때주의하십시오. 노드 템플리트가 모든 페이지에 사용되는 것은 아니므로 노드 페이지가 아닌 페이지 (예 : 관리자 페이지)에 표시되는 메시지가 누락 될 수 있습니다. 이 작업을 수행 할 때 page.tpl.php에 폴백을 유지하여 메시지가 아직 node.tpl.php에 의해 인터셉트되지 않을 때 표시되도록 권장합니다.
marcvangend
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.