¿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?
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:
<emclass="placeholder">Notice</em>: Undefined index: field_txt_student_id in <emclass="placeholder">ctools_entity_form_field_content_type_render()</em> (line <emclass="placeholder">96</em> of <emclass="placeholder">[...]entity_form_field.inc</em>).
Así que simplemente envuelva la carne del grep con una simple expresión regular "cualquier personaje": ". +" Como en:
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í:
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.
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):?><divid="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']);}}
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.
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:
None deshabilitará todos los informes de errores.
Errors and warnings se mostrará en los problemas más graves.
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.
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.
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
Respuestas:
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:
Algunas de sus características son:
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í:
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_id
se 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:
En este caso, una posible expresión regular debería verse así:
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
160
parte del mismo: si el módulo alguna vez cambia un poco para que en el mensaje de error (p. Ej.) Se convierta en línea161
, 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
PDOException
ydblog_watchdog
):O incluso así (para atrapar TODOS los mensajes que contienen
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.
fuente
Puede verificar el rol del usuario utilizando la función in_array (). En tu plantilla:
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)
fuente
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.
fuente
Para eliminar el aviso de un sitio web de Drupal, siga los pasos a continuación:
None
deshabilitará todos los informes de errores.Errors and warnings
se mostrará en los problemas más graves.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.php
archivo:También puede configurar Drupal para que solo registre los errores siguiendo estas instrucciones: vaya
Administration > Configuration > Development > Logging and errors
o vaya directamente a la ruta/admin/config/development/logging
y 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 Messages
módulo.fuente
Puedes usar el mejor módulo de mensajes . Ofrece configuración basada en roles y / o coincidencia de expresiones regulares para filtrar algunas notificaciones.
fuente
Puedes comentar este código en tu tema
o el elemento de tema status_messages sirve esto, puede escribir su propia función de tema en template.php
Esto podría afectar solo a errores de aviso y advertencia
fuente
$messages
sección está comentada, tampoco se mostrará a los administradores.