Jesteś tutaj

Drupal

Kurs tworzenia drupalowych modułów

Od pewnego (dłuższego czasu) chciałam wykonać kurs omawiający podstawy tworzenia modułów w Drupalu. Oczywiście istnieje kilka tego typu kursów, natomiast uważam, że im więcej, tym lepiej. Każdy z piszących ma inne podejście i im więcej wiedzy dostarczy się użytkownikom tym lepiej.

Forma jest mocno niedopracowana, zapewne wkradło się wele chochlików. Będę poprawiać. Obiecuję.
Kurs jeszcze nie jest skończony, natomiast pewne zagadnienia już porusza. Będzie w miarę możliwości aktualizowany. Niestety przez ogrom wiedzy albo należałoby czekać (pewnie miesiącami) na gotowe dzieło, albo częściowy kurs opublikować już teraz, uzupełniając go z czasem o dalsze elementy.

W każdym bądź razie zapraszam do kursu tworzenia modułów dla Drupala 7.

ps. Wszelkie uwagi mile widziane.

Kilka informacji o Viewsach, których możecie nie znać

Moduł drupalowy Views jest na tyle rozbudowany, że pomimo częstej pracy z nim od czasu do czasu potrafi zaskoczyć mnie swoimi możliwościami. Zwłaszcza wersja dla 7 kryje w sobie wiele niespodzianek, z których pewnie niejedna nie została przeze mnie jeszcze odkryta. Chciałabym zebrać wszystkie ciekawe rzeczy, o których wiem, być może komuś z Was się przydadzą.

Wykluczenie aktualnie przeglądanej treści

Niekiedy istnieje konieczność wykonania widoku prezentującego nody powiązane, najnowsze w tej samej kategorii czy użytkowników o tej samej randze na stronie użytkownika. Z pomocą oczywiście przychodzą Contextual filters (Filtry kontekstowe). Problem pojawia się w momencie, gdy chcemy pokazać wpisy za wyjątkiem aktualnie przeglądanego elementu.

Moja niewiedza do niedawna powodowała, że albo używałam filtrów php, albo problem pomijałam. Rozwiązanie okazało się jednak banalnie proste.

Rozwiązanie

Analizując powiązane nody z tej samej kategorii, aby osiągnąć listing wpisów należy dodać dwa filtry kontekstowe. W moim przypadku jest to Zawartość: Kategoria oraz... Zawartość: ID Węzła.


Wybrane kontekstowe filtry.

Pierwszy filtr powinien automatycznie przechwytywać wartość z node'a dzięki możliwości „Dostarcz domyślną wartość”.


Dostarczenie domyślnej wartości typu ID taxonomy z adresu URL oraz zaznaczenie Wczytaj domyślny filtr ze strony węzła.

Drugi filtr natomiast to filtr wykluczający. Również dostarczamy wartość domyślną, tj. nid na podstawie adresu URL, natomiast w sekcji więcej należy wybrać opcję „Wyklucz”.


Wykluczenie artumentu.

Całość bardzo prosta, a jakże przyjemna!

Czemu views nie pokazuje zajawek z treści dostępnej tylko po zalogowaniu?

Widok przy generowaniu elementów „sięga” do tabeli {node_access}, czyli upewnia się, że użytkownik posiada dostęp do konkretnych elementów. Nie zawsze jest to rozwiązanie preferowane, wyobraźmy sobie sytuację, gdy treść jest dostępna tylko dla zarejestrowanych użytkowników, ale listing z zajawkami chcemy pokazać również anonimowym, aby zachęcić ich do rejestracji.

Rozwiązanie

Na szczęście i o tym pomyślano.
Wystarczy kliknąć w Ustawienia kwerendy, a następnie wybrać Wyłącz przepisywanie SQL. I to wszystko.


Umiejscowienie elementu „Ustawienia kwerendy” w sekcji „Inne”

”Odnośnik: więcej” z sekcji stronicowanie nie przenosi mnie tam, gdzie chcę

Odnośnik ten samodzielnie generuje link do pełnej treści. Przydaje się to zwłaszcza w przypadku niestronicowanych bloków wyświetlających zaledwie kilka elementów.
Moduł Views w przypadku wybrania tej opcji automatycznie kieruje użytkowników do pierwszego formatu wyświetlania typu „strona” w tym samym widoku (2.)

Rozwiązanie

Jeśli taki wybór nas nie satysfakcjonuje można to zmienić z poziomu samego Viewsa nie zmieniając kolejności ani nie dodając nowego formatu wyświetlania.
Wystarczy skorzystać z ustawień Format powiązany w sekcji Inne (3.)


Umiejscowienie elementu „Format powiązany” w sekcji Inne.

Chciałbym zrobić słowniczek (glossary) dotyczący node'ów, kategorii, użytkowników...

