Fehler vor Benutzern verbergen, aber dem Administrator anzeigen?

18

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?

Evanss
quelle
Ja, es gibt einige Module dafür. Aber was Sie vorschlagen, verbirgt auch Formfehler, wie ich unten angegeben habe.
Reptilex
Feature-Anfrage hier drupal.org/node/2743119
giorgio79

Antworten:

18

Vorwort: Diese Antwort wurde zuerst als Antwort auf " Wie unterdrücke ich eine Warnung oder Fehlermeldung für Site-Benutzer? "

Modul Nachrichten deaktivieren

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.

Informationen zur Verwendung regulärer Ausdrücke

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_idauch im regulären Ausdruck weggelassen wurde (damit es NICHT vom Feldnamen abhängt).

Beispiel

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, 160ob 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 PDOExceptionund 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.

Instabile Alternative

Alternativ gibt es auch das Better Messages- Modul. Für D7 (worum es in dieser Frage geht) gibt es jedoch nur eine Alfa-Version.

Pierre.Vriens
quelle
6

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']);
  }
}

JurgenR
quelle
Mein Verständnis ist, dass ich <? Php print $ messages nicht verstecken kann; ?> von Benutzern, da es Fehler anzeigt, die Benutzer sehen müssen, sowie Datenbanktypfehler, z. B. wenn Sie versuchen, einen Knoten zu erstellen und ein Pflichtfeld wegzulassen. Vielen Dank
Evanss
1
Sie haben Recht, Sie könnten versuchen herauszufinden, wie sich die Fehlermeldungen von den Standardnachrichten unterscheiden, und eine hook_permission dafür erstellen. Viel Glück!
JurgenR
4

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.

Reptilex
quelle
4

Führen Sie die folgenden Schritte aus, um Benachrichtigungen von einer Drupal-Website zu entfernen:

  • Gehen Sie zu admin / config / development / logging.
  • Sie haben drei Möglichkeiten:
    1. None deaktiviert alle Fehlermeldungen.
    2. Errors and warnings wird bei den schwerwiegendsten Problemen angezeigt.
    3. 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.phpDatei 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 errorsoder direkt zu dem Pfad, /admin/config/development/loggingund 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 MessagesModul.

Adi
quelle
Hier geht es um drupal_set_message, nicht um Fehlermeldungen.
27.
@njp - alle wandern in $ messages. Überprüfen Sie Ihre Vorlagen.
Leymannx
3

Sie können das bessere Nachrichtenmodul verwenden . Es bietet einen rollenbasierten Konfigurations- und / oder Ausdrucksvergleich, um einige Benachrichtigungen herauszufiltern.

BetaRide
quelle
Bessere Nachrichten haben keine rollenbasierte Konfiguration zum
Anzeigen
2

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

wütend
quelle
1
Wenn ein $messagesAbschnitt kommentiert ist, wird er auch nicht für Administratoren angezeigt.
GoodSp33d
Mein Verständnis ist, dass ich <? Php print $ messages nicht verstecken kann; ?> von Benutzern, da es Fehler anzeigt, die Benutzer sehen müssen, sowie Datenbanktypfehler, z. B. wenn Sie versuchen, einen Knoten zu erstellen und ein Pflichtfeld wegzulassen. Vielen Dank
Evanss
api.drupal.org/api/drupal/includes!theme.inc/function/… hier ist, wie core Warnmeldungen zum Rendern vorbereitet. Sie können diese Logik kopieren und Ihre eigene Logik in mythemename_status_messages () in Ihrer Datei themes template.php hinzufügen
Werqious