9.11. Drupal Entity API. Kreiranje prilagođenog tipa entiteta. Generisanje tipa entiteta pomoću Drupal Console.
Već smo upoznati sa Form API, Fields API i znamo kako podaci u Drupalu dospevaju u bazu podataka. Sada ćemo pogledati temelj svih Drupal sajtova, naime Entity API.
Verovatno ste primetili da polja ne postoje sama za sebe, već su „prikačena“ za entitete: nodove, blokove, termine taksonomije, views i slično. Možete kreirati bundle entitete, na primer tipove materijala, tipove blokova, rečnike taksonomije. Ali šta ako treba da napravite novi entitet sa sopstvenim bundle-ovima? U tom slučaju trebaće vam Entity API za kreiranje novog entiteta.
Sve kodove sam dodao na Github u modul drupalbook_product, možete preuzeti modul i dodati ga na svoj sajt:
https://github.com/levmyshkin/drupalbook8
Najlakše je kreirati nove tipove entiteta kroz Drupal Console, jer je potrebna samo jedna komanda.
Ne morate često praviti nove tipove entiteta. Većina malih i srednjih projekata koristi contrib module kao osnovu, na primer Commerce za onlajn prodavnice:
https://www.drupal.org/project/commerce
Ako planirate da pravite sopstveni plug-in modul, možda ćete želeti da napravite novi tip entiteta, a među Drupal modulima možete pronaći već odgovarajući modul sa potrebnom funkcionalnošću, koji se može dopuniti nedostajućim funkcijama.
U ovom članku ćemo analizirati Entity API i napraviti sopstveni tip Product entiteta, koji će služiti kao osnova za mali prilagođeni katalog ili prodavnicu. Ako ipak odlučite da pravite prilagođenu prodavnicu, snažno preporučujem korišćenje Commerce, jer će vam uštedeti mnogo vremena i truda.
Kada želite da napravite novi tip entiteta, postavlja se pitanje zašto ne možete jednostavno napraviti još jedan tip materijala Product i koristiti ga za katalog? Da, to može da funkcioniše za mali katalog sa prikazom kroz Views i jednostavnim filterima po ceni i stanju na lageru. Ali kada proizvoda bude hiljade, menadžer će teško pronaći željeni proizvod na stranici sadržaja. Želeće da zakači filtere po artiklu, kategoriji, boji, nazivu i ostalim parametrima direktno na stranici
/admin/content
To bi izgledalo suvišno i smetalo bi radu sa drugim tipovima materijala: Novosti, Članci, Događaji i Stranice. Zato se u takvim situacijama pravi poseban tip Product entiteta sa sopstvenim administratorskim panelom i podešavanjima.
Hajde da počnemo sa kreiranjem posebnog tipa Product entiteta. Pre nego što pokrenete komandu za kreiranje entiteta, toplo preporučujem da napravite rezervnu kopiju sajta, bar baze podataka. Proces kreiranja entiteta podrazumeva generisanje konfiguracija koje se zapisuju u bazu, i ako nešto krene naopako, a deo konfiguracija se zabeleži bez odgovarajućih fajlova entiteta u modulu, sajt može da se pokvari. Zato prvo napravite backup.
Sada pravimo novi modul, koji takođe možete napraviti pomoću Drupal Console:
drupal generate:module
https://hechoendrupal.gitbooks.io/drupal-console/en/commands/generate-module.html
$ vendor/bin/drupal generate:module
// Welcome to the Drupal module generator
Enter the new module name:
> Drupalbook Product
Enter the module machine name [drupalbook_product]:
>
Enter the module Path [modules/custom]:
>
Enter module description [My Awesome Module]:
> Products catalog
!>
Enter package name [Custom]:
>
Enter Drupal Core version [8.x]:
>
Do you want to generate a .module file? (yes/no) [yes]:
> no
Define module as feature (yes/no) [no]:
> no
Do you want to add a composer.json file to your module? (yes/no) [yes]:
> no
Would you like to add module dependencies? (yes/no) [no]:
> no
Do you want to generate a unit test class? (yes/no) [yes]:
> no
Do you want to generate a themeable template? (yes/no) [yes]:
> no
Do you want proceed with the operation? (yes/no) [yes]:
> yes
Generated or updated files
Generation path: /home/laptop/projects/drupalbook
1 - /modules/custom/drupalbook_product/drupalbook_product.info.yml
Generated lines: "5"
Ili jednostavno napravite modul sa fajlom drupalbook_product.info.yml:
name: 'drupalbook_product'
type: module
description: 'Products catalog'
core: 8.x
package: 'Drupalbook'
Sada možemo generisati tip entiteta Product.
https://hechoendrupal.gitbooks.io/drupal-console/en/commands/generate-entity-content.html
$ drupal generate:entity:content
$ vendor/bin/drupal generate:entity:content
// Welcome to the Drupal Content Entity generator
Enter the module name [admin_toolbar]:
> drupalbook_product
Enter the class of your new content entity [DefaultEntity]:
> DrupalbookProductEntity
Enter the machine name of your new content entity [drupalbook_product_entity]:
>
Enter the label of your new content entity [Drupalbook product entity]:
> Product
Enter the base-path for the content entity routes [/admin/structure]:
>
Do you want this (content) entity to have bundles? (yes/no) [no]:
> yes
Is your entity translatable? (yes/no) [yes]:
> yes
Is your entity revisionable? (yes/no) [yes]:
> no
// generate:entity:config
Enter the base-path for the config entity routes [/admin/structure]:
>
Generated or updated files
Generation path: /home/laptop/projects/drupalbook
1 - modules/custom/drupalbook_product/drupalbook_product.permissions.yml
2 - modules/custom/drupalbook_product/drupalbook_product.links.menu.yml
3 - modules/custom/drupalbook_product/drupalbook_product.links.task.yml
4 - modules/custom/drupalbook_product/drupalbook_product.links.action.yml
5 - modules/custom/drupalbook_product/src/DrupalbookProductEntityAccessControlHandler.php
6 - modules/custom/drupalbook_product/src/DrupalbookProductEntityTranslationHandler.php
7 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityInterface.php
8 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntity.php
9 - modules/custom/drupalbook_product/src/DrupalbookProductEntityHtmlRouteProvider.php
10 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityViewsData.php
11 - modules/custom/drupalbook_product/src/DrupalbookProductEntityListBuilder.php
12 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntitySettingsForm.php
13 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityForm.php
14 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityDeleteForm.php
15 - modules/custom/drupalbook_product/drupalbook_product_entity.page.inc
16 - modules/custom/drupalbook_product/templates/drupalbook_product_entity.html.twig
17 - modules/custom/drupalbook_product/templates//drupalbook-product-entity-content-add-list.html.twig
18 - modules/custom/drupalbook_product/drupalbook_product.module
19 - modules/custom/drupalbook_product/drupalbook_product.module
20 - modules/custom/drupalbook_product/drupalbook_product.module
21 - modules/custom/drupalbook_product/config/schema/drupalbook_product_entity_type.schema.yml
22 - modules/custom/drupalbook_product/drupalbook_product.links.menu.yml
23 - modules/custom/drupalbook_product/drupalbook_product.links.action.yml
24 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityTypeInterface.php
25 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityType.php
26 - modules/custom/drupalbook_product/src/DrupalbookProductEntityTypeHtmlRouteProvider.php
27 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityTypeForm.php
28 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityTypeDeleteForm.php
29 - modules/custom/drupalbook_product/src/DrupalbookProductEntityTypeListBuilder.php
Generated lines: "1060"
Sada kada je modul generisan, možete ga omogućiti da bi novi tip entiteta bio vidljiv na sajtu:
Kada generišete entitet, Drupal Console vas pita kako treba da se zove entitet.
Enter the class of your new content entity [DefaultEntity]:
Ime PHP klase za vaš entitet, najbolje je dodati sufiks Entity na kraj imena.
Enter the machine name of your new content entity [drupalbook_product_entity]:
Mašinsko ime klase biće predloženo na osnovu imena klase, ako pritisnete Enter, koristiće se predloženo ime.
Enter the base-path for the content entity routes [/admin/structure]:
Vaš entitet će imati sopstvenu stranicu za CRUD operacije:
Prikaz stranice proizvoda je prilično jednostavan, ali se može unaprediti ili kreirati preko Views:
Da biste kreirali novi entitet, prvo treba da napravite bundle tipa Product entiteta. Izabrali smo entitet sa bundle-ovima:
Do you want this (content) entity to have bundles? (yes/no):
Zato pravimo novi tip proizvoda. To nam treba da bismo mogli dodati različita polja kao što su Težina, Veličina, Boja i druge karakteristike. Na primer, monitori imaju dijagonalu ekrana, a obuća veličinu cipela.
Napravimo novi tip proizvoda – Odeća:
Sada za naš novi tip proizvoda možete prilagoditi polja:
Definitivno nam treba bar polje Cena.
Napravimo nekoliko proizvoda i pogledajmo bazu podataka. Imamo tabelu drupalbook_product_entity u kojoj se čuvaju UUID-ovi naših proizvoda:
Postoji i tabela drupalbook_product_entity_field_data gde se čuvaju Properties. To su specijalna polja entiteta koja se direktno čuvaju u tabelama, jer polja kao što je Naziv (labela entiteta, na primer naslov nod-a) se ne menjaju u zavisnosti od revizije.
Ako dodate polja, za svako polje će biti kreirane dve tabele, zato što smo izabrali da entitet bude revisionable:
Is your entity revisionable? (yes/no) [yes]
Verujem da sada razumete kako se prave novi tipovi entiteta. U narednim člancima proširićemo funkcionalnosti našeg prilagođenog kataloga/prodavnice.
Sve kodove sam postavio na github u modul drupalbook_product, možete preuzeti modul i dodati ga na svoj sajt: