Nascondere gli errori dagli utenti ma mostrare all'amministratore?


18

In "Messaggi di errore da visualizzare" posso nascondere gli errori (come raccomandato per i siti di produzione). Tuttavia è possibile nascondere errori per tutti tranne un certo ruolo?


sì, ci sono alcuni moduli in giro per quello. Ma ciò che stai suggerendo nasconde anche errori di forma, come ho affermato di seguito.
reptilex,

Richiesta di funzionalità qui drupal.org/node/2743119
giorgio79

Risposte:


18

Prefazione: questa risposta è stata pubblicata per la prima volta come risposta a " Come posso eliminare un messaggio di avviso o di errore per gli utenti del sito? ".

Disabilita il modulo Messaggi

A tale scopo è possibile utilizzare il modulo Disabilita messaggi . Ecco una citazione dalla sua pagina del progetto:

Fornisce opzioni al proprietario di un sito per disabilitare i messaggi specifici mostrati agli utenti finali. Il sistema di messaggi drupal di base offerto da drupal_set_message è un modo eccellente per i moduli di inviare messaggi agli utenti finali. Tuttavia, non tutti i proprietari di siti drupal sono desiderosi di mostrare tutti i messaggi inviati dal core drupal e tutti i moduli ai propri utenti. Questo modulo offre agli amministratori del sito un modo ragionevolmente potente per filtrare i messaggi mostrati agli utenti finali.

Alcune delle sue caratteristiche sono:

  • Filtra i messaggi che corrispondono esattamente a una stringa di testo completo.
  • Filtra i messaggi che corrispondono a un'espressione regolare.
  • Autorizzazioni per nascondere in modo specifico tutti i messaggi di un determinato tipo da qualsiasi ruolo.
  • Disabilita tutti i filtri per utenti specifici.
  • Disabilita tutti i filtri per percorsi specifici.
  • Applica il filtro solo per percorsi specifici.
  • Sistema di debug per ottenere messaggi in HTML senza mostrarli agli utenti finali.

Disponibile per Drupal 6, Drupal 7 o Drupal 8.

Informazioni sull'uso delle espressioni regolari

Se stai usando la sua funzione ' espressione regolare ', devi assicurarti di usare un'espressione regolare che "intercetta" il messaggio di errore che vuoi intercettare, come spiegato anche nella documentazione della Community .

Sotto " Tip: Keep it simple. " In quella pagina, c'è un ottimo esempio, che assomiglia a questo:

Tieni presente che qualcosa che appare molto semplice come:

Notice: Undefined index: field_txt_student_id in ctools_entity_form_field_content_type_render() (line 96 of [...]entity_form_field.inc).

Ci sono molti più personaggi invisibili di quanto ci si potrebbe aspettare:

<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>).

Quindi basta avvolgere la carne del grep con un semplice regex "qualsiasi personaggio": ". +" Come in:

.+Notice.+Undefined index:.+ctools_entity_form_field_content_type_render.+entity_form_field.inc.+

Quindi l '"indizio" per trovare un messaggio corretto è quello di ridurre il messaggio di errore che si desidera catturare e inserire i caratteri " . + " Dove appropriato.

Parlando di restringimento, nota che field_txt_student_idè stato omesso anche nell'espressione regolare (per fare in modo che NON dipenda dal nome del campo).

Esempio

Come altro esempio, supponiamo che tu voglia catturare questo messaggio di errore:

PDOException: in dblog_watchdog () (riga 160 di /home/dbuser/public_html/yoursitesname.com/modules/dblog/dblog.module).

In questo caso una possibile espressione regolare dovrebbe apparire così:

.+PDOException.+in dblog_watchdog().+(line 160 of.+/modules/dblog/dblog.module).+

Nota come prima non includessi intenzionalmente parte del percorso /modules/dblog/dblog.module(in modo che possa essere riutilizzato in un altro sito in cui si verifica lo stesso errore ...).

Nota anche che devi pensarci su sì o no includendone la 160parte: se il modulo cambia un po 'in modo tale che nel messaggio di errore (es.) Diventi linea 161, il tuo errore non verrà più intercettato. Per evitarlo, ometti la parte 160 di esso, se è quello che preferisci (personalmente preferirei prima vedere l'errore tornare indietro, quindi riadattare la mia espressione regolare).

