¿Ocultar los errores de los usuarios pero mostrarlos al administrador?

18

En "Mensajes de error para mostrar", puedo ocultar los errores (como se recomienda para los sitios de producción). Sin embargo, ¿es posible ocultar errores para todos excepto para un determinado rol?

Evanss
fuente
sí, hay algunos módulos para eso. Pero lo que está sugiriendo también oculta errores de forma también, como dije a continuación.
reptilex
Solicitud de funciones
giorgio79

Respuestas:

18

Prefacio: Esta respuesta se publicó por primera vez como una respuesta a " ¿Cómo suprimo un mensaje de advertencia o error para los usuarios del sitio? ".

Deshabilitar módulo de mensajes

Puede usar el módulo Deshabilitar mensajes para esto. Aquí hay una cita de su página de proyecto:

Ofrece al propietario del sitio opciones para deshabilitar mensajes específicos que se muestran a los usuarios finales. El sistema central de mensajes de drupal que ofrece drupal_set_message es una excelente manera para que los módulos envíen mensajes a los usuarios finales. Sin embargo, no todos los propietarios de sitios de drupal desean mostrar todos los mensajes enviados por drupal core y todos los módulos a sus usuarios. Este módulo ofrece a los administradores del sitio una forma razonablemente poderosa de filtrar los mensajes que se muestran a los usuarios finales.

Algunas de sus características son:

  • Filtre los mensajes que coincidan exactamente con una cadena de texto completo.
  • Filtre los mensajes que coincidan con una expresión regular.
  • Permisos para ocultar específicamente todos los mensajes de un tipo determinado de cualquier rol.
  • Deshabilite todo el filtrado para usuarios específicos.
  • Deshabilite todo el filtrado para rutas específicas.
  • Aplicar filtrado solo para rutas específicas.
  • Sistema de depuración para obtener mensajes en el HTML sin mostrarlo a los usuarios finales.

Disponible para Drupal 6, Drupal 7 o Drupal 8.

Acerca del uso de expresiones regulares

Si está utilizando su función de ' expresión regular ', debe asegurarse de utilizar una expresión regular que "capte" el mensaje de error que desea interceptar, como se explica también en la documentación de la Comunidad .

Debajo de " Sugerencia: manténgalo simple " en esa página, hay una gran muestra, que se ve así:

Tenga en cuenta que algo que parece muy sencillo como:

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

Tiene muchos más personajes invisibles de lo que cabría esperar:

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

Así que simplemente envuelva la carne del grep con una simple expresión regular "cualquier personaje": ". +" Como en:

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

Por lo tanto, la "pista" para llegar a un mensaje correcto es reducir el mensaje de error que desea capturar y colocar los caracteres " . + " Donde corresponda.

Hablando de contracción, tenga en cuenta que también field_txt_student_idse ha omitido en la expresión regular (para que NO dependa del nombre del campo).

Ejemplo

Como otro ejemplo, suponga que desea captar este mensaje de error:

PDOException: en dblog_watchdog () (línea 160 de /home/dbuser/public_html/yoursitesname.com/modules/dblog/dblog.module).

En este caso, una posible expresión regular debería verse así:

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

Tenga en cuenta que antes no incluía intencionalmente parte de la ruta /modules/dblog/dblog.module(para que pueda reutilizarse en otro sitio donde se produce el mismo error ...).

También tenga en cuenta que debe pensar si o no incluir la 160parte del mismo: si el módulo alguna vez cambia un poco para que en el mensaje de error (p. Ej.) Se convierta en línea 161, su error ya no será interceptado. Para evitar eso, omita la parte 160, si eso es lo que prefiere (personalmente, preferiría ver primero el error y luego volver a adaptar mi expresión regular).

Si su expresión regular no funciona al principio (= el mensaje todavía aparece), entonces podría ser porque hay algún error tipográfico en la expresión regular. Para identificar dicho error tipográfico, primero intente con una expresión regular menos restrictiva, incluso si fue solo para intentar con algo así (para atrapar TODOS los mensajes que contienen PDOExceptiony dblog_watchdog):

