Encje w Drupalu Tworzenie własnych encji i ich wpływ na poprawę wydajności DrupalCamp Wrocław 2015 Grzegorz Bartman https://twitter.com/grzegorzbartman
O mnie Grzegorz Bartman http://twitter.com/grzegorzbartman https://drupal.org/user/363120 ponad 6 lat na drupal.org, PHP od 2002 roku Od 2013 Droptica http://www.droptica.pl/oferty-pracy zapraszamy do nas :)
Plan prezentacji Czym jest encja Jak łatwo zrobić własne encje w Drupalu Porównanie własnych encji z node'ami Dla kogo jest ta prezentacja Znasz Drupala i PHP Piszesz własne proste moduły Nie tworzyłeś własnych encji w Drupalu
Czym jest Encja? Pojęcie często używane w projektowaniu baz danych Encja to reprezentacja wyobrażonego lub rzeczywistego obiektu (wikipedia) Encja posiada atrybuty/właściwości Przykłady encji: Samochód (id_samochodu, marka, kolor, pojemność silnika) Osoba (id_osoby, imię, nazwisko, rok urodzenia) Właściciel samochodu (id, id_samochodu, id_osoby)
Standardowe podejście do tworzenia struktury danych w Drupalu Tworzymy nowy rodzaj zawartości Tworzymy pola do rodzaju zawartości
Standardowe podejście do tworzenia struktury danych w Drupalu Zalety: Wygodne i szybkie tworzenie struktury danych Łatwa edycja wyglądu i kolejności elementów na formularzu tworzenia treści Z tego powodu Drupal jest chwalony przez początkujących użytkowników
Struktura danych w Drupalu Fields Node - Node types: Boolean Car Page News Users File Image Image Engine size Job Description Text Taxonomy - Vocabularies Tags Cities News categories Term reference Node reference User reference Field collection
Struktura danych w Drupalu Entity Fields Node - Node types: Boolean Car Page News Users File Image Image Engine size Job Description Text Taxonomy - Vocabularies Tags Cities News categories Term reference Node reference User reference Field collection
Struktura danych w Drupalu Entity Fields Node - Node types: Boolean Car Page News Users File Image Image Engine size Job Description Taxonomy - Vocabularies Tags Custom entities (for example: Drupal Commerce module) Text Cities News categories Term reference Node reference User reference Field collection
Encje w Drupalu Rdzeń Drupala definiuje własne encje Encje w rdzeniu Drupala 7: Node Taxonomy User
Po co tworzyć własne encje?
Standardowe podejście do tworzenia struktury danych w Drupalu Wady: Nie mamy kontroli nad tym co się dzieje w bazie danych Każde pole to 2 dodatkowe tabele w bazie danych (field_data... i field_revision...) Im więcej pól i powiązań tym dłuższe zapytania SQL (JOIN, JOIN, JOIN...) Z tych powodów doświadczeni programiści nienawidzą Drupala
Dzięki encjom możemy dowolnie definiować strukturę tabel w bazie danych
Encje to nie tylko własna tabela w bazie danych Views może pobierać dane z encji Do encji można dodawać pola Moduł Rules może działać np. w momencie dodawania, edycji lub usuwania encji
Kiedy warto Potrzebna duża szybkość ładowania się serwisu/aplikacji Serwis/aplikacja będzie używana i rozwijana przez wiele lat, i chcemy wyeliminować późniejsze problemy z wydajnością oraz mieć możliwość elastycznej rozbudowy Dużo pól w nodach, użytkownikach lub innych encjach Chcemy mieć kontrole nad bazą danych
Kiedy nie warto Serwisy z treściami dla niezalogowanych użytkowników bez konieczności szybkiego odświeżania wyświetlanych danych po ich zmianie w bazie Lepiej i szybciej zrobić strukture na node'ach oraz cachowanie serwisu (varnish, memcache, inne) niż tworzyć dla danych własne encje
Plusy Dokładna kontrola nad strukturą danych oraz sposobem ich zarządzania przez Drupala (formularze dodawania i edycji, strony wyświetlania encji) Poprawa wydajności w stosunku do node'ów z polami
Minusy Bardziej czasochłonne w porównaniu do node'ów Dodatkowe czynności do wykonania: zaprojektowanie i utworzenie tabel w bazie danych utworzenie formularzy do dodawania treści szablony do wyświetlania encji testowanie czy wszystko działa poprawnie (zapis, edycja, usuwanie, powiązania)
Od czego zacząć?
Diagram związków encji (ERD) Warto mieć wizualizację tabel w bazie danych w postaci diagramu
Moduł Encje tworzymy korzystając z odpowiednich hook'ów we własnym module* hook_entity_info() definiuje strukturę encji hook_schema() definiuje tabelę w bazie danych do przechowywania encji
Analiza przykładów node.module
Inne przykłady modułów z encjami Profile2 Drupal Commerce Message
Moduł ECK https://www.drupal.org/project/eck Pozwala ma wyklikanie własnych encji, ale posiada ograniczenia dotyczące typów danych w encji (properties)
Moduł Model https://www.drupal.org/project/model Przykład encji, na podstawie kodu można szybko tworzyć własne encje Struktura encji + strony administracyjne
Moduł Model Pobierz moduł z drupal.org Zmień nazwę katalogu (np. na car) Zmień nazwy plików (model zamień na car) Zmień nazwy funkcji w plikach (model->car)
Moduł Model
Moduł Model
Moduł Model
Co zmienić w plikach Struktura bazy danych Plik: modulename.install Funkcja modulename_schema
Co zmienić w plikach Formularz dodawania i edycji encji: Plik: modulename.admin.inc Funkcja modulename_edit_form
Co zmienić w plikach Wyświetlanie encji Plik: modulename.module Metoda buildcontent w klasie carcontroller
Co zmienić w plikach Adresy stron wyświetlania i edycji encji Plik: modulename.admin.inc Metoda hook_menu w klasie caruicontroller
SQL: Encje vs Node Struktura danych do przechowywania informacji o samochodach i ich atrybutach: Nazwa Kolor Typ silnika Pojemność silnika Liczba drzwi
SQL: Encje vs Node Node car i pola
SQL: Encje vs Node Pobieranie danych z node'a i pól: SELECT * FROM node n LEFT JOIN field_data_field_color ON n.nid = field_data_field_color.entity_id LEFT JOIN field_data_field_engine_size ON n.nid = field_data_field_engine_size.entity_id LEFT JOIN field_data_field_doors ON n.nid = field_data_field_doors.entity_id LEFT JOIN field_data_field_engine_type ON n.nid = field_data_field_engine_type.entity_id
SQL: Encje vs Node Pobieranie danych z encji SELECT * FROM car;
Podział pracy przy projekcie w Drupalu Struktura danych w node'ach Site builder tworzy typy nodów i pola Site builder tworzy widoki, rulsy, dodaje pola Frontend developer dodaje css/html do widokow Struktura danych we własnych encjach Developer tworzy encje (modeluje baze danych), Site builder tworzy widoki, rulsy, dodaje pola Frontend developer dodaje css/html do widokow
Pytania?
Dziękuję za uwagę i zapraszam na stronę http://www.droptica.pl/oferty-pracy Oceń prezentację https://www.surveymonkey.com/s/djfj3qp