ใต้ 'ข้อความแสดงข้อผิดพลาดเพื่อแสดง' ฉันสามารถซ่อนข้อผิดพลาด (ตามที่แนะนำสำหรับไซต์ที่ใช้งานจริง) อย่างไรก็ตามเป็นไปได้หรือไม่ที่จะซ่อนข้อผิดพลาดสำหรับทุกคนยกเว้นบางบทบาท
ใต้ 'ข้อความแสดงข้อผิดพลาดเพื่อแสดง' ฉันสามารถซ่อนข้อผิดพลาด (ตามที่แนะนำสำหรับไซต์ที่ใช้งานจริง) อย่างไรก็ตามเป็นไปได้หรือไม่ที่จะซ่อนข้อผิดพลาดสำหรับทุกคนยกเว้นบางบทบาท
คำตอบ:
คำนำ: คำตอบนี้ถูกโพสต์ครั้งแรกเป็นคำตอบของ " ฉันจะระงับคำเตือนหรือข้อความแสดงข้อผิดพลาดสำหรับผู้ใช้ไซต์ได้อย่างไร "
คุณสามารถใช้โมดูลDisable Messagesสำหรับสิ่งนี้ นี่คือคำพูดจากหน้าโครงการ:
ให้ตัวเลือกเจ้าของไซต์เพื่อปิดการใช้งานข้อความเฉพาะที่แสดงให้ผู้ใช้ปลายทาง ระบบข้อความหลัก drupal ที่นำเสนอโดย drupal_set_message เป็นวิธีที่ยอดเยี่ยมสำหรับโมดูลในการส่งข้อความไปยังผู้ใช้ปลายทาง อย่างไรก็ตามเจ้าของไซต์ drupal ทุกคนไม่กระตือรือร้นที่จะแสดงข้อความทั้งหมดที่ส่งออกมาจากแกน drupal และโมดูลทั้งหมดให้กับผู้ใช้ โมดูลนี้ช่วยให้ผู้ดูแลไซต์มีวิธีที่มีประสิทธิภาพพอสมควรในการกรองข้อความที่แสดงต่อผู้ใช้ปลายทาง
คุณลักษณะบางอย่างของมันคือ:
- กรองข้อความที่ตรงกับสตริงข้อความทั้งหมด
- กรองข้อความที่ตรงกับนิพจน์ทั่วไป
- สิทธิ์ในการซ่อนข้อความทั้งหมดของประเภทที่กำหนดจากบทบาทใด ๆ โดยเฉพาะ
- ปิดใช้งานการกรองทั้งหมดสำหรับผู้ใช้ที่ระบุ
- ปิดใช้งานการกรองทั้งหมดสำหรับเส้นทางที่เฉพาะเจาะจง
- ใช้การกรองสำหรับเส้นทางเฉพาะเท่านั้น
- แก้ไขข้อบกพร่องของระบบเพื่อรับข้อความใน HTML โดยไม่แสดงให้ผู้ใช้เห็น
สามารถใช้ได้ทั้ง Drupal 6, Drupal 7 หรือ Drupal 8
หากคุณกำลังใช้ของ ' การแสดงออกปกติคุณลักษณะ' คุณต้องให้แน่ใจว่าคุณใช้นิพจน์ปกติที่ "จับ" ข้อผิดพลาดที่คุณต้องการที่จะสกัดกั้นตามที่อธิบายไว้ยังอยู่ในเอกสารชุมชน
ด้านล่าง " เคล็ดลับ: ทำให้เรียบง่าย " ในหน้านั้นมีตัวอย่างที่ดีซึ่งดูเหมือนว่า:
ระวังสิ่งที่ปรากฏตรงไปตรงมาเช่น:
Notice: Undefined index: field_txt_student_id in ctools_entity_form_field_content_type_render() (line 96 of [...]entity_form_field.inc).
มีอักขระที่มองไม่เห็นภายในตัวมันมากกว่าหนึ่งตัวที่อาจคาดหวัง:
<em class="placeholder">Notice</em>: Undefined index: field_txt_student_id in <em class="placeholder">ctools_entity_form_field_content_type_render()</em> (line <em class="placeholder">96</em> of <em class="placeholder">[...]entity_form_field.inc</em>).
ดังนั้นเพียงแค่ห่อเนื้อของ grep ด้วย "ตัวอักษร" regex: ". +" อย่างง่าย ๆ ตามที่:
.+Notice.+Undefined index:.+ctools_entity_form_field_content_type_render.+entity_form_field.inc.+
ดังนั้น "เบาะแส" ที่จะเกิดขึ้นกับข้อความที่ถูกต้องคือการหดตัวข้อผิดพลาดที่คุณต้องการที่จะจับและวาง " . + " ตัวอักษรตามความเหมาะสม
พูดคุยเกี่ยวกับการหดตัวโปรดทราบว่าfield_txt_student_id
มีการละเว้นในการแสดงออกปกติด้วย (เพื่อให้ไม่ขึ้นอยู่กับชื่อเขตข้อมูล)
เป็นอีกตัวอย่างหนึ่งสมมติว่าคุณต้องการรับข้อความแสดงข้อผิดพลาดนี้:
PDOException: ใน dblog_watchdog () (บรรทัด 160 ของ /home/dbuser/public_html/yoursitesname.com/modules/dblog/dblog.module)
ในกรณีนี้นิพจน์ทั่วไปที่เป็นไปได้ควรมีลักษณะดังนี้:
.+PDOException.+in dblog_watchdog().+(line 160 of.+/modules/dblog/dblog.module).+
โปรดทราบว่าฉันตั้งใจไม่รวมส่วนหนึ่งของเส้นทางก่อน/modules/dblog/dblog.module
(เพื่อให้สามารถนำไปใช้ซ้ำในไซต์อื่นที่มีข้อผิดพลาดเดียวกันเกิดขึ้น ... )
นอกจากนี้โปรดทราบว่าคุณต้องให้ความคิดที่จะใช่หรือไม่รวม160
ส่วนของมัน: หากโมดูลเปลี่ยนแปลงเล็กน้อยดังนั้นในข้อความแสดงข้อผิดพลาด (เช่น) กลายเป็นบรรทัด161
ข้อผิดพลาดของคุณจะไม่ถูกดักอีกต่อไป เพื่อหลีกเลี่ยงปัญหานี้ให้เว้นส่วนที่ 160 หากเป็นสิ่งที่คุณต้องการ (โดยส่วนตัวแล้วฉันค่อนข้างจะเห็นข้อผิดพลาดกลับมาก่อนแล้วจึงปรับการแสดงออกปกติของฉันอีกครั้ง)
หากการแสดงออกปกติของคุณไม่ทำงานในตอนแรก (= ข้อความยังคงปรากฏ) อาจเป็นเพราะมีการพิมพ์ผิดในการแสดงออกปกติ หากต้องการระบุประเภทที่ผิดพลาดอันดับแรกให้ลองใช้นิพจน์ทั่วไปที่มีข้อ จำกัด น้อยกว่าแม้ว่าจะเป็นการพยายามทำสิ่งที่เป็นเช่นนั้นเท่านั้น (เพื่อจับข้อความทั้งหมดที่มีPDOException
และdblog_watchdog
):
.+PDOException.+dblog_watchdog.+
หรือแม้กระทั่งชอบ (เพื่อจับข้อความทั้งหมดที่มีPDOException
):
.+PDOException.+
การแสดงออก 2 ครั้งสุดท้ายเหล่านี้อาจระงับข้อความมากเกินไปดังนั้นคุณจึงต้องการ จำกัด ให้แคบลงไปยังข้อความเดียวที่คุณติดตาม
นอกจากนี้ยังมีโมดูลข้อความที่ดีขึ้นเป็นทางเลือก อย่างไรก็ตามสำหรับ D7 (ซึ่งเป็นสิ่งที่คำถามนี้เกี่ยวกับ) มันมีเพียงรุ่นอัลฟ่า
คุณสามารถตรวจสอบบทบาทผู้ใช้โดยใช้ฟังก์ชัน in_array () ในแม่แบบของคุณ:
<?php global $user; ?>
<?php if (!in_array('YOUR_ROLE', $user->roles)): ?>
<?php if ($messages): ?>
<div id="messages">
<?php print $messages; ?>
</div> </div>
<?php endif; ?>
<?php endif; ?>
หรือคุณสามารถทำได้ในฟังก์ชั่น preprocess ของคุณ (ไม่แน่ใจว่าเป็นตัวแปรข้อความที่เรียกว่าถูกต้อง แต่มันสามารถทำให้คุณมีความคิด)
function MYTHEME_preprocess_page(&$variables, $hook) {
global $user;
if (!in_array('YOUR_ROLE', $user->roles)){
// This has to be checked, could be something similar.
unset($variables['page']['content']['messages']);
}
}
จริง ๆ แล้วสิ่งนี้ไม่สามารถทำได้
คุณสามารถซ่อนข้อความทั้งหมดสำหรับผู้ใช้หรือบทบาท แต่ปัญหาหลักอยู่ที่วิธี drupal จัดหมวดหมู่ข้อผิดพลาด
ข้อผิดพลาดในแบบฟอร์มเหมือนกับข้อยกเว้นฐานข้อมูลสำหรับฟังก์ชั่นข้อความดังนั้นหากคุณซ่อนข้อผิดพลาดคุณยังซ่อนข้อความแสดงข้อผิดพลาดของแบบฟอร์มความคิดเห็น
ฉันจะรักใครสักคนที่จะพิสูจน์ว่าฉันผิดเพราะฉันไม่สามารถซ่อนประกาศ php ได้ แต่แสดงแบบฟอร์มการแจ้งเตือนในเวลาเดียวกัน
หากต้องการลบการแจ้งเตือนออกจากเว็บไซต์ Drupal โปรดทำตามขั้นตอนด้านล่าง:
None
จะปิดใช้งานการรายงานข้อผิดพลาดทั้งหมดErrors and warnings
จะแสดงปัญหาที่ร้ายแรงที่สุดAll messages
จะแสดงปัญหาทั้งหมดและอาจเป็นประโยชน์สำหรับนักพัฒนาเท่านั้นอีกวิธีหนึ่งในการปิดใช้งานการแจ้งเตือนและข้อความแสดงข้อผิดพลาดผ่านรหัส เพิ่มรหัสต่อไปนี้ไปยังsettings.php
ไฟล์:
$conf['error_level']=0;
คุณยังสามารถกำหนดค่า Drupal เพียงเข้าสู่ระบบข้อผิดพลาดต่อไปนี้คำแนะนำเหล่านี้ไปAdministration > Configuration > Development > Logging and errors
หรือไปเส้นทาง/admin/config/development/logging
และการตั้งค่า "ข้อผิดพลาดในการแสดงผล" เพื่อใคร Drupal ยังคงบันทึกข้อผิดพลาด แต่ไม่แสดงให้ผู้ใช้เห็น
หากคุณต้องการการควบคุมเพิ่มเติมให้ใช้Disable Messages
โมดูล
คุณสามารถใช้โมดูลข้อความที่ดีขึ้น มันมีการกำหนดค่าตามบทบาทและ / หรือการจับคู่นิพจน์ปกติเพื่อกรองการแจ้งเตือนบางอย่าง
คุณอาจจะแสดงความคิดเห็นรหัสนี้ในชุดรูปแบบของคุณ
<?php if ($messages): ?>
<div id="messages"><div class="section clearfix">
<?php print $messages; ?>
</div></div> <!-- /.section, /#messages -->
<?php endif; ?>
หรือองค์ประกอบธีม status_messages ทำหน้าที่นี้คุณอาจเขียนฟังก์ชั่นชุดรูปแบบของตัวเองใน template.php
MYTHEME_status_messages(&$variables){}
สิ่งนี้อาจมีผลเฉพาะกับข้อสังเกตและการเตือนที่ผิดพลาดเท่านั้น
$messages
มีการแสดงความคิดเห็นในส่วนนี้จะไม่แสดงสำหรับผู้ดูแลระบบด้วย