Sous «Messages d'erreur à afficher», je peux masquer les erreurs (comme cela est recommandé pour les sites de production). Mais est-il possible de masquer les erreurs pour tout le monde sauf un certain rôle?
Sous «Messages d'erreur à afficher», je peux masquer les erreurs (comme cela est recommandé pour les sites de production). Mais est-il possible de masquer les erreurs pour tout le monde sauf un certain rôle?
Réponses:
Préface: Cette réponse a d'abord été publiée en tant que réponse à " Comment supprimer un avertissement ou un message d'erreur pour les utilisateurs du site? ".
Vous pouvez utiliser le module Désactiver les messages pour cela. Voici une citation de sa page de projet:
Donne au propriétaire du site des options pour désactiver les messages spécifiques affichés aux utilisateurs finaux. Le système de messages drupal de base proposé par drupal_set_message est un excellent moyen pour les modules d'envoyer des messages aux utilisateurs finaux. Cependant, tous les propriétaires de sites drupal ne souhaitent pas montrer tous les messages envoyés par drupal core et tous les modules à leurs utilisateurs. Ce module offre aux administrateurs de site un moyen raisonnablement puissant de filtrer les messages affichés aux utilisateurs finaux.
Certaines de ses fonctionnalités sont:
- Filtrez les messages qui correspondent exactement à une chaîne de texte intégral.
- Filtrez les messages qui correspondent à une expression régulière.
- Autorisations pour masquer spécifiquement tous les messages d'un type donné de n'importe quel rôle.
- Désactivez tout filtrage pour des utilisateurs spécifiques.
- Désactivez tout filtrage pour des chemins spécifiques.
- Appliquer le filtrage uniquement pour des chemins spécifiques.
- Système de débogage pour obtenir des messages dans le HTML sans le montrer aux utilisateurs finaux.
Disponible pour Drupal 6, Drupal 7 ou Drupal 8.
Si vous utilisez sa fonction « expression régulière », vous devez vous assurer que vous utilisez une expression régulière qui «attrape» le message d'erreur que vous souhaitez intercepter, comme expliqué également dans la documentation de la communauté .
Sous " Astuce: restez simple. " Sur cette page, il y a un excellent exemple, qui ressemble à ceci:
Soyez conscient que quelque chose qui semble très simple comme:
Notice: Undefined index: field_txt_student_id in ctools_entity_form_field_content_type_render() (line 96 of [...]entity_form_field.inc).
Contient beaucoup plus de personnages invisibles qu'on ne pourrait s'y attendre:
<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>).
Il suffit donc d'envelopper la viande du grep avec une simple expression régulière "n'importe quel caractère": ". +" Comme dans:
.+Notice.+Undefined index:.+ctools_entity_form_field_content_type_render.+entity_form_field.inc.+
Donc, "l'indice" pour trouver un message correct, est de réduire le message d'erreur que vous voulez attraper et de mettre des caractères " . + " Le cas échéant.
En parlant de rétrécissement, notez que le field_txt_student_id
a également été omis dans l'expression régulière (pour qu'il ne dépende PAS du nom du champ).
Comme autre exemple, supposons que vous souhaitiez intercepter ce message d'erreur:
PDOException: dans dblog_watchdog () (ligne 160 de /home/dbuser/public_html/yoursitesname.com/modules/dblog/dblog.module).
Dans ce cas, une expression régulière possible devrait ressembler à ceci:
.+PDOException.+in dblog_watchdog().+(line 160 of.+/modules/dblog/dblog.module).+
Notez que je n'ai pas intentionnellement inclus une partie du chemin avant /modules/dblog/dblog.module
(afin qu'il puisse être réutilisé dans un autre site où la même erreur se produit ...).
Notez également que vous devez réfléchir à oui ou non pour en inclure la 160
partie: si le module change un peu pour que dans le message d'erreur il devienne (par exemple) une ligne 161
, votre erreur ne sera plus interceptée. Pour éviter cela, omettez la partie 160, si c'est ce que vous préférez (personnellement, je préfère d'abord voir l'erreur revenir à l'époque, puis réadapter mon expression régulière).
Si votre expression régulière ne fonctionne pas au début (= le message apparaît toujours), cela peut être dû au fait qu'il y a une faute de frappe dans l'expression régulière. Pour identifier une telle faute de frappe, essayez d'abord avec une expression régulière moins restrictive, même si c'était uniquement pour essayer quelque chose comme ça (pour attraper TOUS les messages contenant PDOException
et dblog_watchdog
):
.+PDOException.+dblog_watchdog.+
Ou même comme ça (pour attraper TOUS les messages contenant PDOException
):
.+PDOException.+
Ces 2 dernières expressions supprimeraient probablement beaucoup trop de messages, vous devriez donc les réduire à la seule que vous recherchez.
Il existe également le module Better Messages comme alternative. Cependant, pour D7 (c'est de cela qu'il s'agit), il n'a qu'une version Alfa.
Vous pouvez vérifier le rôle utilisateur à l'aide de la fonction in_array (). Dans votre modèle:
<?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; ?>
Ou vous pouvez le faire dans votre fonction de prétraitement (vous ne savez pas si la variable de message est appelée correctement mais elle peut vous donner une idée)
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']);
}
}
En fait, ce n'est pas vraiment faisable.
Vous pouvez masquer tous les messages des utilisateurs ou des rôles, mais le problème principal réside dans la façon dont drupal classe les erreurs.
Une erreur de formulaire est identique à une exception de base de données pour la fonction de messages, donc si vous masquez des erreurs, vous masquez également les messages d'erreur d'un formulaire de commentaire.
J'aimerais que quelqu'un me prouve le contraire, car je n'ai pas réussi à masquer les avis php mais à afficher les avis de formulaire en même temps.
Pour supprimer la notification d'un site Web Drupal, veuillez suivre les étapes ci-dessous:
None
désactivera tous les rapports d'erreur.Errors and warnings
s'affichera sur les problèmes les plus graves.All messages
affichera tous les problèmes et n'est probablement utile qu'aux développeurs.Une autre façon de désactiver la notification et le message d'erreur via le code. Ajoutez le code suivant au settings.php
fichier:
$conf['error_level']=0;
Vous pouvez également configurer Drupal pour enregistrer uniquement les erreurs en suivant ces instructions: accédez au Administration > Configuration > Development > Logging and errors
chemin ou accédez directement au chemin d'accès /admin/config/development/logging
et définissez «Messages d'erreur à afficher» sur aucun . Drupal enregistre toujours les erreurs mais ne les affiche pas aux utilisateurs.
Si vous avez besoin de plus de contrôle, utilisez le Disable Messages
module.
Vous pouvez utiliser le meilleur module de message . Il offre une configuration basée sur les rôles et / ou une expression régulière pour filtrer certaines notifications.
Vous pouvez commenter ce code dans votre thème
<?php if ($messages): ?>
<div id="messages"><div class="section clearfix">
<?php print $messages; ?>
</div></div> <!-- /.section, /#messages -->
<?php endif; ?>
ou l'élément de thème status_messages sert cela, vous pouvez écrire votre propre fonction de thème dans template.php
MYTHEME_status_messages(&$variables){}
Cela pourrait affecter uniquement les erreurs de notification et d'avertissement
$messages
section est commentée, elle ne s'affichera pas non plus pour les administrateurs.