Ukryć błędy przed użytkownikami, ale pokazać je administratorowi?

18

W obszarze „Komunikaty o błędach do wyświetlenia” mogę ukryć błędy (zalecane w przypadku witryn produkcyjnych). Czy jednak można ukryć błędy dla wszystkich oprócz określonej roli?

Evanss
źródło
tak, jest kilka modułów do tego. Ale to, co sugerujesz, również ukrywa błędy formalne, jak powiedziałem poniżej.
reptilex,
Wniosek o udostępnienie
giorgio79

Odpowiedzi:

18

Przedmowa: Ta odpowiedź została po raz pierwszy opublikowana jako odpowiedź na pytanie „ Jak ukryć ostrzeżenie lub komunikat o błędzie dla użytkowników witryny? ”.

Wyłącz moduł Wiadomości

Możesz do tego użyć modułu Wyłącz wiadomości . Oto cytat ze strony projektu:

Daje właścicielowi witryny opcje wyłączania określonych wiadomości pokazywanych użytkownikom końcowym. Podstawowy system komunikatów drupal oferowany przez drupal_set_message jest doskonałym sposobem dla modułów na wysyłanie wiadomości do użytkowników końcowych. Jednak nie wszyscy właściciele witryn drupal chcą pokazać wszystkim użytkownikom wiadomości wysyłane przez rdzeń drupal i wszystkie moduły. Ten moduł daje administratorom witryny dość skuteczny sposób na odfiltrowanie wiadomości wyświetlanych użytkownikom końcowym.

Niektóre z jego funkcji to:

  • Filtruj wiadomości dokładnie pasujące do pełnego ciągu tekstowego.
  • Odfiltruj wiadomości pasujące do wyrażenia regularnego.
  • Uprawnienia do ukrywania wszystkich wiadomości danego typu przed jakąkolwiek rolą.
  • Wyłącz wszystkie filtrowanie dla określonych użytkowników.
  • Wyłącz wszystkie filtrowanie dla określonych ścieżek.
  • Zastosuj filtrowanie tylko dla określonych ścieżek.
  • Debuguj system, aby otrzymywać wiadomości w formacie HTML bez pokazywania ich użytkownikom końcowym.

Dostępne dla Drupal 6, Drupal 7 lub Drupal 8.

Informacje o używaniu wyrażeń regularnych

Jeśli używasz funkcji „ wyrażenie regularne ”, musisz upewnić się, że używasz wyrażenia regularnego, które „łapie” komunikat o błędzie, który chcesz przechwycić, jak wyjaśniono również w dokumentacji Wspólnoty .

Poniżej „ Wskazówka: zachowaj prostotę ” na tej stronie znajduje się świetna próbka, która wygląda tak:

Pamiętaj, że coś, co wydaje się bardzo proste, takie jak:

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

Ma o wiele więcej niewidzialnych postaci, niż można by się spodziewać:

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

Więc po prostu zawiń mięso grepa prostym wyrażeniem regularnym „dowolny znak”: „. +” Jak w:

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

Tak więc „wskazówką”, aby wymyślić prawidłowy komunikat, jest zmniejszenie komunikatu o błędzie, który chcesz złapać, i wstawienie znaków „ . + ” W odpowiednich przypadkach.

Mówiąc o zmniejszaniu, zauważ, że field_txt_student_idzostało ono również pominięte w wyrażeniu regularnym (aby NIE zależało od nazwy pola).

Przykład

Jako kolejny przykład załóżmy, że chcesz złapać ten komunikat o błędzie:

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

W takim przypadku możliwe wyrażenie regularne powinno wyglądać mniej więcej tak:

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

Zwróć uwagę, że celowo nie uwzględniłem wcześniej części ścieżki /modules/dblog/dblog.module(aby można ją było ponownie wykorzystać w innej witrynie, w której występuje ten sam błąd ...).

Zauważ też, że musisz przemyśleć, czy tak, czy nie, uwzględnij jego 160część: jeśli moduł kiedykolwiek się trochę zmieni, aby w komunikacie o błędzie (np.) Stał się wierszem 161, twój błąd nie będzie już przechwytywany. Aby tego uniknąć, pomiń część 160, jeśli tak wolisz (osobiście wolałbym wtedy, aby błąd wrócił, a następnie ponownie dostosować wyrażenie regularne).

Jeśli twoje wyrażenie regularne początkowo nie działa (= komunikat nadal się pojawia), może to oznaczać literówkę w wyrażeniu regularnym. Aby precyzyjnie wskazać taką literówkę, najpierw spróbuj użyć mniej restrykcyjnego wyrażenia regularnego, nawet jeśli było to tylko próbowanie z czymś takim (aby złapać WSZYSTKIE wiadomości zawierające PDOExceptioni dblog_watchdog):

.+PDOException.+dblog_watchdog.+

Lub nawet tak (aby złapać WSZYSTKIE wiadomości zawierające PDOException):