Od razu uprzedzę – taki słowniczek już istnieje i warto mu się bliżej przyjrzeć. Jest on na liście widoków domyślnie wyłączony, natomiast może być świetnym polem nauki.
Glossary (słowniczek) przedstawiam na poniższym screenie.

Rozwiązanie

Aby wykonać coś takiego w Drupalu należy skorzystać znowu z filtrów kontekstowych.
W domyślnych filtrach należy wybrać opcję Wyświetl podsumowanie i na dobrą sprawę czytać uważnie wszystkie informacje poniżej.
I tylko tyle.



Dodatkowa wyszukiwarka w Drupalu

Drupal sam w sobie dostarcza podstawowe mechanizmy wyszukiwania treści. Przy każdym wywołaniu cron'a (lub pseudo-crona, odpalanego przy odwiedzinach użytkowników, jeśli Wasz hosting nie ma dostępu do cron taba) Drupal indeksuje dodane treści. Następnie po użyciu wyszukiwarki sprawdzane są dodane treści pod kątem występowania wpisanych fraz. Cały mechanizm nie jest zbyt skomplikowany - przykład działania podstawowego wyszukiwania.

Bywa jednak, że podstawowe mechanizmy wyszukiwania nie odpowiadają konkretnym zapotrzebowaniom. Może się to dziać z kilku powodów, podstawowymi są wydajność lub brak możliwości filtrowania. Chciałabym zaprezentować zatem rozszerzenie mechanizmu filtrowania wpisów. Za pomocą nieśmiertelnego modułu Views.

Oczywiście ze względów wydajnościowych sam moduł Views nie poradzi sobie na dużych witrynach. Z tego też względu wymyślono inne mechanizmy poprawiające nieco możliwości drupalowych systemów.

Definiowanie podstawowego widoku

Odnosząc się do mojego poprzedniego wpisu przedstawiającego podstawy Viewsów należy stworzyć widok typu "Zawartość" z wybranych "Typów zawartości" oraz dodać typ wyświetlania "Strona" w postaci "Listy niesformatowanej" stworzonej z "Zajawek".
Następnie należy zapisać widok korzystając z opcji "Kontynuuj edycję" ("Save and edit").

Dodatkowa konfiguracja - pierwszy filtr

Aby stworzyć viewsową wyszukiwarkę należy skorzystać z Filtrów.

Najogólniej każdy filtr ma za zadanie zawężać wyniki prezentowane przez widok do konkretnych dopasowań. Przyjmując, że Viewsy są sposobem zapytań do drupalowej bazy danych ("niewielkie" uproszczenie), to filtry obrazują warunki WHERE. To co ważne, to fakt, że pomiędzy warunkami mamy operator AND - zostaną wyświetlone tylko te treści, które spełniają wszystkie warunki.

Aby edytować istniejący już filtr należy kliknąć na jego nazwę.


Podstawowy widok edycji Viewsów.

Widok edycji filtra.

Jak widać filtry nie tylko pozwalają ograniczyć zestaw wyników do wartości z góry zadeklarowanych, dają również opcję udostępniania filtra użytkownikom, pozwalając im własnoręcznie zmieniać filtrowanie zawężając wyniki wyszukiwania prezentowane przez widok.


Widok edycji filtra.

W przypadku filtra dotyczącego rodzajów zawartości warto omówić trzy opcje.

Element 2. na obrazku prezentuje trzy checkboksy:

  1. Dozwolone wybieranie wielu opcji
  2. Pamiętanie ostatniego wyboru - przetrzymywanie w sesji ostatniego wyboru użytkownika; bez tego oczywiście wszystkie filtry po ponownym wejściu na stronę wyszukiwarki zostaną zresetowane
  3. Ograniczenie listy do wybranych elementów - domyślnie użytkownicy mogą wybierać z całej puli dostępnych typów zawartości; w momencie, gdy wybierzemy opcję ograniczenia należy pamiętać, aby w okienku 1. zaznaczyć typy, które użytkownicy mogą wybierac

Filtrowanie po tytule

Z tego względu, że jeden filtr nie wygląda zachęcająco dodajmy drugi, który wprowadza więcej opcji znanych z wyszukiwarek.
Tym elementem będzie możliwość zawężania wyników wyszukiwania ze względu na słowa występujące w tytule wpisów.


Aby dodać nowy filtr wystarczy skorzystać ze sporo mówiącego przycisku "Dodaj".

Ze wszystkich dostępnych filtrów wybieram "Zawartość: Tytuł".

Następnie wystarczy udostępnić użytkownikom możliwość zmiany filtra, dokładnie jak poprzednio.

Filtr dotyczący elementów niepredefiniowanych (tych, które nie mają skończonej, wcześniej zdefiniowanej liczby elementów i nie można ich wyświetlić za pomocą np. selecta) ma nieco więcej opcji dotyczących operatorów.

