Kreiranje prilagođenog sadržaja
Publika
Ova dokumentacija je prvenstveno namenjena programerima sa iskustvom u objektno orijentisanom PHP-u, Drupal 6 ili Drupal 7, kao i onima koji žele da nauče principe Drupala 8.
Dokumentacija o kreiranju tipa content entiteta u Drupalu 8 sadrži kompletan spisak dostupnih opcija.
Pravljenje tipa sadržaja bez paketa u Drupalu 8.
Ovde pravimo Drupal 8 content entitet koji nema nikakve pakete.
Entitet ne implementira Field API, tako da on ostaje u kodu. Ipak, ovo može biti korisna osnova za pravljenje Content Entiteta, jer ćemo kasnije importovati složenije podatke.
Na kraju, tamo gde postoje neke OOP koncepte, pozivaću se na relevantnu dokumentaciju.
Osnova.
Naš modul se zove advertiser.
Naš tip content entiteta se zove advertiser.
Naš novi Drupal 8 content entitet advertiser će imati polja:
- UUID
- ID
Definisanje sadržaja entiteta u Drupalu 8.
Prvo, svi custom entiteti sada žive u modules/custom umesto u sites/all/modules/custom.
Unutar našeg custom modula, struktura fajlova izgleda ovako:
modules/custom/advertiser$ ├── advertiser.info.yml └── src └── Entity └── Advertiser.php
Za referencu možete pogledati gotov entitet Advertiser sa dodatnim stvarima kao što su testovi i plugins za ograničenja, ali za sada ćemo biti jednostavni.
Info fajl
Počinje se definisanjem našeg custom modula u module_name.info.yml. Samo je jasno:
name: Advertiser type: module description: 'Barebones advertiser entity' package: custom core: 8.x
Skeleton entiteta
Osnovni klasa entiteta Advertiser i prateća šema se definišu u src/Entity/Advertiser.php.
Prvo definišemo namespace za naš Advertiser Entity klasu. To će biti korisno kad koristimo klase.
namespace Drupal\advertiser\Entity;
Sada je vreme da definišemo naš entitet kroz anotaciju.
Ovo je stvarna definicija tipa entiteta, koju Drupal učitava i kešira, zato obavezno čistite keš nakon svake izmene.
<?php /** * Definiše entitet advertiser. * * @ingroup advertiser * * @ContentEntityType( * id = "advertiser", * label = @Translation("Advertiser"), * base_table = "advertiser", * entity_keys = { * "id" = "id", * "uuid" = "uuid", * }, * ) */ ?>
Pošto je ovo prazna entiteta, koristimo samo nekoliko svojstava, bez handlera kao što je modul Access.
Imamo funkcionalan modul koji definiše naš custom content entitet, ali vidimo da tabela "advertiser" nije kreirana u bazi.
$ drush sql-cli mysql> SHOW TABLES;
To je zato što u našoj klasi nema metoda koji direktno rade sa bazom. Takođe, potrebni su minimalni opisni metodi da entitet pravilno radi sa bazom.
ContentEntityBase
Obično uključujemo klase dodavanjem npr. use Drupal\Core\Entity\ContentEntityBase; posle namespace na vrhu fajla. Ovo čini metode dostupnim za našu klasu, koju možemo proširiti ili implementirati.
Mi radimo dve stvari — proširujemo postojeću klasu ContentEntityBase koja već ima metode za rad sa bazom i implementiramo ContentEntityInterface da bismo definisali ...
metode koje su potrebne za pristup našoj bazi. Ovo NE opisuje kako je to interno urađeno. Klasa koja IMPLEMENTIRA interfejs može to učiniti na mnogo načina, a mi možemo menjati implementacije bez da menjamo naš kod jer interfejs definiše kako se koristi bez obzira na implementaciju. — https://secure.php.net/manual/en/language.oop5.interfaces.php
To znači da imamo sledeće. Ne zaboravite da dodate sve nove klase sa use na početku fajla:
class Advertiser extends ContentEntityBase implements ContentEntityInterface {
Ipak, moramo koristiti metode da nešto smestimo u bazu, pa počinjemo sa osnovnim poljima naše entitete.
baseFieldDefinitions
Metod baseFieldDefinitions je iz klase ContentEntityBase koju proširujemo.
Prima jedan parametar:
Definiciju tipa entiteta. Korisno kad jedan klasa može da se koristi za više dinamičkih tipova.
Vraća:
Niz osnovnih definicija polja za entitet, gde je ključ ime polja.
Implementiramo to ovako:
<?php public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { // Standardno polje, koristi se kao jedinstveni primarni indeks. $fields['id'] = BaseFieldDefinition::create('integer') ->setLabel(t('ID')) ->setDescription(t('ID Advertiser entiteta.')) ->setReadOnly(TRUE); // Standardno polje, jedinstveno van okvira ovog projekta. $fields['uuid'] = BaseFieldDefinition::create('uuid') ->setLabel(t('UUID')) ->setDescription(t('UUID Advertiser entiteta.')) ->setReadOnly(TRUE); return $fields; } ?>
Vredno je pomena:
“Daje definicije osnovnih polja za tip entiteta.”
- To je javni statički metod iz FieldableEntityInterface.
“Klasa za definisanje polja entiteta.”
- Sve metode koje su nam potrebne za kreiranje polja, dodavanje ograničenja itd.
Kompletan entitet
Dakle, u celini to izgleda ovako:
<?php namespace Drupal\advertiser\Entity; use Drupal\Core\Entity\ContentEntityBase; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Entity\ContentEntityInterface; /** * Definiše entitet advertiser. * * @ingroup advertiser * * @ContentEntityType( * id = "advertiser", * label = @Translation("Advertiser"), * base_table = "advertiser", * entity_keys = { * "id" = "id", * "uuid" = "uuid", * }, * ) */ class Advertiser extends ContentEntityBase implements ContentEntityInterface { public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { // Standardno polje, koristi se kao jedinstveni primarni indeks. $fields['id'] = BaseFieldDefinition::create('integer') ->setLabel(t('ID')) ->setDescription(t('ID Advertiser entiteta.')) ->setReadOnly(TRUE); // Standardno polje, jedinstveno van okvira ovog projekta. $fields['uuid'] = BaseFieldDefinition::create('uuid') ->setLabel(t('UUID')) ->setDescription(t('UUID Advertiser entiteta.')) ->setReadOnly(TRUE); return $fields; } } ?>
Nakon što instalirate vaš modul, trebalo bi da vidite da je tabela "advertiser" kreirana u bazi!
$ drush sql-cli mysql> SHOW TABLES;
ili
drush sqlq "show tables like 'advertiser'" drush sqlq "describe advertiser"
Ako je modul već instaliran, moraćete da izvršite ažuriranje entiteta.
U #2976035: CRUD operacije sa tipom entiteta treba da koriste poslednje instalirane definicije entiteta i polja, mogućnost pokretanja udaljenog upita je uklonjena, više na: zabeleška o promenama.
Molimo pogledajte modul Devel Entity Updates.
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.