logo

Dodatni tipovi blokova (EBT) - Novo iskustvo rada sa Layout Builder-om❗

Dodatni tipovi blokova (EBT) – stilizovani, prilagodljivi tipovi blokova: slajdšouvi, kartice sa tabovima, kartice, akordeoni i mnogi drugi. Ugrađena podešavanja za pozadinu, DOM Box, javascript dodatke. Iskusite budućnost kreiranja rasporeda već danas.

Demo EBT moduli Preuzmite EBT module

❗Dodatni tipovi pasusa (EPT) – Novo iskustvo rada sa pasusima

Dodatni tipovi pasusa (EPT) – analogni skup modula zasnovan na pasusima.

Demo EPT moduli Preuzmite EPT module

Scroll

9.11. Drupal Entity API. Kreiranje prilagođenog tipa entiteta. Generisanje tipa entiteta pomoću Drupal Console.

27/05/2025, by Ivan

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.

https://drupalconsole.com/

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:

drupal console

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:

structure drupal 8

Prikaz stranice proizvoda je prilično jednostavan, ali se može unaprediti ili kreirati preko Views:

Product display

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:

product type

Sada za naš novi tip proizvoda možete prilagoditi polja:

product type fields

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:

product data

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.

product entity

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:

https://github.com/levmyshkin/drupalbook8