Visualisering van pad met Drupal 6, 7 en 8

Migratiestrategieën voor Drupal 8

Kevin VB
Drupal 8

Content vormt altijd één van de belangrijkste onderdelen van een website. Het internet is per slot van rekening voortgekomen uit de idee van vrije informatie-overdracht... Een migratie naar een nieuw CMS of een nieuwe versie van een bestaand CMS houdt dan ook altijd één of andere vorm van contentmigratie in. Het is van cruciaal belang om daar al in een vroege fase rekening mee te houden wanneer je een CMS-upgrade overweegt.

De Drupalcommunity is zich terdege bewust van contentmigratie als één van de sleutelfactoren voor succes. Daarom heeft Drupal 8 de migrate-module als kernmodule (in core) aanwezig. Die functionaliteit stelt je in staat om van een oude Drupalversie te upgraden naar D8, met behulp van enkele eenvoudige stappen ter configuratie. Hieronder leg ik uit hoe dat werkt en geef ik ook enkele alternatieven voor custom migraties. De originele, Engelstalige versie van mijn bericht is hier te vinden.

 

Waarom migreren naar Drupal 8?

Sitesnelheid is niet alleen belangrijk voor SEO: ze heeft ook een impact op de surftijd en zogenaamde exit rate of bounce rate van je bezoekers. Drupal 8 is uitgerust met een verbeterd cachingsysteem dat Drupal razendsnel maakt – allemaal terwijl er rekening wordt gehouden met contentbewerking. Je moet niet langer wachten op cache invalidation, dankzij de real-time cache invalidation door middle van cache tags.
Een andere goede reden voor upgrade/migratie is de Drupalgemeenschap. Veel features zijn gratis beschikbaar ter implementatie, waardoor je tijd en middelen uitspaart om in andere dingen te investeren. De community let ook nauwgezet op zogeheten continuous improvement van de bestaande code. Drupal 8 is een goed voorbeeld van die onophoudelijke drang naar verbetering: het is namelijk volledig gebouwd op het Symfony2-framework.
Alles in Drupal 8 is zo gestandaardiseerd dat onderhoud een heleboel makkelijker en meer tijdbesparend werkt. Er bestaat dan ook geen twijfel over dat een upgrade naar Drupal 8 een prima investering is.

Hoe migreer ik precies naar D8?

Je kunt de migrate module die bij Drupal in core aanwezig is, gebruiken om van een oudere Drupalversie naar Drupal 8 over te stappen. Zorg ervoor dat je de vereiste modules eerst installeert en aanzet.
Bijvoorbeeld: als je site bepaalde field types gebruikt, moet je die modules ook installeren in je nieuwe Drupal 8-website. Zodra je klaar bent met de configuratie van je site, moet je enkel nog de volgende modules inschakelen:

  • Migrate
  • Migrate Drupal
  • Migrate Drupal UI

Die laatste module leidt je naar een configuratiepagina, van waarop je de migratie zelf kunt starten. Voer de database-info van je bestaande Drupalsite in en laat de upgrade reviewen door Drupal.

De review geeft je een lijst met beschikbare upgradepaden, naast een lijst met op dat moment nog ontbrekende modules. Zodra je tevreden bent met de review en mogelijke problemen hebt verholpen, kun je ervoor kiezen om de upgrade te starten. Drupal zal dan beginnen met het importeren van content, gebruikers en taxonomieën naar je Drupal 8-site. Ik wijs er ook even op dat er op dit moment geen rollback-functionaliteit beschikbaar is via de UI van Drupal.
Aangezien de migrate-functie in core geschikt is voor een beperkt aantal cases, zou het kunnen dat je site te complex is om ze eenvoudigweg met de Migrate Drupal-module te importeren. In sommige gevallen is het dus beter om een custom migratie te schrijven.

Hoe schrijf ik een migratie op maat?

Zoals hierboven beschreven, zal de Migrate Drupal-module in een aantal gevallen resulteren in een herinstallatie van je Drupalwebsite, omdat een aantal onderdelen verkeerd geïmporteerd zijn. Om op veilig te spelen en dit te vermijden, kun je de migratie zelf schrijven. Dat doe je met de Migrate Plus-module. Die zorgt ervoor dat je een nieuwe Migration entity kunt opmaken. Die entity’s schrijf je in YAML.

# Migration configuration for News content.
id: news_node
label: News Content Type
migration_group: demo_news
source:
 plugin: news_node
destination:
 plugin: entity:node
process:
 type:
   plugin: default_value
   default_value: news
 langcode:
   plugin: default_value
   source: language_code
   default_value: nl
 title: post_title
 field_title: post_title
 path: path
