Drupal i import danych z pliku XML zawierającego kilkadziesiąt tysięcy rekordów? Czyli z serii – jak stworzyć własny moduł do… Część I.

 In Bez kategorii

Kilka słów wstępu

Jednym z ostatnio wykonanych przez nas projektów był system rekomendacji książek. Jako rekomendację rozumiemy listę uzupełnionych cech książki(historyczna, zabawna…). Każda cecha może przyjąć wartość w skali 1-10.

System z jednej strony umożliwia wprowadzenie rekomendacji osobom z odpowiednimi uprawnieniami, z drugiej zaś udostępnia API, które zwraca listę książek najbardziej zbliżonych do wybranych preferencji.

W ramach projektu jednym z zadań było przeniesienie uzupełnionych już rekomendacji(oraz innych danych) do naszego systemu co w praktyce oznacza zaimportowanie sporej ilości danych z plików XML o różnej strukturze. Z racji, iż do wykonania było kilka importów, zdecydowaliśmy, że do każdego zbudujemy interfejs wykorzystując wbudowane w Drupala  Form API, umożliwiając w przyszłości wykonanie importu również klientowi.

W dzisiejszym wpisie zaprezentuję wykonanie jednego z nich bazując na systemie Linux 14.04.3 LTS.

Moduł ma następujące zadania:

  • możliwość rozpoczęcia importu danych za pomocą interfejsu
  • odczytywanie danych z pliku XML
  • tworzenie bądź aktualizacja node’ów w bazie

Dla niewtajemniczonych, w Drupalu każda indywidualna treść na stronie traktowana jest jako węzeł.

Tworzenie modułu

Jest to pierwszy wpis tego typu więc wyjaśnione zostaną również podstawowe mechanizmy.

Na początku stwórzmy folder, który będzie zawierał pliki modułu.

Moduł należy umieścić w lokalizacji /sites/all/modules/ zaczynając oczywiście od katalogu głównego projektu, w naszym przypadku to system_rekomendacji.

Nasz moduł będzie się nazywać pk(akronim od nazwy  poczta książkowa):

Zgodnie z wymaganiami powinniśmy utworzyć plik informacyjny zawierający podstawowe dane, dołączone pliki, zależności itp. oraz główny plik modułu.

Nasz pilk informacyjny wygląda następująco:

Po wyczyszczeniu cech’a na liście powinien pojawić się nasz moduł.

Do tej jak i wielu innych czynności używamy Drusha. Jest to interfejs, który za pośrednictwem linii poleceń umożliwia wykonanie wielu typowych zadań m.in migracje bazy, kopiowanie plików, uruchamianie cron’a. Po więcej szczegółów odsyłam do dokumentacji, choć może w najbliższym czasie pojawi się wpis na blogu 🙂

Włączamy moduł:

Moduł do importu plików XML

Moduł do importu plików XML

Możemy teraz przejść do części, która nas najbardziej interesuje(pk.module), mianowicie zobaczmy jak wygląda pisanie modułu w praktyce.

Routing

Na początku zarejestrujemy adres url pod którym wyświetlimy formularz.

Służy do tego funkcja hook_menu, która rejestruję w systemie informację w jaki sposób żądanie(adres url) ma zostać przetworzone. O systemie haków można przeczytać co nie co na naszej firmowej stronie we wpisie Michała.

W Drupalu 8,  zgodnie z frameworkiem Symfony na którym został oparty, konfiguracja została przeniesiona do plików YAML co osobiście uważam za ogromny plus, ale to dyskusja na oddzielny wpis. Do rzeczy:

  • titleTytuł strony
  • page callback  – Funkcja wyświetlająca zawartość strony. Jako parametr przekazaliśmy drupal_get_form. W naszym przypadku po wpisaniu adresu admin/config/system/import-recommendations wyświetlony zostanie formularz.
  • page arguments lista argumentów z adresu przekazana do funkcji page callback. Jeśli do zmiennej  page callback przekażemy argument drupal_get_form jako pierwszy parametr należy podać nazwę funkcji budującej formularz, a następnie argumenty, które do niej przekazujemy. W naszym przypdaku do funkcji zwracającej formularz nie przekazujemy żadnych argumentów z adresu, dlatego też podany został tylko jeden parametrarray(‘import_recommendation_form’).
  • access callback funkcja określająca dostęp do strony. Musi zwrócić prawdę lub fałsz.
  • fileplik który zostanie załączony przed wywołaniem funkcji page callback.  Przeważnie wykorzystywany jest do deklaracji funkcji w oddzielnym pliku.

Jeśli nie podamy parametru type, domyślnie zostanie ustawiony na wartość MENU_NORMAL_ITEM, co oznacza, że odnośnik pojawi się w menu, oraz Administrator może go pokazywać/ukrywać dla poszczególnych ról.

Budowanie formularza

Funkcja odpowiedzialna za wyświetlanie formularza:

Wyjaśnijmy parę rzeczy.

$form jest to tablica asocjacyjna, której klucze to kolejne nazwy pól formularza, przyjmujące odpowiednie parametry, z których najważnieszy to type, określający rodzaj pola(input,select..).

Dzięki Drupal Form API możemy wstawić każdy rodzaj, a nawet więcej:)

My wykorzystaliśmy następujące:

markup – własna treść, można używać znaczników html

  • #markup – Treść

managed_file – Udostępnia kontrolkę umożliwijącą wysyłanie i zapisywanie plików. Bardzo ważne jest tutaj iż informacje na temat pliku zostają zapisane w bazie.

  • #upload_location – lokalizacja pliku. Deklaracja “public://” oznacza ściężkę sites/default/files
  • #upload_validators – lista funkcji walidujących.
  • #file_validate_extensions – plik musi posiadać jedno z wymienionych rozszerzeń

submit – Button służący do wysłania formularza. Jeśli chcemy użyć domyślnych ustawień, nie trzeba go oczywiście deklarować.

  • #ajax – informacja, że formularz zostanie wysłany asynchronicznie
  • callback – funkcja, która zostanie wywołana po wysłania formularza
  • wrapper – id elementu którego zawartość zostanie zmieniona, w zależności od tego co zwróci funkcja zadeklarowana jako callback
  • method – rodzaj zmiany zawartości(podmiana całego tekstu, dopisanie na końcu bądź początku)
  • effect – efekt z jakim zawartość zostanie zmieniona
  • #value – tekst buttona

Parametry #title, #description służą do opisania pola.

 

Screenshot from 2016-01-22 16:03:41

Reszta zostanie opisana w dalszej części:)

Recommended Posts