Rozwiązywanie problemów

Alternatywna wersja tytułu dla wegetarian i buddystów: Sztuka bycia sobą i rozwiązywania problemów (z Drupalem). Jeśli chcesz wyzbyć się pragnień takich jak te zilustrowane na poniższym obrazku, spróbuj skorzystać z opisanych tu wskazówek.

© blaugh.com. BY-NC-SA

Jeżeli masz problem z Drupalem, istnieje duże prawdopodobieństwo, że nie jesteś pierwszą osobą, której się on przydarzył. Może dawno temu ktoś sprytny już go rozwiązał. Może nawet rozwiązało go więcej użytkowników. Może każdy z nich zadawał wcześniej to samo pytanie… Zanim do nich dołączysz, skorzystaj z wyszukiwarki znajdującej się w tej witrynie i jeśli jeszcze nie znajdziesz odpowiedzi, pomóż sobie poniższym poradnikiem.

Daj sobie chwilę

Zastanów się. Przypomnij sobie, jakich zmian w witrynie niedawno dokonałeś, jakie moduły zainstalowałeś. Zazwyczaj to w jednej z tych zmian tkwi problem. Czy na pewno wybrano odpowiednie wersje modułów? Sprawdź, czy wszystko dobrze zrobiłeś zanim zaczniesz przeklinać Drupala bądź moduł.

Czytaj komunikaty o błędach

Część użytkowników je pomija, ale Ty masz w sobie mądrość, by docenić wagę zawartych w nich informacji. Spróbuj zinterpretować komunikat. Zazwyczaj, gdy dobrze się wczytasz, okaże się, że rozwiązanie problemu jest tuż przed Twoimi oczyma. Jeżeli nie masz dostępu do komunikatu, przeszukaj dzienniki zdarzeń witryny lub serwera, zaczynając od najnowszych wpisów. W dziennikach serwera znaleźć można następujące rodzaje błędów:

Sprawdź poprawność struktury strony

Jeżeli problem dotyczy layoutu – rozmieszczenia elementów, wielkości czcionki, etc. – skorzystaj z narzędzia sprawdzającego poprawność strony. Zwróć baczną uwagę na niepoprawne „zamykanie” znaczników i inne problemy strukturalne. Inne komunikaty, na przykład te o encjach, są mniej ważne.

Zawsze czytaj pliki „README”

Naprawdę. Choć wiele modułów wystarczy po prostu włączyć, część z nich wymaga podjęcia dodatkowych kroków. One nie są zepsute, one tak już mają. Niektóre moduły potrzebują specjalnych rozszerzeń PHP lub innych modułów albo też są skonfliktowane z innymi modułami.

Skorzystaj z wyszukiwarek, by znaleźć rozwiązanie

Jeśli komunikat błędu wydaje ci się bezsensowny, wyszukaj go za pomocą wyszukiwarki internetowej, np. Google. Starannie stwórz zapytanie: "Argument #1 is not an array" drupal. Umieszczenie cudzysłowów w odpowiednich miejscach spowoduje zwrócenie stron wspominających o dokładnie tym komunikacie, a dodanie słówka „drupal” – pozwoli wyszukać te informacje, które odnoszą się do Drupala. Pamiętaj, by usunąć ścieżki do katalogów, które na serwerach innych osób mogą być zupełnie inne. Pozostaw natomiast nazwy plików, które pojawiają się w komunikatach o błędach.

Wyśledź przyczynę problemu

Przyjrzyj się następującemu komunikatowi:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(n.nid), n.title FROM category c INNER JOIN category_node r ON c.cid = r.cid INN' at line 1 query: SELECT c.*, r.DISTINCT(n.nid), n.title FROM category c INNER JOIN category_node r ON c.cid = r.cid INNER JOIN category cn ON c.cnid = cn.cid INNER JOIN node n ON c.cid = n.nid INNER JOIN node cnn ON cn.cid = cnn.nid WHERE n.status = 1 AND n.moderate = 0 ORDER BY cn.weight, cnn.title, c.weight, n.title in /var/www/html/doadance/drupal/includes/database.mysql.inc on line 120.