O ile na zrzucie poniżej wybrany jest operator zawiera (co oczywiście wyświetli każdą treść mającą w tytule wpisaną przez nas frazę), o tyle bogactwo jest o wiele większe. Wartość wpisana przez nas w drugim oknie ustawi się jako domyślny tekst, po którym filtrowany będzie Views.
Gwoli ścisłości - filtry "zawieralności" są oczywiście o wiele mniej wydajne niż ścisłych dopasowań.

Ze względu na możliwość przetestowania innych operatorów udostępniłam takową opcję. Zachęcam do przeklikania i sprawdzenia, jak zachowuje się dany operator.

Przykład wyszukiwarki

Podsumowanie

W ten sposób za pomocą kilku kliknięć została stworzona strona prezentująca dostępną w serwisie treść, pozwalającą jednocześnie na filtrowanie jej przez użytkowników. Filtrów tych można tworzyć oczywiście o wiele więcej, tak, aby dostosować funkcjonalność do własnych zapotrzebowań.

Natomiast szybkość wykonania takiej dodatkowej wyszukiwarki jest niewątpliwie jej największym plusem. Dzięki temu możemy prezentować najróżniejszą treść zgromadzoną w serwisie praktycznie bez doświadczenia programistycznego.

Dla bardziej dociekliwych - mechanizmy autopodpowiadania również istnieją. Jak i parę innych ciekawych cegiełek, które można dołożyć, aby jeszcze bardziej uatrakcyjnić takie widoki.

Podstawy modułu Views - cz. I

Poniżej screencast opisujący najbardziej podstawowe funkcjonalności modułu Views 3 dla Drupala 7.

Nieco udało mi się rozwlec temat. Cóż - pierwsza tego typu publikacja, pozostaje mieć nadzieję że praktyka czyni mistrza i następne screencasty będą coraz lepsze i bardziej zwięzłe.
PIerwsza część opisuje podstawowy, uproszczony ekran dodawania Viewsów do Drupala w wersji 7. Następną opublikowaną funkcjonalnością będą pola oraz dokładniejsze omówienie viewsów tabelarycznych.

Zarządzanie modułami w Drupalu – najczęstsze błędy

Przeglądając przykładowe implementacje Drupala na polskim forum poświęconym temu CMS'owi zauważyłam, że nader często developerzy popełniają sporo błędów w przypadku instalacji modułów. Uczestniczenie w dyskusjach na oficjalnej stronie systemu tylko utwierdziło mnie w tym przekonaniu. Z tego względu postanowiłam zebrać najczęstsze błędy w przypadku zarządzania modułami.

Gdzie umieszczać moduły?

Początkujący developerzy Drupala mają bardzo często problemy z prawidłowym umieszczeniem modułu w strukturze plików.
Poniższy zrzut ekranu przedstawia domyślne ułożenie folderów w głównym katalogu systemu w wersji 7 oraz 6.


Główna struktura katalogów Drupala.

Jak można zauważyć widnieją w nim dwa specyficzne foldery – themes i modules. Wydawałoby się więc, że nie ma lepszego miejsca na umieszczenie modułów czy skórek. Nic bardziej mylnego. Modułów własnych i ściągniętych z drupal.org nie należy umieszczać w katalogu modules w głównym folderze Drupala.

Te dwa katalogi służą tylko i wyłącznie do przechowywania elementów dostarczonych z systemem, wszystko co sami ściągniemy aby rozszerzyć funkcjonalność powinno być rozpakowane do innego folderu.

Jakkolwiek moduły umieszczone w takiej lokalizacji będą działać jest to wbrew zaleceniom twórców Drupala.

Prawidłowe katalogi, w których mogą się znajdować moduły to m.in.:

  • W sites/all/modules umieszczamy moduły, które powinny być dostępne dla każdej strony w danej instalacji; jeśli planujemy uruchomić tylko jedną stronę na danej instalacji Drupala to właśnie to miejsce, gdzie powinny się znaleźć wszystkie dodatkowe moduły tworzone przez społeczność
  • W sites/mysite.com/modules umieszczamy moduły dla specyficznej strony w naszej instalacji Drupala; dotyczy to jedynie tzw. multi-site installation, moduły będą dostępne tylko dla strony, w której katalogu je umieścimy.

Przykładowo jeśli na jednej instalacji Drupala chcemy umieścić stronę informacyjną (drupal.informacja.pl), na drugiej zaś portal społecznościowy (spolecznosc.drupal.pl) w katalogu sites/all/modules powinny znajdować się moduły wspólne dla obu witryn, w folderze sites/drupal.informacja.pl/modules moduły używane tylko dla strony informacyjnej (np. FiveStar), zaś w sites/spolecznosc.drupal.pl tylko dla strony społecznościowej (np. Private Message czy User Points).

