Unter 'Anzuzeigende Fehlermeldungen' kann ich Fehler ausblenden (wie es für Produktionsstandorte empfohlen wird). Ist es jedoch möglich, Fehler für alle außer einer bestimmten Rolle zu verbergen?
Unter 'Anzuzeigende Fehlermeldungen' kann ich Fehler ausblenden (wie es für Produktionsstandorte empfohlen wird). Ist es jedoch möglich, Fehler für alle außer einer bestimmten Rolle zu verbergen?
Antworten:
Vorwort: Diese Antwort wurde zuerst als Antwort auf " Wie unterdrücke ich eine Warnung oder Fehlermeldung für Site-Benutzer? "
Sie können hierfür das Modul Nachrichten deaktivieren verwenden . Hier ist ein Zitat von seiner Projektseite:
Bietet einem Websitebesitzer Optionen zum Deaktivieren bestimmter Nachrichten, die Endbenutzern angezeigt werden. Das von drupal_set_message angebotene zentrale Drupal-Nachrichtensystem ist eine hervorragende Möglichkeit für Module, Nachrichten an Endbenutzer zu senden. Allerdings möchten nicht alle Drupal-Websitebesitzer ihren Benutzern alle von Drupal Core und allen Modulen gesendeten Nachrichten anzeigen. Dieses Modul bietet Site-Administratoren eine einigermaßen leistungsstarke Möglichkeit, Nachrichten herauszufiltern, die den Endbenutzern angezeigt werden.
Einige seiner Funktionen sind:
- Filtern Sie Nachrichten heraus, die genau mit einer Volltextzeichenfolge übereinstimmen.
- Filtern Sie Nachrichten heraus, die einem regulären Ausdruck entsprechen.
- Berechtigungen zum gezielten Ausblenden aller Nachrichten eines bestimmten Typs vor einer beliebigen Rolle.
- Deaktivieren Sie alle Filter für bestimmte Benutzer.
- Deaktivieren Sie alle Filter für bestimmte Pfade.
- Wenden Sie die Filterung nur für bestimmte Pfade an.
- Debuggen Sie das System, um Nachrichten im HTML-Code abzurufen, ohne sie den Endbenutzern anzuzeigen.
Verfügbar für Drupal 6, Drupal 7 oder Drupal 8.
Wenn Sie die Funktion " Regulärer Ausdruck " verwenden, müssen Sie sicherstellen, dass Sie einen regulären Ausdruck verwenden, der die Fehlermeldung "abfängt", die Sie abfangen möchten, wie auch in der Community-Dokumentation erläutert .
Unter " Tipp: Halten Sie es einfach. " Auf dieser Seite finden Sie ein großartiges Beispiel, das so aussieht:
Seien Sie sich bewusst, dass etwas, das sehr einfach erscheint, wie:
Notice: Undefined index: field_txt_student_id in ctools_entity_form_field_content_type_render() (line 96 of [...]entity_form_field.inc).
Es enthält viel mehr unsichtbare Zeichen, als man erwarten könnte:
<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>).
Also wickeln Sie das Fleisch des Greps einfach mit einem einfachen "Beliebigen Zeichen" ein. Regex: ". +" Wie in:
.+Notice.+Undefined index:.+ctools_entity_form_field_content_type_render.+entity_form_field.inc.+
Der "Hinweis", um eine korrekte Meldung zu erhalten, besteht darin, die Fehlermeldung, die Sie abfangen möchten, zu verkleinern und gegebenenfalls " . + " - Zeichen einzufügen.
Wenn Sie über das Verkleinern sprechen, beachten Sie, dass das field_txt_student_id
auch im regulären Ausdruck weggelassen wurde (damit es NICHT vom Feldnamen abhängt).
Angenommen, Sie möchten die folgende Fehlermeldung abfangen:
PDOException: in dblog_watchdog () (Zeile 160 von /home/dbuser/public_html/yoursitesname.com/modules/dblog/dblog.module).
In diesem Fall sollte ein möglicher regulärer Ausdruck ungefähr so aussehen:
.+PDOException.+in dblog_watchdog().+(line 160 of.+/modules/dblog/dblog.module).+
Beachten Sie, dass ich zuvor absichtlich keinen Teil des Pfads angegeben habe /modules/dblog/dblog.module
(damit er an einer anderen Stelle wiederverwendet werden kann, an der derselbe Fehler auftritt ...).
Beachten Sie auch, dass Sie sich Gedanken darüber machen müssen, 160
ob der Teil ja oder nein sein soll : Wenn sich das Modul jemals ein bisschen ändert, so dass es in der Fehlermeldung (z. B.) zur Zeile wird 161
, wird Ihr Fehler nicht mehr abgefangen. Um dies zu vermeiden, lassen Sie den Teil 160 weg, wenn Sie dies bevorzugen (persönlich würde ich den Fehler lieber erst dann wieder sehen und dann meinen regulären Ausdruck erneut anpassen).
Wenn Ihr regulärer Ausdruck zunächst nicht funktioniert (= die Meldung wird weiterhin angezeigt), liegt dies möglicherweise an einem Tippfehler im regulären Ausdruck. Um einen solchen Tippfehler zu finden, versuchen Sie es zunächst mit einem weniger einschränkenden regulären Ausdruck, auch wenn es nur darum ging, so etwas zu versuchen (um ALLE Nachrichten abzufangen, die PDOException
und enthalten dblog_watchdog
):
.+PDOException.+dblog_watchdog.+
Oder auch so (um ALLE Nachrichten abzufangen, die enthalten PDOException
):
.+PDOException.+
Diese letzten beiden Ausdrücke würden wahrscheinlich viel zu viele Nachrichten unterdrücken. Sie sollten sie daher auf den einzelnen Ausdruck beschränken, den Sie suchen.
Alternativ gibt es auch das Better Messages- Modul. Für D7 (worum es in dieser Frage geht) gibt es jedoch nur eine Alfa-Version.
Sie können die Benutzerrolle mit der Funktion in_array () überprüfen. In Ihrer Vorlage:
<?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; ?>
Oder Sie können dies in Ihrer Vorverarbeitungsfunktion tun (nicht sicher, ob die Nachrichtenvariable korrekt aufgerufen wird, aber es kann Ihnen eine Idee geben).
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']);
}
}
Eigentlich ist das nicht wirklich machbar.
Sie können alle Nachrichten für Benutzer oder Rollen ausblenden, aber das Hauptproblem liegt in der Art und Weise, wie Drupal Fehler kategorisiert.
Ein Formularfehler entspricht einer Datenbankausnahme für die Nachrichtenfunktion. Wenn Sie also Fehler ausblenden, werden auch die Fehlermeldungen eines Kommentarformulars ausgeblendet.
Ich würde mich freuen, wenn jemand mich als falsch beweist, weil ich es nicht geschafft habe, PHP-Benachrichtigungen auszublenden, aber gleichzeitig Formularbenachrichtigungen anzuzeigen.
Führen Sie die folgenden Schritte aus, um Benachrichtigungen von einer Drupal-Website zu entfernen:
None
deaktiviert alle Fehlermeldungen.Errors and warnings
wird bei den schwerwiegendsten Problemen angezeigt.All messages
zeigt alle Probleme an und ist wahrscheinlich nur für Entwickler nützlich.Eine andere Möglichkeit, Benachrichtigung und Fehlermeldung über Code zu deaktivieren. Fügen Sie der settings.php
Datei folgenden Code hinzu :
$conf['error_level']=0;
Sie können Drupal auch so konfigurieren, dass nur die Fehler protokolliert werden, die den folgenden Anweisungen entsprechen: Wechseln Sie zu Administration > Configuration > Development > Logging and errors
oder direkt zu dem Pfad, /admin/config/development/logging
und setzen Sie "Anzuzeigende Fehlermeldungen" auf " Keine" . Drupal protokolliert dann weiterhin Fehler, zeigt sie den Benutzern jedoch nicht an.
Wenn Sie mehr Kontrolle benötigen, verwenden Sie das Disable Messages
Modul.
Sie können das bessere Nachrichtenmodul verwenden . Es bietet einen rollenbasierten Konfigurations- und / oder Ausdrucksvergleich, um einige Benachrichtigungen herauszufiltern.
Sie können diesen Code in Ihrem Thema kommentieren
<?php if ($messages): ?>
<div id="messages"><div class="section clearfix">
<?php print $messages; ?>
</div></div> <!-- /.section, /#messages -->
<?php endif; ?>
oder status_messages theme element dient dazu, eine eigene theme funktion in template.php zu schreiben
MYTHEME_status_messages(&$variables){}
Dies könnte sich nur auf Hinweis- und Warnfehler auswirken
$messages
Abschnitt kommentiert ist, wird er auch nicht für Administratoren angezeigt.