Сховати помилки від користувачів, але показувати адміністратору?


18

У розділі "Повідомлення про помилки для відображення" я можу приховати помилки (як це рекомендується для виробничих сайтів). Однак чи можна приховати помилки для всіх, окрім певної ролі?


так, є, для цього є деякі модулі. Але те, що ви пропонуєте, також приховує помилки форми, як я зазначив нижче.
рептилекс

Відповіді:


18

Вступ: Ця відповідь спочатку була розміщена як відповідь на тему " Як придушити попередження або повідомлення про помилку для користувачів сайту? ".

Модуль відключення повідомлень

Для цього можна використовувати модуль " Відключити повідомлення" . Ось цитата зі сторінки проекту:

Надає власнику сайту параметри вимкнення конкретних повідомлень, показаних кінцевим користувачам. Основна система повідомлень друпалів, запропонована drupal_set_message, є відмінним способом для модулів надсилати повідомлення кінцевим користувачам. Однак не всі власники сайтів drupal прагнуть показати всі повідомлення, які розсилає drupal core та всі модулі своїм користувачам. Цей модуль надає адміністраторам сайтів досить потужний спосіб фільтрації повідомлень, показаних кінцевим користувачам.

Деякі його особливості:

  • Відфільтруйте повідомлення, які точно відповідають повнотекстовому рядку.
  • Відфільтруйте повідомлення, які відповідають звичайному виразу.
  • Дозволу спеціально приховувати всі повідомлення певного типу від будь-якої ролі.
  • Вимкнути всю фільтрацію для конкретних користувачів.
  • Вимкнути всю фільтрацію для конкретних шляхів.
  • Застосовувати фільтрування лише для певних контурів.
  • Система налагодження для отримання повідомлень у 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>).

Тому просто оберніть м'ясо грепу простим регулярним виразом "будь-який символ": ". +", Як у:

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

Ці останні два вирази, ймовірно, пригнічують занадто багато повідомлень, тому ви хочете звузити його до того, який ви шукаєте.

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

Також є альтернатива модуль " Кращі повідомлення ". Однак для 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; ?> від користувачів, оскільки це показує помилки, які користувачі повинні бачити, а також помилки типу бази даних, наприклад, якщо ви намагаєтеся створити вузол і залишити обов'язкове поле. Спасибі
Еванс

1
Ви маєте рацію, ви можете спробувати дізнатись, чим відрізняються повідомлення про помилки від повідомлень за замовчуванням, і створити для нього гачку_дозволу. Удачі!
JurgenR

4

Насправді це не дуже можливо.

Ви можете приховати всі повідомлення для користувачів або ролей, але головна проблема полягає в тому, що drupal класифікує помилки.

Помилка форми така ж, як виняток із бази даних для функції повідомлень, тому якщо ви приховуєте помилки, ви також приховуєте повідомлення про помилки форми коментарів.

Я хотів би, щоб хтось довів мене неправильно, оскільки мені не вдалося домогтися приховування повідомлень про php, але одночасно показувати повідомлення про форму.


4

Щоб видалити повідомлення з веб-сайту Drupal, виконайте наведені нижче дії:

  • Перейдіть до адміністратора / конфігурації / розробки / ведення журналів.
  • У вас є три варіанти:
    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модуль.


Йдеться про 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; ?> від користувачів, оскільки це показує помилки, які користувачі повинні бачити, а також помилки типу бази даних, наприклад, якщо ви намагаєтеся створити вузол і залишити обов'язкове поле. Спасибі
Еванс

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