Se la tua espressione regolare all'inizio non funziona (= il messaggio appare ancora), potrebbe essere perché c'è qualche errore di battitura nell'espressione regolare. Per individuare tale errore di battitura, provare innanzitutto con un'espressione regolare meno restrittiva, anche se era solo per provare con qualcosa del genere (per catturare TUTTI i messaggi contenenti PDOExceptione dblog_watchdog):

.+PDOException.+dblog_watchdog.+

O anche così (per catturare TUTTI i messaggi contenenti PDOException):

.+PDOException.+

Queste ultime 2 espressioni probabilmente sopprimerebbero troppi messaggi, quindi vorrai restringerlo a quello singolo che stai cercando.

Alternativa instabile

C'è anche il modulo Better Messages in alternativa. Tuttavia, per D7 (che è di cosa tratta questa domanda), ha solo una versione Alfa.


6

È possibile verificare il ruolo utente utilizzando la funzione in_array (). Nel tuo modello:


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

Oppure puoi farlo nella tua funzione di preelaborazione (non sei sicuro che la variabile del messaggio sia chiamata correttamente ma può darti un'idea)


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


La mia comprensione è che non riesco a nascondere i messaggi <? Php print $; ?> dagli utenti in quanto mostra errori che gli utenti devono vedere nonché errori del tipo di database, ad esempio se si tenta di creare un nodo e di lasciare un campo obbligatorio. Grazie
Evanss,

1
Hai ragione, potresti provare a scoprire in che modo i messaggi di errore differiscono dai messaggi predefiniti e creare un hook_permission per questo. In bocca al lupo!
Jurgen,

4

In realtà questo non è davvero fattibile.

Puoi nascondere tutti i messaggi per utenti o ruoli, ma il problema principale risiede nel modo in cui drupal classifica gli errori.

Un errore del modulo equivale a un'eccezione del database per la funzione dei messaggi, quindi se si nascondono errori si nascondono anche i messaggi di errore di un modulo di commento.

Mi piacerebbe che qualcuno mi dimostrasse che mi sbagliavo perché non sono riuscito a ottenere avvisi PHP nascosti ma mostrando contemporaneamente avvisi sui moduli.


4

Per rimuovere la notifica da un sito Web Drupal, seguire i passaggi seguenti:

  • Vai su admin / config / development / logging.
  • Hai tre scelte:
    1. None disabiliterà tutte le segnalazioni di errori.
    2. Errors and warnings mostrerà i problemi più gravi.
    3. All messages mostrerà tutti i problemi ed è probabilmente utile solo per gli sviluppatori.

Un altro modo per disabilitare avviso e messaggio di errore tramite codice. Aggiungi il seguente codice al settings.phpfile:

$conf['error_level']=0;

Puoi anche configurare Drupal per registrare solo gli errori seguendo queste istruzioni: vai Administration > Configuration > Development > Logging and errorso vai direttamente al percorso /admin/config/development/logginge imposta "Messaggi di errore da visualizzare" su nessuno . Drupal quindi registra ancora gli errori ma non li mostra agli utenti.

Se hai bisogno di più controllo, usa il Disable Messagesmodulo.


Si tratta di drupal_set_message, non di messaggi di errore.
njp,

@njp - vagano tutti in $ messaggi. Controlla i tuoi modelli.
leymannx,

3

È possibile utilizzare il modulo messaggi migliore . Offre ruoliin basati sul ruolo e / o corrispondenza di espressioni regolari per filtrare alcune notifiche.


I messaggi migliori non hanno una configurazione basata sui ruoli per mostrare i messaggi, ma solo per mostrare il tipo di messaggi dei moduli
reptilex,

2

Puoi commentare questo codice nel tuo tema

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

o l'elemento del tema status_messages serve a questo puoi scrivere la propria funzione tema in template.php

MYTHEME_status_messages(&$variables){}

Ciò potrebbe influire solo su errori di avviso e avviso


1
Ma se la $messagessezione è commentata, non verrà visualizzata anche per gli amministratori.
GoodSp33d,

La mia comprensione è che non riesco a nascondere i messaggi <? Php print $; ?> dagli utenti in quanto mostra errori che gli utenti devono vedere nonché errori del tipo di database, ad esempio se si tenta di creare un nodo e di lasciare un campo obbligatorio. Grazie
Evanss,

api.drupal.org/api/drupal/includes!theme.inc/function/… ecco come core prepara un messaggio di avvertimento per il rendering è possibile copiare questa logica e aggiungere la propria logica in mythemename_status_messages () nel file template.php di temi
werqious
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.