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?
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?
Risposte:
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? ".
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.
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).
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 160
parte: 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 PDOException
e 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.
C'è anche il modulo Better Messages in alternativa. Tuttavia, per D7 (che è di cosa tratta questa domanda), ha solo una versione Alfa.
È 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']);
}
}
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.
Per rimuovere la notifica da un sito Web Drupal, seguire i passaggi seguenti:
None
disabiliterà tutte le segnalazioni di errori.Errors and warnings
mostrerà i problemi più gravi.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.php
file:
$conf['error_level']=0;
Puoi anche configurare Drupal per registrare solo gli errori seguendo queste istruzioni: vai Administration > Configuration > Development > Logging and errors
o vai direttamente al percorso /admin/config/development/logging
e 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 Messages
modulo.
È possibile utilizzare il modulo messaggi migliore . Offre ruoliin basati sul ruolo e / o corrispondenza di espressioni regolari per filtrare alcune notifiche.
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
$messages
sezione è commentata, non verrà visualizzata anche per gli amministratori.