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?
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ć:
<emclass="placeholder">Notice</em>: Undefined index: field_txt_student_id in <emclass="placeholder">ctools_entity_form_field_content_type_render()</em> (line <emclass="placeholder">96</em> of <emclass="placeholder">[...]entity_form_field.inc</em>).
Więc po prostu zawiń mięso grepa prostym wyrażeniem regularnym „dowolny znak”: „. +” Jak w:
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:
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.
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):?><divid="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']);}}
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.
Aby usunąć powiadomienie ze strony internetowej Drupal, wykonaj następujące czynności:
Przejdź do admin / config / development / loging.
Masz trzy możliwości:
None wyłączy wszystkie raportowanie błędów.
Errors and warnings wyświetli się przy najpoważniejszych problemach.
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.
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ń.
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
Odpowiedzi:
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:
Niektóre z jego funkcji to:
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:
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_id
został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:
W takim przypadku możliwe wyrażenie regularne powinno wyglądać mniej więcej tak:
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
160
część: jeśli moduł kiedykolwiek się trochę zmieni, aby w komunikacie o błędzie (np.) Stał się wierszem161
, 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
PDOException
idblog_watchdog
):Lub nawet tak (aby złapać WSZYSTKIE wiadomości zawierające
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.
źródło
Możesz sprawdzić rolę użytkownika za pomocą funkcji in_array (). W twoim szablonie:
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ł)
źródło
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.
źródło
Aby usunąć powiadomienie ze strony internetowej Drupal, wykonaj następujące czynności:
None
wyłączy wszystkie raportowanie błędów.Errors and warnings
wyświetli się przy najpoważniejszych problemach.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.php
pliku: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 errors
lub przejdź bezpośrednio do ścieżki/admin/config/development/logging
i 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 Messages
modułu.źródło
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ń.
źródło
Możesz skomentować ten kod w swoim motywie
lub element motywu status_messages służy temu, możesz napisać własną funkcję motywu w template.php
Może to mieć wpływ tylko na zauważenie i ostrzeżenie błędów
źródło
$messages
sekcja jest skomentowana, nie będzie wyświetlana również dla administratorów.