在“要显示的错误消息”下,我可以隐藏错误(如生产站点所建议)。但是,是否可以为除特定角色之外的每个人隐藏错误?
在“要显示的错误消息”下,我可以隐藏错误(如生产站点所建议)。但是,是否可以为除特定角色之外的每个人隐藏错误?
Answers:
前言:此答案最初是作为“ 如何抑制站点用户的警告或错误消息? ” 的答案发布的。
您可以为此使用“ 禁用消息”模块。以下是其项目页面的引文:
为网站所有者提供选项,以禁用向最终用户显示的特定消息。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部分(我个人更希望先看到错误再出现,然后重新适应我的正则表达式)。
如果您的正则表达式一开始不起作用(=消息仍然出现),则可能是因为正则表达式中有一些错字。为了查明这种错别字,请先尝试使用限制较少的正则表达式,即使只是尝试使用类似的东西(以捕获包含和的所有消息):PDOException
dblog_watchdog
.+PDOException.+dblog_watchdog.+
甚至是这样(以捕获包含的所有消息PDOException
):
.+PDOException.+
最后两个表达式可能会抑制过多的消息,因此您希望将其范围缩小到所要查找的单个消息。
还可以选择“ 更好的消息”模块。但是,对于D7(此问题是关于此问题的),它仅具有Alfa版本。
您可以使用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']);
}
}
要从Drupal网站上删除通知,请按照以下步骤操作:
None
将禁用所有错误报告。Errors and warnings
将显示最严重的问题。All messages
将显示所有问题,可能仅对开发人员有用。通过代码禁用通知和错误消息的另一种方法。将以下代码添加到settings.php
文件中:
$conf['error_level']=0;
您还可以按照以下说明将Drupal配置为仅记录错误:转到Administration > Configuration > Development > Logging and errors
或直接转到路径/admin/config/development/logging
并将“显示错误消息”设置为none。然后,Drupal仍然会记录错误,但不会将错误显示给用户。
如果需要更多控制,请使用该Disable Messages
模块。
您可以使用更好的消息模块。它提供基于角色的configuratoin和/或正则表达式匹配,以过滤掉一些通知。
您可以在主题中注释此代码
<?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){}
这可能仅对通知和警告错误有效
$messages
节进行了注释,它也不会对管理员显示。