พิมพ์ $ 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 จึงว่างเปล่าเมื่อคุณเรียก
anonym-developer

คำตอบ:


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 (ค่าเริ่มต้น) จะเรียกธีม ('status_messages') ดังที่กล่าวมาแล้วและทำการจัดเก็บข้อความอย่างมีประสิทธิภาพดังนั้นการเรียกฟังก์ชั่นชุดรูปแบบเดิมในภายหลังจะส่งคืนสตริงว่างเปล่า อย่างไรก็ตามหากเราตั้งค่าตัวแปรนั้นเป็น FALSE สิ่งนี้จะป้องกันไม่ให้เรียกใช้ฟังก์ชั่นชุดรูปแบบดังกล่าวใน process_page ทำให้เราสามารถรับข้อความทั้งหมดโดยใช้ฟังก์ชั่นชุดรูปแบบเดียวกันในเทมเพลตที่เราเลือก


1
และหากคุณต้องการให้สิ่งนี้ดำเนินการกับหน้าโหนดเพียงแค่ห่อ $ variables ['show_message'] = FALSE พร้อมเงื่อนไขเพื่อดูว่า (isset ($ แปรปรวน '$' ['โหนด']))
areynolds

และคุณต้องทำแบบเดียวกันกับหน้าอื่น ๆ ทั้งหมด (มุมมองแผ่นและอื่น ๆ )
Maria Ioannidou

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

จากนั้นคุณควรสามารถส่งออกข้อความ $ ใน node.tpl.php ของคุณ


ขอบคุณสำหรับการแก้ปัญหา ฉันลองแล้ว แต่มันใช้งานไม่ได้ ฉันใช้สิ่งต่อไปนี้เพื่อพิมพ์ข้อความ $: <? php พิมพ์ข้อความ $; ?> ถูกต้องไหม
big_smile

8
โปรดใช้ความระมัดระวังเมื่อนำเนื้อหาออกจาก page.tpl.php เทมเพลตโหนดไม่ได้ใช้สำหรับทุกหน้าดังนั้นคุณอาจหายไปกับข้อความที่ปรากฏบนหน้าเว็บที่ไม่ใช่โหนด (เช่นหน้าผู้ดูแลระบบเป็นต้น) เมื่อคุณกำลังทำสิ่งนี้ฉันแนะนำให้คุณเก็บ fallback ไว้ใน page.tpl.php ที่จะแสดงข้อความของคุณเมื่อพวกเขายังไม่ถูกขัดขวางโดย node.tpl.php
marcvangend
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.