उपयोगकर्ताओं से त्रुटियों को छिपाएं लेकिन व्यवस्थापक को दिखाएं?


18

'त्रुटि संदेश प्रदर्शित करने के लिए' के ​​तहत मैं त्रुटियों को छिपा सकता हूं (जैसा कि उत्पादन साइटों के लिए अनुशंसित है)। हालांकि क्या एक निश्चित भूमिका को छोड़कर सभी के लिए त्रुटियों को छिपाना संभव है?


हाँ, यह है कि वहाँ के लिए कुछ मॉड्यूल हैं। लेकिन आप जो सुझाव दे रहे हैं वह भी त्रुटियों को छुपाता है, जैसा कि मैंने नीचे बताया है।
सप्तऋषि

यहाँ फ़ीचर अनुरोध drupal.org/node/2743119
जियोर्जियो79

जवाबों:


18

प्रस्तावना: यह उत्तर पहली बार " मैं उपयोगकर्ताओं के लिए चेतावनी या त्रुटि संदेश को कैसे दबाऊं? " के उत्तर के रूप में पोस्ट किया गया था ।

संदेश मॉड्यूल अक्षम करें

आप इसके लिए डिसएबल मैसेज मॉड्यूल का उपयोग कर सकते हैं । यहाँ इसके परियोजना पृष्ठ का एक उद्धरण है:

उपयोगकर्ताओं को समाप्त करने के लिए दिखाए गए विशिष्ट संदेशों को अक्षम करने के लिए साइट स्वामी विकल्प देता है। Drupal_set_message द्वारा प्रस्तुत कोर ड्रुपल मैसेज सिस्टम, अंत उपयोगकर्ताओं को संदेश भेजने के लिए मॉड्यूल का एक शानदार तरीका है। हालांकि सभी ड्रुपल साइट के मालिक ड्रुपल कोर और सभी मॉड्यूल द्वारा भेजे गए सभी संदेशों को अपने उपयोगकर्ताओं को दिखाने के लिए उत्सुक नहीं हैं। यह मॉड्यूल साइट प्रशासकों को अंतिम उपयोगकर्ताओं को दिखाए गए संदेशों को फ़िल्टर करने का एक उचित शक्तिशाली तरीका देता है।

इसकी कुछ विशेषताएं हैं:

  • उन संदेशों को फ़िल्टर करें जो एक पूर्ण पाठ स्ट्रिंग से बिल्कुल मेल खाते हैं।
  • उन संदेशों को फ़िल्टर करें जो एक नियमित अभिव्यक्ति से मेल खाते हैं।
  • अनुमतियाँ विशेष रूप से किसी भी भूमिका से दिए गए प्रकार के सभी संदेशों को छिपाने के लिए।
  • विशिष्ट उपयोगकर्ताओं के लिए सभी फ़िल्टरिंग अक्षम करें।
  • विशिष्ट पथ के लिए सभी फ़िल्टरिंग अक्षम करें।
  • केवल विशिष्ट रास्तों के लिए फ़िल्टरिंग लागू करें।
  • अंतिम उपयोगकर्ताओं को दिखाए बिना 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>).

तो बस एक सरल "किसी भी चरित्र" रेगेक्स: "। +" के रूप में ग्रीप के मांस को लपेटें:

.+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; ?>

या आप इसे अपने प्रीप्रोसेस फंक्शन में कर सकते हैं (यकीन नहीं होता कि मैसेज वेरिएबल को सही कहा जाता है लेकिन यह आपको एक आइडिया दे सकता है)


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
आप सही हैं, आप यह पता लगाने की कोशिश कर सकते हैं कि त्रुटि संदेश डिफ़ॉल्ट संदेशों से कैसे भिन्न होते हैं और इसके लिए एक हुक_प्रमाण पत्र बनाते हैं। सौभाग्य!
जुर्गेनआर जुआर

4

वास्तव में यह वास्तव में उल्लेखनीय नहीं है।

आप उपयोगकर्ताओं या भूमिकाओं के लिए सभी संदेश छिपा सकते हैं लेकिन मुख्य समस्या उस तरह से है जिसमें ड्रुपल त्रुटियों को वर्गीकृत करता है।

