隐藏用户的错误,但显示给管理员?


18

在“要显示的错误消息”下,我可以隐藏错误(如生产站点所建议)。但是,是否可以为除特定角色之外的每个人隐藏错误?


是的,周围有一些模块。但是,正如我在下面所述,您的建议也隐藏了表单错误。
reptilex

这里的功能请求drupal.org/node/2743119
giorgio79'6

Answers:


18

前言:此答案最初是作为“ 如何抑制站点用户的警告或错误消息? ” 的答案发布的。

禁用消息模块

您可以为此使用“ 禁用消息”模块。以下是其项目页面的引文:

为网站所有者提供选项,以禁用向最终用户显示的特定消息。drupal_set_message提供的核心drupal消息系统是模块向最终用户发送消息的绝佳方法。但是,并不是所有的drupal站点所有者都希望将所有由drupal核心发送的消息以及所有模块显示给用户。该模块为站点管理员提供了一种功能强大的方法,可以过滤出显示给最终用户的消息。

它的一些功能是:

  • 筛选出与全文字符串完全匹配的消息。
  • 过滤出与正则表达式匹配的消息。
  • 明确隐藏任何角色的给定类型的所有消息的权限。
  • 禁用特定用户的所有筛选。
  • 禁用所有针对特定路径的过滤。
  • 仅对特定路径应用过滤。
  • 调试系统以获取HTML中的消息,而不将其显示给最终用户。

适用于Drupal 6,Drupal 7或Drupal 8。

关于使用正则表达式

如果您要使用其“ 正则表达式 ”功能,则必须确保使用正则表达式“捕获”您要拦截的错误消息,这在社区文档中也有说明

在该页面上的“ 技巧:保持简单。 ” 下方,有一个很好的示例,看起来像这样:

请注意,看起来很简单的东西如下:

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

其中包含许多看不见的字符,比预期的要多:

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

因此,只需使用简单的“任何字符”正则表达式:“。+”包裹grep的内容,如下所示:

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

因此,提供正确消息的“线索”是缩小您要捕获的错误消息,并在适当的地方放置“ 。+ ”字符。

关于收缩,请注意,field_txt_student_id正则表达式中也省略了(以使其不依赖于字段名称)。

再举一个例子,假设您想捕获此错误消息:

PDOException:在dblog_watchdog()中(/home/dbuser/public_html/yoursitesname.com/modules/dblog/dblog.module的第160行)。

在这种情况下,可能的正则表达式应如下所示:

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

请注意,我之前是如何故意不包含路径的一部分/modules/dblog/dblog.module(以便可以在发生相同错误的另一个站点中重复使用它……)。

还要注意,您必须考虑是否是160该模块的一部分:如果模块有所更改,以便在错误消息中(例如)变成line 161,您的错误将不再被拦截。为了避免这种情况,如果您愿意,请忽略其中的160部分(我个人更希望先看到错误再出现,然后重新适应我的正则表达式)。

如果您的正则表达式一开始不起作用(=消息仍然出现),则可能是因为正则表达式中有一些错字。为了查明这种错别字,请先尝试使用限制较少的正则表达式,即使只是尝试使用类似的东西(以捕获包含和的所有消息):PDOExceptiondblog_watchdog

.+PDOException.+dblog_watchdog.+

甚至是这样(以捕获包含的所有消息PDOException):

.+PDOException.+

最后两个表达式可能会抑制过多的消息,因此您希望将其范围缩小到所要查找的单个消息。

不稳定的选择

还可以选择“ 更好的消息”模块。但是,对于D7(此问题是关于此问题的),它仅具有Alfa版本。


6

您可以使用in_array()函数检查用户角色。在您的模板中:


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

或者您可以在预处理函数中执行此操作(不确定message变量是否被正确调用,但是可以给您一个提示)


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


我的理解是我无法隐藏<?php print $ messages;。?>,因为它显示了用户需要查看的错误以及数据库类型错误,例如,如果您尝试创建节点并忽略必填字段。谢谢
Evanss

1
没错,您可以尝试找出错误消息与默认消息的不同之处,并为其创建一个hook_permission。祝好运!
JurgenR 2012年

4

其实这并不是真的可行。

您可以为用户或角色隐藏所有消息,但主要问题在于drupal对错误进行分类的方式。

表单错误与消息功能的数据库异常相同,因此,如果您隐藏错误,则还将隐藏注释表单的错误消息。

我希望有人能证明我错了,因为我没有设法实现隐藏php通知,但同时显示表单通知。


4

要从Drupal网站上删除通知,请按照以下步骤操作:

  • 转到admin / config / development / logging。
  • 您有三种选择:
    1. None 将禁用所有错误报告。
    2. Errors and warnings 将显示最严重的问题。
    3. All messages 将显示所有问题,可能仅对开发人员有用。

通过代码禁用通知和错误消息的另一种方法。将以下代码添加到settings.php文件中:

$conf['error_level']=0;

您还可以按照以下说明将Drupal配置为仅记录错误:转到Administration > Configuration > Development > Logging and errors或直接转到路径/admin/config/development/logging并将“显示错误消息”设置为none。然后,Drupal仍然会记录错误,但不会将错误显示给用户。

如果需要更多控制,请使用该Disable Messages模块。


这是关于drupal_set_message,而不是错误消息。
njp

@njp-他们都徘徊在$ messages中。检查您的模板。
leymannx 2015年

3

您可以使用更好的消息模块。它提供基于角色的configuratoin和/或正则表达式匹配,以过滤掉一些通知。


更好的消息没有用于显示消息的基于角色的配置,仅用于显示消息的模块类型
reptilex 2014年

2

您可以在主题中注释此代码

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

或status_messages主题元素可以为您服务,您可以在template.php中编写自己的主题函数

MYTHEME_status_messages(&$variables){}

这可能仅对通知和警告错误有效


1
但是,如果对本$messages节进行了注释,它也不会对管理员显示。
GoodSp33d 2012年

我的理解是我无法隐藏<?php print $ messages;。?>,因为它显示了用户需要查看的错误以及数据库类型错误,例如,如果您尝试创建节点并忽略必填字段。谢谢
Evanss

api.drupal.org/api/drupal/includes!theme.inc/function/…这是内核准备渲染警告消息的方式,您可以复制此逻辑,并在主题template.php文件的mythemename_status_messages()中添加自己的逻辑
werqious
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.