Masquer les erreurs des utilisateurs mais les montrer à l'administrateur?


18

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?


oui, il y a des modules pour ça. Mais ce que vous proposez cache également des erreurs de forme, comme je l'ai indiqué ci-dessous.
reptilex

Demande de fonctionnalité ici drupal.org/node/2743119
giorgio79

Réponses:


18

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? ".

Désactiver le module Messages

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.

À propos de l'utilisation des expressions régulières

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_ida également été omis dans l'expression régulière (pour qu'il ne dépende PAS du nom du champ).

Exemple

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 160partie: 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 PDOExceptionet 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.

Alternative instable

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.


6

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


Ma compréhension est que je ne peux pas cacher les messages <? Php print $; ?> des utilisateurs car il montre les erreurs que les utilisateurs doivent voir ainsi que les erreurs de type de base de données, par exemple si vous essayez de créer un nœud et de laisser un champ obligatoire. Merci
Evanss

1
Vous avez raison, vous pouvez essayer de découvrir en quoi les messages d'erreur diffèrent des messages par défaut et créer une hook_permission pour cela. Bonne chance!
JurgenR

4

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.


4

Pour supprimer la notification d'un site Web Drupal, veuillez suivre les étapes ci-dessous:

  • Accédez à admin / config / development / logging.
  • Vous avez trois choix:
    1. None désactivera tous les rapports d'erreur.
    2. Errors and warnings s'affichera sur les problèmes les plus graves.
    3. 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.phpfichier:

$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 errorschemin ou accédez directement au chemin d'accès /admin/config/development/logginget 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 Messagesmodule.


Il s'agit de drupal_set_message, pas de messages d'erreur.
njp

@njp - ils errent tous dans les messages $. Vérifiez vos modèles.
leymannx

3

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.


De meilleurs messages n'ont pas de configuration basée sur les rôles pour afficher les messages, uniquement pour montrer le type de messages des modules
reptilex

2

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


1
Mais si la $messagessection est commentée, elle ne s'affichera pas non plus pour les administrateurs.
GoodSp33d

Ma compréhension est que je ne peux pas cacher les messages <? Php print $; ?> des utilisateurs car il montre les erreurs que les utilisateurs doivent voir ainsi que les erreurs de type de base de données, par exemple si vous essayez de créer un nœud et omettez un champ obligatoire. Merci
Evanss

api.drupal.org/api/drupal/includes!theme.inc/function/… voici comment le core prépare un message d'avertissement pour le rendu, vous pouvez copier cette logique et ajouter votre propre logique dans mythemename_status_messages () dans votre fichier templates.php.
werqious
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.