प्रपत्र त्रुटि संदेश फ़ंक्शन के लिए डेटाबेस अपवाद के समान है, इसलिए यदि आप त्रुटियों को छिपाते हैं तो आप एक टिप्पणी फ़ॉर्म के त्रुटि संदेशों को भी छिपाते हैं।

मैं किसी को गलत साबित करने के लिए प्यार करूंगा क्योंकि मैं एक ही समय पर फ़ॉपी नोटिस प्राप्त करने में कामयाब नहीं हुआ हूं, लेकिन फॉर्म नोटिफ़िकेशन दिखा रहा हूं।


4

Drupal वेबसाइट से नोटिस निकालने के लिए कृपया नीचे दिए गए चरणों का पालन करें:

  • व्यवस्थापक / कॉन्फ़िगर / विकास / लॉगिंग पर जाएं।
  • आपके पास तीन विकल्प हैं:
    1. None सभी त्रुटि रिपोर्टिंग को अक्षम कर देगा।
    2. Errors and warnings सबसे गंभीर समस्याओं पर प्रदर्शित करेगा।
    3. All messages सभी समस्याओं को प्रदर्शित करेगा और संभवतः केवल डेवलपर्स के लिए उपयोगी है।

कोड के माध्यम से नोटिस और त्रुटि संदेश को अक्षम करने का दूसरा तरीका। settings.phpफ़ाइल में निम्न कोड जोड़ें :

$conf['error_level']=0;

आप ड्रुपल को केवल इन निर्देशों का पालन करते हुए त्रुटियों को लॉग करने के लिए कॉन्फ़िगर कर सकते हैं: पर जाएं Administration > Configuration > Development > Logging and errors सीधे रास्ते पर जाएं या /admin/config/development/logging" कोई भी प्रदर्शित करने के लिए त्रुटि संदेश" सेट करें । Drupal तब भी त्रुटियों को लॉग करता है, लेकिन उन्हें उपयोगकर्ताओं को प्रदर्शित नहीं करता है।

यदि आपको अधिक नियंत्रण की आवश्यकता है तो Disable Messagesमॉड्यूल का उपयोग करें ।


यह drupal_set_message के बारे में है, त्रुटि संदेश नहीं।
njp

@njp - वे सभी $ संदेशों में घूमते हैं। अपने टेम्प्लेट देखें।
लेमनक्स

3

आप बेहतर संदेश मॉड्यूल का उपयोग कर सकते हैं । यह कुछ सूचनाओं को फ़िल्टर करने के लिए भूमिका आधारित विन्यास और / या नियमित अभिव्यक्ति प्रदान करता है।


संदेशों को दिखाने के लिए बेहतर संदेश की भूमिका आधारित विन्यास नहीं है, केवल संदेशों के मॉड्यूल प्रकार दिखाने के लिए
reptilex

2

आप इस कोड को अपनी थीम में टिप्पणी कर सकते हैं

<?php if ($messages): ?>
    <div id="messages"><div class="section clearfix">
      <?php print $messages; ?>
    </div></div> <!-- /.section, /#messages -->
  <?php endif; ?>

या status_messages विषय तत्व यह कार्य करता है आप खाका में खुद के विषय समारोह लिख सकते हैं

MYTHEME_status_messages(&$variables){}

यह केवल त्रुटियों को नोटिस करने और चेतावनी देने के लिए प्रभावी हो सकता है


1
लेकिन अगर इस $messagesसेक्शन पर टिप्पणी की जाती है तो यह एडमिट के लिए भी प्रदर्शित नहीं होगा।
GoodSp33d

मेरी समझ यह है कि मैं छिपा नहीं सकता <; php प्रिंट $ संदेश; उपयोगकर्ताओं के रूप में यह इरोज़ दिखाता है कि उपयोगकर्ताओं को और साथ ही डेटाबेस प्रकार की त्रुटियों को देखने की आवश्यकता है, उदाहरण के लिए यदि आप एक नोड बनाने की कोशिश करते हैं और एक अनिवार्य फ़ील्ड छोड़ते हैं। धन्यवाद
Evanss

api.drupal.org/api/drupal/includes -theme.inc/function/… यहाँ बताया गया है कि कोर इस तर्क को रेंडर करने के लिए एक चेतावनी संदेश तैयार करता है और अपने विषयों में mythemename__atatus_messages () में अपने तर्क जोड़ें।
जुलूस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.