Choć na końcu komunikatu pojawia się plik database.mysql.inc, to nie w nim leży problem; on tylko przyczynił się do jego znalezienia. Trzeba znaleźć prawdziwego winowajcę. Spróbuj to uczynić, znajdując w komunikacie nazwę tabeli bazy danych. W tym wypadku brzmi ona category_node, co wskazuje na moduł Category, choć błędy powodować może i inny moduł, który zażądał z bazy danych informacji związanych z kategoriami (category).

Który moduł mi bruździ?

Wszystkie strony są przez Drupala „dynamicznie” generowane. Adres generowanej strony (ta część po twojej domenie) jest zazwyczaj definiowany w hook_menu() danego modułu. By odpowiedzieć sobie na pytanie typu „Jak konstruowana jest moja strona rss.xml?”, trzeba:

  • przeszukać pliki Drupala na okoliczność wystąpienia tekstu „rss.xml”, na przykład programem GREP (wersja dla Windows)
  • w tym wypadku ślady zaprowadzą nas do pliku node.module i jego funkcji node_menu()
  • co z kolei prowadzi nas do nieuchronnej konluzji, że funkcją odpowiadającą za rss.xml jest node_feed() i że tam należy szukać dalszych informacji

Przy okazji, odnośniki w powyższym przykładzie prowadzą do bardzo przydatnej strony Drupal API.

Wszystkie strony generowane dynamicznie można w ten sposób „szpiegować”. Popatrz na adres, sprawdź z jakim modułem jest związany, a następnie przyglądnij się kodowi tego modułu.

Spróbuj wycisnąć z Drupala więcej informacji

Na przykład modułem Devel. Możesz też pobawić się w hakowanie. Na przykład w przypadku komunikatu warning: in_array() [function.in-array]: Wrong datatype for second argument in /home/httpd/glo­bal/drupal/mo­dules/node.mo­dule on line 1303 otwórz plik node.module i odnajdź linię nr 1303. Jest tam zapis in_array('status', $node_options). Dodaj we wcześniejszej linii zapis print("Node options: '".print_r($node_options,1)."'");, odśwież stronę i obserwuj. Może zwrócone przez Drupala dane coś podpowiedzą.

Zadawaj właściwe pytania

Zanim jednak do tego przystąpisz, przeczytaj jak zrobić to mądrze. Jeśli znajdziesz rozwiązanie, nie zapomnij je opisać na stronie, na której wcześniej zadałeś pytanie, nawet gdy na nie nikt nie odpowiedział.

Ciąg dalszy nastąpi

Kolejne części poradnika ukażą się w przyszłości.


Powyższy tekst jest luźnym tłumaczeniem strony Troubleshooting FAQ, która udostępniona została na zasadach licencji Creative Commons License, Attribution-ShareAlike 2.0.

Copyright 2000–2008 by the individual contributors <http://drupal.org>
Portions copyright 2008 by Arche Twist <http://drupal.org.pl>

Sposób wyświetlania odpowiedzi

Wybierz preferowany sposób wyświetlania odpowiedzi i kliknij "Zachowaj ustawienia", by wprowadzić zmiany.

PHP backtrace

Aby wycisnąć z Drupala więcej informacji, można też skorzystać z funkcji PHP debug_backtrace() albo debug_print_bac­ktrace() które dostarczą szczegółowych informacji o tym jakie funkcje i z jakich plików były wywoływane wcześniej.

Dobrym pomysłem jest wywołanie funkcji debug_backtrace() w funkcji drupal_set_mes­sage() w pliku bootstrap.inc. Na przykład tak:

if ($type == 'error') {
    $message .= '<pre>'. print_r(debug_backtrace(), 1) .'</pre>';
  }

Alternatywnie można umieścić funkcje debug_print_bac­ktrace() w miejscu gdzie pojawił się, według drupala, błąd. Efekt podobny.