9.9.1. Upravljanje konfiguracijom u Drupalu. Uvoz sadržaja i konfiguracije.
Kada uvozite konfiguraciju sa jednog sajta na drugi, neke konfiguracije su potrebne za prikaz sadržaja, ali sama konfiguracija sadržaja ih ne sadrži. U ovom tutorijalu objasnićemo kako da prenesete blokove, nodove i taksonomijske termine sa jednog sajta na drugi.
Napravimo blok na jednom sajtu i prenesimo konfiguracije na drugi sajt. Možete videti kako se prenose konfiguracije sa jednog sajta na drugi u prethodnom članku 9.9. Rad sa konfiguracijama u Drupalu. Aktivna, sinhronizacija konfiguracije, prenos konfiguracija sa DEV na LIVE. Aktivna, sinhronizacija konfiguracije, prenos konfiguracije sa DEV na LIVE.
Videćete sledeću grešku: „Ovaj blok je oštećen ili nedostaje. Možda vam nedostaje sadržaj ili je potrebno da omogućite originalni modul.“:
Blok zahteva entitet blok sa određenim UUID-om. UUID je jedinstveni identifikator entiteta, čak i ako napravimo isti blok sa istim sadržajem na novom sajtu, taj blok neće biti prepoznat u konfiguraciji, jer novi blok ima drugačiji UUID. UUID koji vam treba možete videti u konfiguraciji bloka:
Nemojte mešati UUID bloka sa Config UUID. Konfiguracije su takođe entiteti u Drupalu, ali za razliku od blokova i nodova koji su entiteti sadržaja, konfiguracije su konfiguracijski entiteti. U jednom od narednih lekcija ćemo pogledati klase ContentEntity i ConfigEntity.
Sada znate koji UUID vam treba za blok i potrebno je da kreirate taj blok kroz kod, tako da pri deploy-ovanju blok sa pravim UUID-om bude kreiran. Za to ćemo koristiti hook_update_n():
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension%
Hook_update_n() treba dodati u .install fajl prilagođenog modula, tako da update bude prepoznat. Modul mora biti prethodno dodat i omogućen na sajtu. Svaki novi hook_update_n() će se izvršiti prilikom pokretanja update.php ili update baze podataka putem drush-a ili drupal konzole. Za razliku od ostalih hook-ova gde se menja samo reč hook na početku, u hook_update_n() morate menjati i n na kraju, za svaku izmenu posebno, obično se koriste brojevi od 8000 naviše za Drupal 8.x, a 7000 i više za Drupal 7.x, gde prva cifra označava verziju kernela Drupala.
/modules/custom/drupalbook/drupalbook.install:
/**
* Dodaje jednostavan blok sa tekstom i slikom.
*/
function drupalbook_update_8001(&$sandbox) {
$uuid = 'dc0876cf-a242-4f4c-af0e-8a27fbe9e142';
$block = \Drupal::entityManager()->loadEntityByUuid('block_content', $uuid);
if (empty($block)) {
$block = \Drupal\block_content\Entity\BlockContent::create([
// Naslov bloka.
'info' => 'Jednostavan tekstualni blok sa slikom',
// Tip bloka.
'type' => 'basic',
'uuid' => 'dc0876cf-a242-4f4c-af0e-8a27fbe9e142'
]);
$block->body->value = 'Zdravo, Svete!';
$block->save();
}
}
Sada treba ovaj kod prebaciti na drugi sajt i tamo pokrenuti update.php fajl:
Drupal će pronaći ovaj update i videćete blok nakon završetka izvršenja.
Ako pogledate kod koji kreira blok, pre kreiranja bloka proveravamo da li blok postoji, kako ne bi došlo do greške ako se update pokrene na sajtu gde blok već postoji sa istim UUID-om.
Napomena: samo se tekst bloka prenosi, slike koje su ubačene u tekst neće biti prenete preko image browser-a CKEditor-a, jer fajlove treba posebno preneti. Moguće je uploadovati fajlove putem drush, ssh, ftp ili ih staviti u git (ako su samo 1 ili 2 fajla, za veći broj nije preporučljivo da se slike pune u git). Proces deploy-ovanja varira od projekta do projekta i koristi različite pristupe, zato je važno da projekat ima barem minimalnu dokumentaciju koja opisuje deploy proces.
Isto važi i za kreiranje taksonomijskih termina, prenose se samo podešavanja rečnika i polja termina u konfiguraciji, dok se termini kreiraju posebno, na primer ovako:
\taxonomy\Entity\Term;
...
/**
* Programatsko kreiranje taksonomijskog termina.
*/
function drupalbook_update_8002(&$sandbox) {
$term = Term::create([
'name' => 'Drupal 8',
'vid' => 'tags',
])->save();
}
U polju vid treba uneti mašinsko ime taksonomijskog rečnika (Vocabulary ID).
Za kreiranje nodova, koristi se otprilike ovaj kod:
/**
* Programatsko kreiranje nod-a.
*/
function drupalbook_update_8003(&$sandbox) {
$node = Node::create(['type' => 'page']);
$node->set('title', 'O nama');
$body = [
'value' => 'Tekst o nama',
'format' => 'basic_html',
];
$node->set('body', $body);
$node->status = 1;
$node->enforceIsNew();
$node->save();
}
Otprilike, jer možete umesto set() koristiti i direktno dodeljivanje vrednosti:
= [
'value' => 'Tekst o nama',
'format' => 'basic_html',
];
$node->set('body', $body);
// ili
$node->body->format = 'basic_html';
$node->body->value = 'Tekst o nama';
Svaki put kada dodate novi hook_update_n(), potrebno je pokrenuti update.php. Ako koristite Acquia ili neki drugi hosting sa automatskim deploy-om, ovaj proces je automatizovan, pa proverite kako će se deploy vršiti.
Primere koda možete pogledati na github-u:
https://github.com/levmyshkin/drupalbook8