Drupal 8 migrace - static map s tečkou

2. 3. 2017

Stabilní verze Drupalu 8 je tady s námi již poměrně dlouho dobu. Oproti Drupalu 7 přináší obrovké množství změn (k lepšímu), které jsou dostupné již v základní instalaci Drupalu 8. Mezi tyto vlastnosti patří mimo jiné i migrace. Drupal 8 umožňuje relativně jednoduchým způsobem zmigrovat Drupal z verze 6 nebo 7 do verze 8. Migrate API definuje sadu procesů, kterými je možné data různě transformovat a upravit, aby se dosáhlo potřebné struktury v Drupalu 8. Tyto “transformace” je schopen Drupal vyrobit sám (za pomoci dalších modulů), pokud migrujeme ze starší verze Drupalu, ale obvykle nejsou úplně dokonalé a je potřeba provést nějaké manuální úpravy.

Migrace - process

Jednotlivé migrace se definují pomocí yaml souborů. V těchto souborech se definují i “transformace” (v řeči Drupalu procesy), které se v rámci migrace mají provést. Všechny potřebné informace k migraci jsou pěkně zdokumentovány na drupal.org (https://www.drupal.org/docs/8/api/migrate-api). 

Samotný proces (tedy co se má jako upravit/změnit atd.) se definuje pomocí pluginů. V základu je celá sada těchto pluginů, které jsou často naprosto dostačující pro celou migraci. Nicméně v praxi se často objeví případ, na který stávající pluginy nestačí.

Static map

Jedním ze zmiňovaných process pluginů je static map plugin. Tento plugin umožňuje definovat, jaké vlastnosti se mají na co mapovat. Tedy například pokud mám ve starém systému nějakou hodnotu A, ze které se má stát v novém systému hodnota B (A->B), mohu použít právě tento plugin. Pomocí static map je možné nadefinovat libovolné množství těchto mapování. Kompletní dokumentaci včetně příkladů najdete zde https://www.drupal.org/docs/8/api/migrate-api/migrate-process/process-plugin-static-map

Mapování hodnot s tečkou

Pokud si projdete dokumentaci static map pluginu, tak úplně na konci se dočtete, že v současné době static map nepodporuje mapování řetězců obsahující tečku (viz screenshot z dokumentace).

Drupal 8 Migrate static map dot

V současné době existuje vlákno na řešení tohoto problému (https://www.drupal.org/node/2827897), ale do vyřešení totoho úkolů je doporučené vytvořit si vlastní plugin.

Tvorba pluginu pro statické mapování s tečkou

Jedna z možností jak vyřešit tento problém je vytvoření placeholderu pro tečku a vytvoření vlastního pluginu, který tento placeholder převedu na tečku. Takový plugin může vypadat například takto:

V zásadě se jedná o klasický static map plugin, který je lehce rozšířený o placeholder a o převod tototo placeholderu na tečku. Samotné použití tohoto pluginu lze poté v yaml souborů použít takto:

Celý modul s pluginem pro mapování teček pomocí placeholderu je dostupný zde https://github.com/FreelyAgency/drupal8-migrate-process-static-map-dots

Pokud tedy přemýšlíte, zda aktualizovat starý web na nový, Drupal 8 vám vychází dost razantně naproti a celý proces migrace zjednodušuje.