В разделе «Отображение сообщений об ошибках» я могу скрыть ошибки (как рекомендуется для производственных сайтов). Однако возможно ли скрыть ошибки для всех, кроме определенной роли?
В разделе «Отображение сообщений об ошибках» я могу скрыть ошибки (как рекомендуется для производственных сайтов). Однако возможно ли скрыть ошибки для всех, кроме определенной роли?
Ответы:
Предисловие. Этот ответ был впервые опубликован как ответ на вопрос « Как подавить предупреждение или сообщение об ошибке для пользователей сайта? ».
Вы можете использовать модуль 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.
Вы можете проверить роль пользователя с помощью функции 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 классифицирует ошибки.
Ошибка формы аналогична исключению из базы данных для функции сообщений, поэтому, если вы скрываете ошибки, вы также скрываете сообщения об ошибках в форме комментариев.
Я хотел бы, чтобы кто-то доказал, что я не прав, потому что мне не удалось скрыть уведомления php, но одновременно показывать уведомления формы.
Чтобы удалить уведомление с сайта 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
модуль.
Вы можете использовать лучший модуль сообщений . Он предлагает ролевое конфигурирование и / или сопоставление регулярных выражений, чтобы отфильтровать некоторые уведомления.
Вы можете комментировать этот код в своей теме
<?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
закомментирован раздел, он не будет отображаться и для администраторов.