field_tags:
 plugin: migration
 migration:
   - news_terms
 source: tags_terms

migration_dependencies:
 required:
   - news_terms

Voorbeeld van een migration entity: migrate_plus.migration.news_node.yml

Elke migration entity kan onderdeel uitmaken van een Migration Group entity en wordt in YAML gedefinieerd met de key ‘migrate_group’. Een volledige set migraties kun je in één keer importeren of terugzetten met drush, door de Migrate Tools-module te installeren.

  • drush mi --group=”demo_news” Import all migration in group demo_news
  • drush mr --group=”demo_news” Rollback all migrations in group demo_news

 

De sleutel van een succesvolle migratie is een Drupal 8-plugin die de migratie duidelijk maakt waar de broninformatie vandaan komt. Er zijn een heleboel source-plugins beschikbaar voor D8:

  • SqlBase - in Drupal Core: lets you migrate from an SQL source.
  • URL - in Migrate Plus: lets you migrate from a URL which can return JSON, XML, SOAP.
  • CSV - in Migrate Source CSV: lets you migrate from a CSV source file.
  • Spreadsheet - in Migrate Spreadsheet: lets you migrate from a csv, xls or xlsx source file.

Als bovenstaande tools niet voldoende zijn, kun je starten van je eigen bron die gebaseerd is op de SourcePluginBase class.

We hebben the SqlBase-bron voor onze news_node source-plugin uitgebeid:

public function query() {
 $query = $this->select('post', 'p');
 $query->fields('p', [
   'ID',
   'post_title',
   'post_name',
   'post_date',
 ]);
 $query->condition('p.type', 'news');
 return $query;
}

Query function in news_node source.

De query-functie geeft ons een Select-object met de benodigde informatie voor de migratie. Dat object zal de bron vormen voor onze migratie.
Vervolgens moeten we de migratie vertellen welke Velden we willen mappen met de migratie. Dat doen we via de fields-methode.

public function fields() {
 $fields = [
   'post_title' => $this->t('The Post Node title'),
   'post_date' => $this->t('The Post creation time'),

   // ...
 ];

 return $fields;
}

In Drupal 7 gebruikten we prepareRow om extra waarden aan velden weer te geven die niet onmiddellijk meegegeven worden door de bron. Die methode is behouden gebleven in Drupal 8. In ons voorbeeld fetchen we een teaser-beeld en voegen we vervolgens de file-ID en file-alt toe aan de bron van de migratie.

public function prepareRow(Row $row) {
// Find related teaser attachment image.
$file = $this->getTeaserImage($content_id);

// Set a new property file_id.
$row->setSourceProperty('file_id', $file['id']);
$row->setSourceProperty('file_alt', $file['alt']);
return parent::prepareRow($row);
}

Extra informatie toevoegen aan de migratie in prepareRow.

Als we teruggaan naar de YAML-bevestiging van onze migration entity, zien we dat er al een destination key is geconfigureerd. In de meeste gevallen zal het gaan over een entity:entity_type destination-plugin. Migrate zal daarna automatisch entity’s creëren van het type dat geconfigureerd werd. then automatically create entities of the configured type. In our example, new nodes will be created. If needed, you can also simply create a new destination plugin, which performs extra actions during the import function.

De progress key in onze configuratie bepaalt de mapping van de waarde van de Velden. Hij bevat een mapping van de keys en warden, waarbij de Drupal field name als key optreedt en de source field name als waarde. In sommige gevallen, zoals bij ‘type’ of ‘language’, gebruiken we een default_value-plugin die ons toelaat om de waarde van het veld vast in te vullen. In ons voorbeeld maken we nieuwe nodes van het type news in het Nederlands.

In sommige gevallen komt de bronwaarde van een andere migratie. In ons voorbeeld kom de waarde van ‘field_tags’ uit een andere migratie. Dat wordt bepaald door de migration-plugin en de daaropvolgende definiëring van de migratie naar waar de waarde is gemigreerd.  Als er migratie-afhankelijke velden aanwezig zijn, is er een extra key nodig met ‘migration dependencies’. Die bevat een aantal migraties die éérst uitgevoerd moet worden.


Ik hoop dat deze post je heeft geholpen om meer inzicht te krijgen in de migratie van je website van D7 naar D8! Voor meer info kun je ons zoals steeds bereiken via de website.

 

Inschrijven voor de nieuwsbrief

Populaire blogposts
Drupal Mythes
Wat betekent Drupal 8 voor uw business?
Schrijven voor het web met de juiste keywords, gebruik Google Keyword Planner
Fairtrade Belgium bouwt eigen subsites
Is branding enkel het logo van mijn bedrijf?