.+PDOException.+

Te dwa ostatnie wyrażenia prawdopodobnie stłumiłyby zdecydowanie zbyt wiele wiadomości, więc chciałbyś zawęzić je do tego, którego szukasz.

Niestabilna alternatywa

Alternatywą jest również moduł Lepsze wiadomości . Jednak w przypadku D7 (o to chodzi w tym pytaniu) ma tylko wersję Alfa.

Pierre.Vriens
źródło
6

Możesz sprawdzić rolę użytkownika za pomocą funkcji in_array (). W twoim szablonie:


<?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; ?>

Lub możesz to zrobić w funkcji wstępnego przetwarzania (nie jestem pewien, czy zmienna komunikatu jest wywoływana poprawnie, ale może dać ci pomysł)


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']);
  }
}

JurgenR
źródło
Rozumiem, że nie mogę ukryć <? Php print $ messages; ?> od użytkowników, ponieważ pokazuje błędy, które użytkownicy muszą zobaczyć, a także błędy typu bazy danych, np. jeśli próbujesz utworzyć węzeł i pominąć pole obowiązkowe. Dzięki
Evanss,
1
Masz rację, możesz spróbować dowiedzieć się, czym różnią się komunikaty o błędach od komunikatów domyślnych i utworzyć dla niego uprawnienie hook_permission. Powodzenia!
JurgenR
4

W rzeczywistości nie jest to wykonalne.

Możesz ukryć wszystkie wiadomości dla użytkowników lub ról, ale główny problem polega na sposobie kategoryzacji błędów przez drupal.

Błąd formularza jest taki sam, jak wyjątek bazy danych dla funkcji komunikatów, więc jeśli ukryjesz błędy, ukryjesz również komunikaty o błędach formularza komentarza.

Chciałbym, aby ktoś udowodnił, że się mylę, ponieważ nie udało mi się ukryć ogłoszeń php, ale jednocześnie wyświetlać powiadomienia formularzy.

reptilex
źródło
4

Aby usunąć powiadomienie ze strony internetowej Drupal, wykonaj następujące czynności:

  • Przejdź do admin / config / development / loging.
  • Masz trzy możliwości:
    1. None wyłączy wszystkie raportowanie błędów.
    2. Errors and warnings wyświetli się przy najpoważniejszych problemach.
    3. All messages wyświetli wszystkie problemy i prawdopodobnie jest przydatny tylko dla programistów.

Kolejny sposób na wyłączenie powiadomienia i komunikatu o błędzie za pomocą kodu. Dodaj następujący kod do settings.phppliku:

$conf['error_level']=0;

Możesz również skonfigurować Drupal, aby rejestrował tylko błędy, postępując zgodnie z następującymi instrukcjami: przejdź do Administration > Configuration > Development > Logging and errorslub przejdź bezpośrednio do ścieżki /admin/config/development/loggingi ustaw „Komunikaty o błędach do wyświetlenia” na brak . Drupal nadal rejestruje błędy, ale nie wyświetla ich użytkownikom.

Jeśli potrzebujesz większej kontroli, skorzystaj z Disable Messagesmodułu.

Adi
źródło
Chodzi o komunikat drupal_set_message, a nie komunikaty o błędach.
njp
@njp - wszyscy wędrują do $ wiadomości. Sprawdź swoje szablony.
leymannx,
3

Możesz użyć lepszego modułu wiadomości . Oferuje konfigurację opartą na rolach i / lub dopasowanie wyrażeń regularnych w celu odfiltrowania niektórych powiadomień.

BetaRide
źródło
Lepsze wiadomości nie mają konfiguracji opartej na rolach do wyświetlania wiadomości, a jedynie do wyświetlania wiadomości typu modułu
reptilex
2

Możesz skomentować ten kod w swoim motywie

<?php if ($messages): ?>
    <div id="messages"><div class="section clearfix">
      <?php print $messages; ?>
    </div></div> <!-- /.section, /#messages -->
  <?php endif; ?>

lub element motywu status_messages służy temu, możesz napisać własną funkcję motywu w template.php

MYTHEME_status_messages(&$variables){}

Może to mieć wpływ tylko na zauważenie i ostrzeżenie błędów

gwałtowny
źródło
1
Ale jeśli $messagessekcja jest skomentowana, nie będzie wyświetlana również dla administratorów.
GoodSp33d
Rozumiem, że nie mogę ukryć <? Php print $ messages; ?> od użytkowników, ponieważ pokazuje błędy, które użytkownicy muszą zobaczyć, a także błędy typu bazy danych, np. jeśli próbujesz utworzyć węzeł i pominąć pole obowiązkowe. Dzięki
Evanss,
api.drupal.org/api/drupal/includes!theme.inc/function/… oto jak rdzeń przygotowuje komunikaty ostrzegawcze do renderowania, możesz skopiować tę logikę i dodać własną logikę w pliku mythemename_status_messages () w pliku motywów template.php
werqious