Скрыть ошибки от пользователей, но показать для администратора?


18

В разделе «Отображение сообщений об ошибках» я могу скрыть ошибки (как рекомендуется для производственных сайтов). Однако возможно ли скрыть ошибки для всех, кроме определенной роли?


да, есть несколько модулей для этого. Но то, что вы предлагаете, также скрывает ошибки формы, как я сказал ниже.
reptilex

Запрос о возможностях здесь drupal.org/node/2743119
giorgio79

Ответы:


18

Предисловие. Этот ответ был впервые опубликован как ответ на вопрос « Как подавить предупреждение или сообщение об ошибке для пользователей сайта? ».

Отключить модуль сообщений

Вы можете использовать модуль Disable Messages для этого. Вот цитата со страницы проекта:

Предоставляет владельцу сайта параметры для отключения определенных сообщений, отображаемых для конечных пользователей. Базовая система сообщений drupal, предлагаемая drupal_set_message, является отличным способом для модулей отправлять сообщения конечным пользователям. Однако не все владельцы сайтов 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 () (строка 160 из /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, если вы предпочитаете это (лично я предпочел бы сначала увидеть ошибку, а затем заново адаптировать мое регулярное выражение).

Если ваше регулярное выражение сначала не работает (= сообщение все еще появляется), то это может быть потому, что в регулярном выражении есть некоторая опечатка. Чтобы точно определить такую ​​опечатку, сначала попробуйте с менее ограничительным регулярным выражением, даже если бы это было только попытаться сделать что-то вроде этого (чтобы перехватить ВСЕ сообщения, содержащие PDOExceptionи dblog_watchdog):

.+PDOException.+dblog_watchdog.+

Или даже так (чтобы перехватить ВСЕ сообщения, содержащие PDOException):

.+PDOException.+

Эти последние 2 выражения, вероятно, будут подавлять слишком много сообщений, так что вы захотите сузить их до того единственного, которое вам нужно.

Нестабильная альтернатива

Также есть модуль Better Messages в качестве альтернативы. Тем не менее, для 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; ?>

Или вы можете сделать это в своей функции предварительной обработки (не уверен, что переменная сообщения вызывается правильно, но это может дать вам представление)


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

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 - они все блуждают в сообщениях $. Проверьте свои шаблоны.
leymannx

3

Вы можете использовать лучший модуль сообщений . Он предлагает ролевое конфигурирование и / или сопоставление регулярных выражений, чтобы отфильтровать некоторые уведомления.


Более качественные сообщения не имеют конфигурации на основе ролей для отображения сообщений, только для отображения типов сообщений модулей
reptilex

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

Насколько я понимаю, я не могу скрыть <? Php print $ messages; ?> от пользователей, поскольку он показывает ошибки, которые должны видеть пользователи, а также ошибки типа базы данных, например, если вы пытаетесь создать узел и пропустите обязательное поле. Спасибо
Evanss

api.drupal.org/api/drupal/includes!theme.inc/function/… вот как ядро ​​готовит предупреждающие сообщения для рендеринга, вы можете скопировать эту логику и добавить свою собственную логику в mythemename_status_messages () в файле theme.php темы
Яростно
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.