- Podstawowe pojęcia: czym jest Entity, a czym Bundle
- Entity jako fundament modelu danych w Drupal
- Bundle jako konkretna „odmiana” Entity
- Relacja Entity – Bundle – pola
- Dlaczego nie „po prostu typy treści”
- Rodzaje Entity w Drupal i ich wykorzystanie
- Config Entity a Content Entity – dwa sposoby przechowywania danych
- Najczęściej używane Content Entities
- Bundling w praktyce: node, media, taxonomy
- Jak Entity i Bundle współpracują z systemem pól
- Projektowanie Bundli: jak nie zgubić się w strukturze
- Modelowanie informacji przed klikaniem w interfejs
- Kiedy tworzyć nowy Bundle, a kiedy nowe pole
- Granica między node a innymi typami Encji
- Reużywalność pól i konserwacja projektu
- Entity i Bundle w praktyce: workflow, API, moduły
- Workflow i uprawnienia na poziomie Bundli
- Entity API i praca programistyczna z Bundlami
- Integracje i API zewnętrzne a model Entity/Bundle
- Moduły ekosystemu a elastyczność Encji
Entity i Bundle w Drupal potrafią onieśmielić nawet doświadczonych deweloperów, którzy wcześniej pracowali z prostszymi CMS-ami. Na pierwszy rzut oka wszystko wygląda podobnie: mamy treści, użytkowników, pliki. Jednak pod spodem kryje się bardzo elastyczny, ale wymagający model danych. Zrozumienie, czym dokładnie jest Entity, czym jest Bundle i jak ze sobą współpracują, pozwala projektować skalowalne serwisy, łatwiej utrzymywać konfigurację i lepiej wykorzystywać ekosystem modułów.
Podstawowe pojęcia: czym jest Entity, a czym Bundle
Entity jako fundament modelu danych w Drupal
W uproszczeniu: Entity to abstrakcyjny pojemnik na dane w Drupal. Każdy konkretny rekord w systemie – wpis blogowy, użytkownik, plik, termin taksonomii – jest właśnie encją. Z punktu widzenia programisty Entity jest klasą reprezentującą obiekt biznesowy, który posiada identyfikator, pola oraz metadane, a z punktu widzenia redaktora – czymś, co można stworzyć, edytować i zapisać w bazie.
Wyróżniamy kilka kluczowych typów encji, które spotkasz niemal w każdym projekcie:
- node – klasyczna treść redakcyjna (artykuły, strony, aktualności)
- user – konta użytkowników z rolami i uprawnieniami
- taxonomy_term – terminy słowników (kategorie, tagi, słowniki pojęć)
- file, media – pliki i złożone obiekty medialne (obrazy, wideo, dokumenty)
- block_content – konfigurowalne bloki treści
Wszystkie te elementy są różnymi typami Entity. Dzięki temu Drupal może dla nich współdzielić te same mechanizmy: system pól, uprawnień, wyświetlania, ładowania z bazy czy serializacji do API. To właśnie ten wspólny fundament sprawia, że moduły napisane pod jeden typ Entity często da się wykorzystać także dla innych.
Bundle jako konkretna „odmiana” Entity
Bundle to nic innego jak podtyp danego typu Entity – jego wyspecjalizowana odmiana. Najczęściej myślimy o nim jako o typie treści, ale jest obecny nie tylko w node. Przykładowo:
- dla entity node: artykuł, strona, case study, wydarzenie
- dla entity taxonomy_term: kategorie, tagi, słownik technologii
- dla entity media: obraz, wideo, plik, zewnętrzne wideo z YouTube
- dla entity block_content: blok tekstowy, slider, call-to-action
Każdy Bundle ma własny zestaw pól, własne ustawienia formularza edycji i własny sposób wyświetlania. Pozwala to w jednym serwisie utrzymywać różne struktury treści, nawet jeśli wszystkie należą do tego samego typu Entity. To rozwiązanie zapewnia dużą elastyczność, ale wymaga świadomego projektowania informacji.
Relacja Entity – Bundle – pola
W praktyce możesz myśleć o tym trójkącie w następujący sposób:
- Entity type – definiuje ogólne zachowanie (node, user, media)
- Bundle – określa wariant biznesowy (artykuł, strona, obraz, wideo)
- Field – opisuje konkretne dane (tytuł, tekst, obraz, data, autor)
Jedna encja jest więc zawsze:
- instancją konkretnego entity type (np. node)
- konkretnym bundlem (np. artykuł)
- zestawem wartości pól zdefiniowanych dla tego bundla
Takie podejście ułatwia zarówno zarządzanie strukturą, jak i rozbudowę serwisu, ponieważ dodając nowy Bundle, nie trzeba tworzyć nowego typu obiektu w kodzie – wystarczy konfiguracja i powiązanie z istniejącym typem Entity.
Dlaczego nie „po prostu typy treści”
W wielu projektach sprowadza się tę koncepcję do stwierdzenia, że Bundle to „typ treści”. To wystarcza, dopóki pracujemy wyłącznie z node. Jednak w bardziej rozbudowanych instalacjach pojawiają się media, taksonomie, dedykowane encje biznesowe. Wtedy zrozumienie, że Bundle jest ogólniejszym pojęciem i dotyczy wielu typów Entity, otwiera możliwość budowania spójnego, dobrze zaprojektowanego modelu danych, zamiast mieszaniny ad-hoc tworzonych typów treści.
Rodzaje Entity w Drupal i ich wykorzystanie
Config Entity a Content Entity – dwa sposoby przechowywania danych
Drupal rozróżnia dwa główne rodzaje encji: Content Entity oraz Config Entity. Różnią się one sposobem przechowywania, zastosowaniem i tym, jak nimi zarządzamy w cyklu życia projektu.
Content Entity to wszystkie dane redakcyjne, które zmieniają się często i są tworzone przez redaktorów lub użytkowników. Przykłady:
- node (treści)
- taxonomy_term (kategorie, tagi)
- user (kontrolowane konta, profile)
- media (zdjęcia, wideo, pliki)
Config Entity przechowują konfigurację serwisu: rzeczy, które zwykle definiuje zespół wdrożeniowy i przenosi pomiędzy środowiskami za pomocą systemu konfiguracyjnego. To m.in.:
- typy treści (bundle dla node)
- typy mediów i słowniki taksonomii
- widoki (Views)
- role użytkowników
Rozpoznanie, czy dana encja jest Content czy Config, pomaga właściwie zarządzać deployem i migracjami. Bundles dla Content Entity są zwykle encjami konfiguracyjnymi (np. definicja typu treści to Config Entity), które opisują, jak mają wyglądać tworzone później Content Entities.
Najczęściej używane Content Entities
Przyjrzyjmy się kilku typom, bo to one najczęściej pojawiają się w codziennej pracy.
Node – klasyczna treść
- Jest trzonem większości serwisów redakcyjnych
- Każdy node należy do jednego Bundla (typu treści)
- Posiada podstawowe pola, jak tytuł, autor, data publikacji
- Może dziedziczyć dodatkowe pola w zależności od Bundla
Taxonomy_term – kategoryzacja
- Służy do budowania słowników i etykietowania treści
- Każdy termin należy do konkretnego słownika (Bundle)
- Pola terminów można rozbudowywać podobnie jak w node
Media – centralne zarządzanie zasobami
- Pozwalają zapanować nad plikami i osadzonymi obiektami
- Każdy typ mediów to osobny Bundle z własnymi polami
- Media są wykorzystywane przez inne encje za pomocą pól referencyjnych
Bundling w praktyce: node, media, taxonomy
Rozumiejąc różnice między entity type a Bundle, możesz świadomie projektować strukturę danych. Przykłady praktyczne:
- w node tworzysz Bundles: artykuł, strona, raport – każdy z innymi polami
- w media definiujesz: obraz (z polem plik), wideo (z polem URL), dokument (z polem plik)
- w taxonomy_term projektujesz odrębne słowniki: branża, temat, technologia, poziom zaawansowania
Dzięki temu redaktor, tworząc nową treść, wybiera najpierw typ, a Drupal wie, jaki formularz i jakie pola mu wyświetlić. System pozostaje spójny – wszystko jest oparte o ten sam mechanizm Entity + Bundle, ale możliwe jest precyzyjne dopasowanie do potrzeb projektu.
Jak Entity i Bundle współpracują z systemem pól
System pól (Field API) to jeden z największych atutów Drupal. Działa on właśnie na poziomie Entity i Bundli. Możesz przypisać dane pole do:
- konkretnego typu Entity i konkretnego Bundla (np. pole obrazka tylko dla typu treści artykuł)
- lub szerzej: do wielu Bundli jednego Entity type (np. pole „powiązane artykuły” dla artykułu i raportu)
Warto pamiętać, że:
- definicja pola (field storage) dotyczy typu danych i sposobu przechowywania
- instancja pola (field instance) określa, jak to pole jest użyte w konkretnym Bundlu
To rozróżnienie pozwala ponownie wykorzystywać te same definicje pól w wielu Bundlach, ale z innymi ustawieniami widoku, walidacji czy etykiet. Jednocześnie nie rozmywa spójności modelu danych, bo typ danych i logika zapisania pozostają centralnie kontrolowane.
Projektowanie Bundli: jak nie zgubić się w strukturze
Modelowanie informacji przed klikaniem w interfejs
Jednym z częstych błędów jest zaczynanie pracy nad serwisem od tworzenia typu treści w interfejsie administracyjnym, bez wcześniejszego zaplanowania modelu danych. Tymczasem warto najpierw na papierze lub w diagramie odpowiedzieć na pytania:
- Jakie główne typy treści biznesowej ma obsługiwać serwis?
- Jakie encje odpowiadają za relacje między nimi (np. powiązania, autorzy, tagi)?
- Co jest treścią, a co konfiguracją?
- Gdzie w przyszłości mogą pojawić się integracje lub rozbudowa?
Na tej podstawie tworzysz listę typów Entity i Bundli, zamiast dopasowywać nazwy typów do chwilowych potrzeb redakcja. Taka analiza oszczędza później kosztownego refactoringu oraz migracji danych.
Kiedy tworzyć nowy Bundle, a kiedy nowe pole
Decyzja o stworzeniu nowego Bundla nie powinna być pochopna. Nowy Bundle to nowe formularze, nowe widoki, nowe ścieżki uprawnień. W praktyce warto stworzyć nowy Bundle, gdy spełnione są co najmniej dwa z poniższych kryteriów:
- inna logika biznesowa (np. artykuł a ogłoszenie)
- istotnie inny zestaw pól (np. artykuł vs. raport z plikiem PDF i dodatkowymi metadanymi)
- odrębne przepływy pracy (workflow, statusy publikacji)
- różne role redakcyjne mają do nich różne uprawnienia
Jeśli różnica dotyczy tylko drobnej opcji (np. artykuły sponsorowane wśród zwykłych artykułów), często wystarczy pojedyncze pole typu boolean lub lista wyboru, zamiast mnożenia Bundli. Zbyt duża liczba typów treści prowadzi do chaosu, utrudnia szkolenia redaktorów i komplikuje konfigurację widoków.
Granica między node a innymi typami Encji
Node jest kuszący, bo jest dobrze znany i wspierany przez liczne moduły. Jednak w wielu przypadkach lepszą decyzją jest utworzenie dedykowanego typu Entity (np. za pomocą Drupal Console lub modułu Entity API). Warto się nad tym zastanowić, gdy:
- dany obiekt nie jest klasyczną treścią redakcyjną
- trzeba nim zarządzać w sposób zbliżony do konfiguracji
- powinien mieć specjalne zachowanie w API lub w logice biznesowej
W takich sytuacjach stworzenie własnej encji i zdefiniowanie dla niej Bundli może w dłuższej perspektywie uprościć projekt i uniknąć nadużywania node jako uniwersalnego kontenera na wszystko.
Reużywalność pól i konserwacja projektu
Przy projektowaniu Bundli należy od początku myśleć o utrzymaniu projektu. Kilka praktycznych wskazówek:
- unikaj tworzenia wielu pól o bardzo zbliżonym znaczeniu (np. „opis_1”, „opis_2”)
- maksymalnie wykorzystuj możliwość współdzielenia pól między Bundlami, jeśli ich semantyka jest taka sama
- konsekwentnie nazywaj pola – tak, aby już po nazwie dało się zorientować, do czego służą
- planuj, które pola będą mapowane do API lub eksportowane – to wpłynie na ich strukturę
Dobrze zaprojektowana relacja Entity – Bundle – pola przekłada się bezpośrednio na czytelny kod, przewidywalne zachowanie formularzy oraz łatwiejsze migracje danych w przyszłości.
Entity i Bundle w praktyce: workflow, API, moduły
Workflow i uprawnienia na poziomie Bundli
Jedną z największych zalet stosowania Bundli jest możliwość przypisywania im odrębnych przepływów pracy i polityk uprawnień. Dzięki temu:
- artykuły mogą przechodzić przez rozbudowany workflow (szkic → do akceptacji → publikacja)
- strony statyczne mogą mieć prostszy cykl (szkic → publikacja)
- raporty mogą być edytowane tylko przez wąską grupę redaktorów
Moduły takie jak Content Moderation czy Workflows pozwalają konfigurować te procesy właśnie w oparciu o typy treści, czyli Bundles dla node. Dzięki spójnemu modelowi można jednak tę logikę rozszerzać na inne typy Encji, jeżeli jest taka potrzeba i dostępne są odpowiednie rozszerzenia.
Entity API i praca programistyczna z Bundlami
Od strony developera Entity i Bundles są widoczne w postaci klas, interfejsów i metadanych dostępnych przez Entity API. Podstawowe operacje to:
- ładowanie encji po identyfikatorze lub kryteriach (entityTypeManager, storage)
- filtrowanie po Bundlu (np. tylko node typu artykuł)
- tworzenie nowych encji wskazanego Bundla
- aktualizacja i usuwanie encji
Metadane Bundli (ich nazwy, etykiety, dostępne pola) są również zarządzane jako Encje konfiguracyjne. Dzięki temu można je łatwo versionować, eksportować do plików konfiguracyjnych i dystrybuować między środowiskami. Kod aplikacji pozostaje więc w dużej mierze niezależny od konkretnej liczby Bundli – operuje na ich identyfikatorach, które podlegają konfiguracji, a nie kompilacji.
Integracje i API zewnętrzne a model Entity/Bundle
Przy projektowaniu integracji (np. headless, REST, GraphQL) właściwe zrozumienie Entity i Bundli okazuje się kluczowe. Od ich struktury zależy:
- jak będą wyglądać schematy danych udostępniane do frontendu
- jak łatwo będzie mapować encje na modele w innych systemach
- czy późniejsze zmiany struktury nie złamią istniejących integracji
Przykładowo, jeśli każdy Bundla artykułu, raportu i case study ma własne specyficzne pola, ale także wspólne pola „tytuł”, „lead”, „obraz główny”, to można zaprojektować wspólny typ w API, który będzie łatwo obsługiwany w aplikacji frontendowej. Jeśli natomiast każdy Bundla zostanie zbudowany zupełnie inaczej, po stronie klienckiej może pojawić się konieczność utrzymywania wielu złożonych ścieżek obsługi.
Moduły ekosystemu a elastyczność Encji
Ogromna część modułów Drupal działa właśnie dlatego, że opiera się na abstrakcji Entity. Przykłady:
- Views – pozwala tworzyć listy encji dowolnego typu, filtrowane po Bundlach i polach
- Rules – umożliwia reagowanie na zdarzenia związane z tworzeniem czy edycją encji
- Pathauto – generuje adresy URL na podstawie pól encji i jej Bundla
- Search API – indeksuje i udostępnia do wyszukiwania dowolne encje
Jeżeli struktura Bundli jest przemyślana, konfiguracja tych modułów staje się prostsza i bardziej powtarzalna. Można na przykład ustalić, że wszystkie treści „publicystyczne” (różne Bundles node) będą korzystały z jednego indeksu wyszukiwarki, a „ofertowe” z innego. Wystarczy filtrowanie po Bundlach, zamiast skomplikowanych warunków na polach.