当前位置: 首页>>技术教程>>正文


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

webfans 技术教程 , 去评论

问题描述

在’显示的错误消息’下,我可以隐藏错误(正如生产站点推荐的那样)。但是,除了某个角色之外,是否可以隐藏每个人的错误?

最佳解决方法

前言:这个答案首先发布为“How do I suppress a warning or error message for site users?”的答案。

禁用消息模块

您可以为此使用Disable Messages模块。以下是其项目页面的引用:

Gives a site owner options to disable specific messages shown to end users. The core drupal message system as offered by drupal_set_message is an excellent way for modules to send out messages to the end users. However not all drupal site owners are keen to show all the messages sent out by drupal core and all modules to their users. This module gives site administrators a reasonably powerful way to filter out messages shown to the end users.

它的一些特点是:

  • Filter out messages that match a full text string exactly.
  • Filter out messages that match a regular expression.
  • Permissions to specifically hide all messages of a given type from any role.
  • Disable all filtering for specific users.
  • Disable all filtering for specific paths.
  • Apply filtering only for specific paths.
  • Debug system to get messages in the HTML without showing it to the end users.

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

关于使用正则表达式

如果您使用的是’regular expression’功能,则必须确保您使用正则表达式”catches”要截取的错误消息,如Community documentation中所述。

在“提示:保持简单。”下面。在那个页面上,有一个很棒的示例,看起来像这样:

Be aware that something that appears very straightforward like:

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

Has a lot more unseen characters in it than one might expect:

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

So just wrap the meat of the grep with a simple “any character” regex: “.+” as in:

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

因此,”clue”提出正确的消息,是缩小想要捕捉的错误消息,并在适当的位置放置”.+”字符。

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

例子

作为另一个例子,假设你想捕获这个错误信息:

PDOException: in dblog_watchdog() (line 160 of /home/dbuser/public_html/yoursitesname.com/modules/dblog/dblog.module).

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

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

请注意,我有意在/modules/dblog/dblog.module之前没有包含部分路径(以便它可以在发生相同错误的其他站点中重用…)。

另外请注意,您必须考虑是否包含160部分:如果模块发生了一些变化,以便在错误消息中(例如)变成161行,您的错误将不会被拦截。为了避免这种情况,省略它的160个部分,如果这是你喜欢的(我个人宁愿先看到错误回来,然后re-adapt我的正则表达式)。

如果你的正则表达式最初不起作用(=消息仍然出现),那么可能是因为正则表达式中存在一些错字。要查明这样的拼写错误,首先尝试限制较少的正则表达式,即使只是尝试类似的东西(捕获包含PDOExceptiondblog_watchdog的所有消息):

.+PDOException.+dblog_watchdog.+

或者甚至如此(捕捉包含PDOException的所有消息):

.+PDOException.+

最后2个表达式可能会抑制太多的消息,所以你想把它缩小到你想要的那个。

不稳定的选择

另外还有Better Messages模块。然而,对于D7(这是这个问题的关键),它只有一个阿尔法版本。

次佳解决方法

您可以使用 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; ?>

或者你可以在预处理函数中完成它(不确定消息变量是否被正确调用,但它可以给你一个想法)


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分类错误的方式。

表单错误与messages函数的数据库异常相同,因此如果隐藏错误,则还会隐藏注释表单的错误消息。

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

第四种方法

要从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,并将“要显示的错误消息”设置为无。然后Drupal仍然记录错误,但不会显示给用户。

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

第五种方法

您可以使用better message module。它提供基于角色的配置和/或正则表达式匹配来过滤掉一些通知。

第六种方法

你可以在你的主题中评论这段代码

<?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){}

这可能只会影响通知和警告错误

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2003.html,转载请务必附带本地址声明。