ซ่อนข้อผิดพลาดจากผู้ใช้ แต่แสดงต่อผู้ดูแลระบบหรือไม่


18

ใต้ 'ข้อความแสดงข้อผิดพลาดเพื่อแสดง' ฉันสามารถซ่อนข้อผิดพลาด (ตามที่แนะนำสำหรับไซต์ที่ใช้งานจริง) อย่างไรก็ตามเป็นไปได้หรือไม่ที่จะซ่อนข้อผิดพลาดสำหรับทุกคนยกเว้นบางบทบาท


ใช่มันมีบางโมดูลอยู่รอบ ๆ แต่สิ่งที่คุณแนะนำจะซ่อนข้อผิดพลาดด้วยเช่นกันตามที่ฉันระบุไว้ด้านล่าง
reptilex

คำขอคุณสมบัติที่นี่drupal.org/node/2743119
giorgio79

คำตอบ:


18

คำนำ: คำตอบนี้ถูกโพสต์ครั้งแรกเป็นคำตอบของ " ฉันจะระงับคำเตือนหรือข้อความแสดงข้อผิดพลาดสำหรับผู้ใช้ไซต์ได้อย่างไร "

ปิดใช้งานโมดูลข้อความ

คุณสามารถใช้โมดูล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 (ซึ่งเป็นสิ่งที่คำถามนี้เกี่ยวกับ) มันมีเพียงรุ่นอัลฟ่า


6

คุณสามารถตรวจสอบบทบาทผู้ใช้โดยใช้ฟังก์ชัน 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']);
  }
}


ความเข้าใจของฉันคือฉันไม่สามารถซ่อน <? php พิมพ์ข้อความ $; ?> จากผู้ใช้ซึ่งแสดงถึงข้อผิดพลาดที่ผู้ใช้ต้องเห็นเช่นเดียวกับข้อผิดพลาดประเภทฐานข้อมูลเช่นถ้าคุณพยายามสร้างโหนดและไม่ต้องป้อนข้อมูลในฟิลด์บังคับ ขอบคุณ
Evanss

1
คุณถูกต้องคุณสามารถลองค้นหาว่าข้อความแสดงข้อผิดพลาดแตกต่างจากข้อความเริ่มต้นและสร้าง hook_permission อย่างไร โชคดี!
JurgenR

4

จริง ๆ แล้วสิ่งนี้ไม่สามารถทำได้

คุณสามารถซ่อนข้อความทั้งหมดสำหรับผู้ใช้หรือบทบาท แต่ปัญหาหลักอยู่ที่วิธี drupal จัดหมวดหมู่ข้อผิดพลาด

ข้อผิดพลาดในแบบฟอร์มเหมือนกับข้อยกเว้นฐานข้อมูลสำหรับฟังก์ชั่นข้อความดังนั้นหากคุณซ่อนข้อผิดพลาดคุณยังซ่อนข้อความแสดงข้อผิดพลาดของแบบฟอร์มความคิดเห็น

ฉันจะรักใครสักคนที่จะพิสูจน์ว่าฉันผิดเพราะฉันไม่สามารถซ่อนประกาศ php ได้ แต่แสดงแบบฟอร์มการแจ้งเตือนในเวลาเดียวกัน


4

หากต้องการลบการแจ้งเตือนออกจากเว็บไซต์ Drupal โปรดทำตามขั้นตอนด้านล่าง:

  • ไปที่ผู้ดูแลระบบ / กำหนดค่า / พัฒนา / บันทึก
  • คุณมีสามทางเลือก:
    1. None จะปิดใช้งานการรายงานข้อผิดพลาดทั้งหมด
    2. Errors and warnings จะแสดงปัญหาที่ร้ายแรงที่สุด
    3. All messages จะแสดงปัญหาทั้งหมดและอาจเป็นประโยชน์สำหรับนักพัฒนาเท่านั้น

อีกวิธีหนึ่งในการปิดใช้งานการแจ้งเตือนและข้อความแสดงข้อผิดพลาดผ่านรหัส เพิ่มรหัสต่อไปนี้ไปยังsettings.phpไฟล์:

$conf['error_level']=0;

คุณยังสามารถกำหนดค่า Drupal เพียงเข้าสู่ระบบข้อผิดพลาดต่อไปนี้คำแนะนำเหล่านี้ไปAdministration > Configuration > Development > Logging and errorsหรือไปเส้นทาง/admin/config/development/loggingและการตั้งค่า "ข้อผิดพลาดในการแสดงผล" เพื่อใคร Drupal ยังคงบันทึกข้อผิดพลาด แต่ไม่แสดงให้ผู้ใช้เห็น

หากคุณต้องการการควบคุมเพิ่มเติมให้ใช้Disable Messagesโมดูล


นี่เป็นเรื่องเกี่ยวกับ drupal_set_message ไม่ใช่ข้อความแสดงข้อผิดพลาด
njp

@njp - พวกเขาทั้งหมดเดินเข้าไปในข้อความ $ ตรวจสอบเทมเพลตของคุณ
leymannx

3

คุณสามารถใช้โมดูลข้อความที่ดีขึ้น มันมีการกำหนดค่าตามบทบาทและ / หรือการจับคู่นิพจน์ปกติเพื่อกรองการแจ้งเตือนบางอย่าง


ข้อความที่ดีกว่าไม่มีการกำหนดค่าตามบทบาทสำหรับการแสดงข้อความเฉพาะสำหรับการแสดงประเภทของโมดูลข้อความ
สัตว์เลื้อยคลาน

2

คุณอาจจะแสดงความคิดเห็นรหัสนี้ในชุดรูปแบบของคุณ

<?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){}

สิ่งนี้อาจมีผลเฉพาะกับข้อสังเกตและการเตือนที่ผิดพลาดเท่านั้น


1
แต่หาก$messagesมีการแสดงความคิดเห็นในส่วนนี้จะไม่แสดงสำหรับผู้ดูแลระบบด้วย
GoodSp33d

ความเข้าใจของฉันคือฉันไม่สามารถซ่อน <? php พิมพ์ข้อความ $; ?> จากผู้ใช้ซึ่งแสดงถึงข้อผิดพลาดที่ผู้ใช้ต้องเห็นเช่นเดียวกับข้อผิดพลาดประเภทฐานข้อมูลเช่นถ้าคุณพยายามสร้างโหนดและไม่ต้องป้อนข้อมูลในฟิลด์บังคับ ขอบคุณ
Evanss

api.drupal.org/api/drupal/includes!theme.inc/function/…นี่คือวิธีที่ core จัดเตรียมข้อความเตือนสำหรับการเรนเดอร์คุณสามารถคัดลอกตรรกะนี้และเพิ่มตรรกะของคุณเองใน mythemename_status_messages () ในธีมเทมเพลตธีมของคุณ
werqious
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.