W przypadku multi-site installation warto zadbać o to, aby moduły specyficzne dla danej witryny znalazły się nie w ogólnym katalogu, a w odpowiednim folderze witryny. Pomijając jakiekolwiek inne względy o wiele wygodniejsze jest przeglądanie 50 modułów zamiast 100.

W przypadku skórek są to odpowiednio katalogi: sites/all/themes oraz sites/mysite.com/themes.

W obrębie tych folderów można umieszczać inne foldery, np. gdy chcemy pogrupować moduły na ich funkcjonalności (przykładowo osobny folder na zarządzanie użytkownikami, osobny na cck i jeszcze inny na moduły developerskie jak devel czy coder). Drupal poradzi sobie bardzo dobrze nawet z najbardziej zaawansowaną strukturą katalogów i znajdzie nasze moduły.

Drupal 7 i użytkownicy rozpoczynający pracę z Drupalem

Na stronie admin/modules/install znajduje się narzędzie (po włączeniu odpowiedniego modułu dostępnego w core systemu – Update) do automatycznej instalacji modułów. Warto z niego skorzystać, ponieważ sam Drupal umieści wtedy moduły tam, gdzie powinny się znaleźć.

Deinstalacja

Drugi najczęściej popełniany błąd, skutkujący niekiedy trudnymi do naprawienia błędami to brak deinstalacji modułu.

Wyłącznie modułu na stronie admin/build/modules (d6) lub admin/modules (d7) niekoniecznie znaczy, że moduł jest jednocześnie odinstalowany z systemu!

W momencie, gdy moduł dodaje jakiekolwiek informacje do bazy danych proste wyłączenie modułu powoduje jedynie, że funkcje wewnątrz są niedostępne dla innych modułów. Stworzone tabele czy zmienne jednak zostają.
Po usunięciu folderu z systemu plików bez wcześniejszej deinstalacji może powodować „błędy z opóźnionym zapłonem”. Z tego powodu gdy chcemy faktycznie odinstalować moduł zawsze należy odwiedzić po wyłączeniu modułu zakładkę „Odinstaluj” („Uninstall”) i sprawdzić, czy wyłączonego modułu tam nie ma.

Można sprawdzić czy moduł wymaga deinstalacji również z poziomu plików. Jeśli w niechcianym module występuje plik .install najprawdopodobniej trzeba go będzie odinstalować przed usunięciem z poziomu Drupala.

A może by tak zmienić coś w module...?

Nigdy, przenigdy nie zmieniajcie niczego w kodzie modułu (a tym bardziej w modułach z core'a). Drupal oferuje system hook'ów (funkcji do „nadpisywania”), aby nie było potrzeby mieszać bezpośrednio w kodzie modułu.

Niekiedy może się to wydawać prostszym rozwiązaniem i kusić. Ale jest „złe” i niezgodne z wszelkimi zasadami systemu. Ponadto, gdy moduł będzie update'owany wszelkie zmiany znikną i trzeba je będzie wprowadzać jeszcze raz!

Najlepiej więc stworzyć własny moduł, który poprawia funkcjonalność, z której nie jesteśmy zadowoleni. Mamy przy tym do wyboru całe Drupal API oraz hooki pozostałych zainstalowanych modułów. Istnieje relatywnie niewiele zmian, które nie mogą być zaaplikowane przez napisanie własnego modułu.
W ostateczności należy stworzyć patcha poprawiającego funkcjonalność. Po updacie modułu wszystko co należy zrobić to jeszcze raz zaaplikować patcha.

Bezpośrednie zmiany niosą ze sobą wiele niebezpieczeństw, z czego niewątpliwie najważniejszą jest stworzenie w module luk bezpieczeństwa – Waszego modułu nie widzi społeczność, użytkownicy Drupala nie będą więc w stanie zareagować i zwrócić uwagi na błędy mogące spowodować np. ataki XSS na waszą witrynę.

Strony

Mini Blog

  • Problem z geshifilter 09.03.12

    Zauważyłam, że moduł drupalowy Geshifilter nie bardzo lubi się z Share This. Przez to kod jest ciężki do skopiowania. Postaram się jak najszybciej to poprawić lub wprowadzić rozwiązanie zastępcze. Za niedogodności przepraszam.

  • HTML 5 13.12.11

    Pisanie aplikacji w HTML'u jest dla mnie aktualnie bardziej zabawne niż WinAPI czy Swing. Zwłaszcza, że do kompilacji użyto silnika WebKit.

  • Generator menu 02.09.11

    kolejnym projektem, nad którym pracuję jest generator menu. jest to faza przedwstępna, jednak można już obejrzeć mój zamysł. Działanie może być jak najbardziej niestabilne.

Copyright © 2011 - 2012 Milena Szałacka. Wszystkie prawa zastrzeżone.
Subskrybuj Subskrybuj