.+PDOException.+dblog_watchdog.+

O incluso así (para atrapar TODOS los mensajes que contienen PDOException):

.+PDOException.+

Estas dos últimas expresiones probablemente suprimirían demasiados mensajes, por lo que querrás reducirlo a ese único que buscas.

Alternativa inestable

También existe el módulo Better Messages como alternativa. Sin embargo, para D7 (que es de lo que trata esta pregunta), solo tiene una versión Alfa.

Pierre.Vriens
fuente
6

Puede verificar el rol del usuario utilizando la función in_array (). En tu plantilla:


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

O puede hacerlo en su función de preproceso (no estoy seguro si la variable del mensaje se llama correctamente pero puede darle una 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']);
  }
}

JurgenR
fuente
Entiendo que no puedo ocultar <? Php print $ messages; ?> de los usuarios, ya que muestra errores que los usuarios deben ver, así como errores de tipo de base de datos, por ejemplo, si intenta crear un nodo y omite un campo obligatorio. Gracias
Evanss
1
Tiene razón, podría intentar descubrir cómo los mensajes de error difieren de los mensajes predeterminados y crear un hook_permission para ello. ¡Buena suerte!
JurgenR
4

En realidad, esto no es realmente factible.

Puede ocultar todos los mensajes para usuarios o roles, pero el problema principal radica en la forma en que drupal clasifica los errores.

Un error de formulario es lo mismo que una excepción de base de datos para la función de mensajes, por lo que si oculta errores, también oculta los mensajes de error de un formulario de comentarios.

Me encantaría que alguien demuestre que estoy equivocado porque no he logrado ocultar los avisos de php sino mostrar avisos de formulario al mismo tiempo.

reptilex
fuente
4

Para eliminar el aviso de un sitio web de Drupal, siga los pasos a continuación:

  • Vaya a admin / config / development / logging.
  • Tienes tres opciones:
    1. None deshabilitará todos los informes de errores.
    2. Errors and warnings se mostrará en los problemas más graves.
    3. All messages mostrará todos los problemas y probablemente solo sea útil para los desarrolladores.

Otra forma de desactivar el aviso y el mensaje de error a través del código. Agregue el siguiente código al settings.phparchivo:

$conf['error_level']=0;

También puede configurar Drupal para que solo registre los errores siguiendo estas instrucciones: vaya Administration > Configuration > Development > Logging and errorso vaya directamente a la ruta /admin/config/development/loggingy configure "Mensajes de error para mostrar" en ninguno . Drupal aún registra errores pero no los muestra a los usuarios.

Si necesita más control, use el Disable Messagesmódulo.

Adi
fuente
Esto se trata de drupal_set_message, no de mensajes de error.
njp
@njp: todos entran en $ mensajes. Revisa tus plantillas.
leymannx
3

Puedes usar el mejor módulo de mensajes . Ofrece configuración basada en roles y / o coincidencia de expresiones regulares para filtrar algunas notificaciones.

BetaRide
fuente
Better messages no tiene una configuración basada en roles para mostrar mensajes, solo para mostrar el tipo de módulos de mensajes
reptilex
2

Puedes comentar este código en tu tema

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

o el elemento de tema status_messages sirve esto, puede escribir su propia función de tema en template.php

MYTHEME_status_messages(&$variables){}

Esto podría afectar solo a errores de aviso y advertencia

werqious
fuente
1
Pero si la $messagessección está comentada, tampoco se mostrará a los administradores.
GoodSp33d
Entiendo que no puedo ocultar <? Php print $ messages; ?> de los usuarios, ya que muestra errores que los usuarios deben ver, así como errores de tipo de base de datos, por ejemplo, si intenta crear un nodo y omite un campo obligatorio. Gracias
Evanss
api.drupal.org/api/drupal/includes!theme.inc/function/… así es como core prepara un mensaje de advertencia para renderizar, puede copiar esta lógica y agregar su propia lógica en mythemename_status_messages () en su archivo de plantilla de temas.php
werqious