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?
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?
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? ".
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.
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_id
se ha omitido en la expresión regular (para que NO dependa del nombre del campo).
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 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í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 PDOException
y 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.
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): ?>
<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']);
}
}
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:
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:
$conf['error_level']=0;
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.
Puedes usar el mejor módulo de mensajes . Ofrece configuración basada en roles y / o coincidencia de expresiones regulares para filtrar algunas notificaciones.
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
$messages
sección está comentada, tampoco se mostrará a los administradores.