9.9.1. Configuratiebeheer in Drupal. Inhoud en configuratie importeren.
Wanneer je een configuratie van de ene site naar de andere importeert, zijn er enkele configuraties nodig om inhoud weer te geven, maar de configuratie zelf bevat geen inhoud. In deze tutorial zullen we uitleggen hoe je blokken, knooppunten en taxonomie-termen van de ene site naar de andere kunt verplaatsen.
Laten we een blok aanmaken op de ene site en de configuraties naar een andere site overdragen. Je kunt zien hoe je de configuraties van de ene site naar de andere overzet in het vorige artikel 9.9. Werken met configuraties in Drupal. Actieve, Sync configuratie, configuraties overdragen van DEV naar LIVE. Actieve, Sync configuraties, configuraties overdragen van DEV naar LIVE.
Je zult de volgende fout zien: "Dit blok is kapot of ontbreekt. Mogelijk ontbreekt de inhoud of moet je de originele module inschakelen.":
Het blok heeft een entiteit blok nodig met een specifieke uuid. UUID is een unieke identifier van de entiteit, zelfs als we hetzelfde blok met dezelfde inhoud op de nieuwe site maken, zal dit blok niet door de configuratie worden opgehaald, omdat het nieuwe blok een andere UUID heeft. Je kunt de UUID die je nodig hebt zien in de configuratie voor het blok:
Verwar de UUID van het blok niet met de Config UUID. Het verschil is dat configuraties ook entiteiten zijn in Drupal, maar in tegenstelling tot blokken en knooppunten die inhouds-entiteiten zijn, zijn configuraties configuratie-entiteiten. In een van de volgende lessen zullen we de ContentEntity- en ConfigEntity-klassen bekijken.
Dus nu weet je welke UUID je nodig hebt voor het blok en moet je dit blok via de code aanmaken, zodat het juiste blok met de juiste UUID wordt aangemaakt wanneer je de configuratie uitrolt. Hiervoor gebruiken we hook_update_n():
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension%
Je moet hook_update_n() toevoegen aan het .install-bestand van de aangepaste module, zodat de update door de module wordt opgehaald en de site moet van tevoren worden toegevoegd en ingeschakeld. Elke nieuwe hook_update_n() wordt uitgevoerd wanneer update.php wordt gestart of bij het uitvoeren van een database-update via drush of drupal console. In tegenstelling tot andere hooks waar je alleen het woord hook aan het begin moet veranderen, moet je in hook_update_n() meer veranderen en n aan het einde voor elke update, zodat deze een eigen versie heeft. Meestal worden getallen vanaf 8000 voor Drupal 8.x en 7000 voor Drupal 7.x gebruikt, waarbij het eerste cijfer de versie van de Drupal-kernel is.
/modules/custom/drupalbook/drupalbook.install:
/**
* Voeg een eenvoudig blok toe met tekst en afbeelding.
*/
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([
// Block titel.
'info' => 'Eenvoudig tekstblok met afbeelding',
// Block bundel.
'type' => 'basic',
'uuid' => 'dc0876cf-a242-4f4c-af0e-8a27fbe9e142'
]);
$block->body->value = 'Hallo, Wereld!';
$block->save();
}
}
Nu moet je deze code naar de tweede site verplaatsen en vervolgens het update.php-bestand daar uitvoeren:
Drupal zal deze update vinden en je zult je blok zien nadat het proces is voltooid.
Als je kijkt naar de code die het blok aanmaakt, zie je dat we eerst controleren of het blok al bestaat, zodat wanneer je je bron-site bijwerkt, waar het blok al bestaat, er geen foutmelding komt over het onmogelijke om een blok met een bestaande UUID aan te maken.
Let ook op dat alleen de tekst van het blok wordt overgedragen, afbeeldingen die online in de tekst worden geladen, worden niet overgedragen via de afbeelding-browser CKEditor, omdat de bestanden apart moeten worden overgedragen. Het is mogelijk om dit via drush, ssh, ftp of via git (als het 1 of 2 bestanden zijn, maar als het groter is, is het beter om git niet te vervuilen met afbeeldingsbestanden). Het uitrolproces varieert van project tot project en gebruikt overal verschillende benaderingen, dus het is belangrijk voor het project om ten minste minimale documentatie te hebben die het uitrolproces beschrijft.
Hetzelfde geldt voor het aanmaken van taxonomie-termen, we verplaatsen alleen de instellingen van het woordenboek en taxonomie-term-velden in configuraties, maar de taxonomie-termen zelf moeten apart worden aangemaakt, bijvoorbeeld zo:
\taxonomy\Entity\Term;
...
/**
* Maak taxonomie-term programmatically aan.
*/
function drupalbook_update_8002(&$sandbox) {
$term = Term::create([
'name' => 'Drupal 8',
'vid' => 'tags',
])->save();
}
In het vid-veld moet je de machine-naam van het taxonomie-woordenboek (Vocabulary ID) opgeven.
Om knooppunten aan te maken, moet je ongeveer deze code gebruiken:
/**
* Maak knooppunt programmatically aan.
*/
function drupalbook_update_8003(&$sandbox) {
$node = Node::create(['type' => 'page']);
$node->set('title', 'Over ons');
$body = [
'value' => 'Tekst over ons',
'format' => 'basic_html',
];
$node->set('body', $body);
$node->status = 1;
$node->enforceIsNew();
$node->save();
}
Ongeveer, omdat je in plaats van set() ook gewoon het volgende kunt doen:
= [
'value' => 'Tekst over ons',
'format' => 'basic_html',
];
$node->set('body', $body);
// of
$node->body->format = 'basic_html';
$node->body->value = 'Tekst over ons',
Elke keer dat je een nieuwe hook_update_n() toevoegt, moet je update.php uitvoeren. Als je Acquia of andere hosting met automatische uitrol gebruikt, is dit proces geautomatiseerd en moet je verduidelijken hoe de uitrol zal plaatsvinden.
Codevoorbeelden kunnen worden bekeken op github:
https://github.com/levmyshkin/drupalbook8