Migratie Übercart 2.x naar Drupal Commerce 1.x

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

Hoe migreer je webwinkels van Drupal 6/Übercart 2.x naar Drupal 7/Drupal Commerce 1.x? Dit artikel behandelt deze materie op hoofdlijnen, met verwijzingen naar meer technische artikelen.

Overzicht

Wat?

In april 2016 heb ik een groot aantal webwinkels gemigreerd van Übercart naar Drupal Commerce. De grootste van deze webwinkels (700 producten, hiërarchie met 21.000 taxons, 11.000 gebruikersaccounts) krijgt daarnaast nieuwe content, maar de oude content moet eerst gemigreerd worden.

Onderdelen:

  1. Gebruikersaccounts → Best belangrijk, en onmisbaar als basis voor importeren van orders
  2. Orders → Best belangrijk: Prettig als ook de nieuwe webwinkels de basis zijn voor historische orders + prettig voor klanten
  3. Productgegevens → Belangrijkst, want niet voor alle webwinkels is er nieuwe content beschikbaar
  4. Productafbeeldingen → Belangrijk
  5. Taxonomieën → Belangrijk, om content toegankelijk te houden
  6. Commentaren bij artikelen → extra
  7. Story's & basic pages → Niet belangrijk
  8. Overige bestanden en afbeeldingen → Niet belangrijk.

Context

  • Eén ontwikkelomgeving: Doel- en bronwebwinkel staan op dezelfde ontwikkelomgeving. Da's een eigen LAMP-ontwikkelserver met Bash, Drush en beheerrechten
  • Import & export loskoppelen: Waarschijnlijk handig om de export uit Übercart los te zien van de import in Drupal Commerce. Daardoor kun je voor beide processen het meest geschikte gereedschap gebruiken. Voor export wordt het bv. snel een optie voor mij om rechtstreeks met een database-export te werken.
  • Feeds-module: Feeds is samen met Migrate de belangrijkste module voor migraties. Feeds kan van alles en nog wat en is erg prettig om mee te werken. Maar het biedt niet de flexibiliteit van Migrate. Waarschijnlijk handig om kort te onderzoeken of de bedoelde migratie met Feeds kan, alvorens met Migrate aan de slag te gaan
  • Commerce Migrate Übercart (CMU): De Commerce Migrate Übercart-module is een plugin voor Migrate en Commerce Migrate: Het bevat de gebruikelijke migratietaken die bij een migratie van pas komen
  • Migrate- & Commerce Migrate-module: De Migrate-module is één van de twee hoofd-modules voor migratie. Migrate is geschikt voor complexe migraties zonder eenduidige relaties tussen bron- en doeldata, omdat data getransformeerd kan worden middels PHP en SQL [1]. Als de CMU-module om een of andere reden niet is wat je zoekt, kun je waarschijnlijk prima uit de voeten met de Migrate-module. Waarschijnlijk moet je 'm combineren met de Commerce Migrate-module voordat-ie bruikbaar is
  • Exotica: Migrate & Feeds niet wat je zoekt? Alternatieven zijn oa. Migraties op database-niveau ( geen aanrader) en migraties via PHP & Drupal-API.

Migrate vs. Feeds

Wat het onderscheid tussen Migrate en Feeds betreft, dit is wat de projectpagina van Commerce Migrate ervan zegt:

In general, you'll use Feeds and Commerce Feeds when there's a one to one mapping between the input data and 
the entities you're importing. So Feeds is fantastic for importing products from a CSV file, for example. For 
Commerce Feeds see this article/screencast. It's not very strong in transforming data on the way in though. 
Much of the time a feeds migration can be done without touching any code.

Migrate and Commerce Migrate, in general, know how to transform things mightily, with the full power of SQL 
and PHP, on the way in. So you *can* do something like an Ubercart to Commerce migration, and you can solve 
the problems of a specific migration. So Migrate is the solution for more complex migrations, and it's the 
home of Commerce Migrate Ubercart, which solves some of the Ubercart migration issues. There's an article/
screencast on that here. Much of the time a *migrate* migration will require writing PHP code.

Wat nogal spreekt in het voordeel van Feeds, is dat deze module onvergelijkbaar veel gemakkelijker en intuïtiever is. Oftewel: Als het met Feeds kan, dan is dat mooi meegenomen. Zelfs als dit soms een omweg is, omdat je eerst moet exporteren om daarna pas te importeren.

Hoe?

Ik heb gekozen voor Migrate. Als ik dit opnieuw zou doen, zou ik waarschijnlijk meer aandacht geven aan Feeds. Dit artikel gaat zodoende vooral over Migrate en bijbehorende modules.

Migrate & kornuiten

De migrate-module biedt een framework voor migraties. Diverse submodules borduren daar op voort, zoals:

Voor sommige taken die door de migrate_d2d-module worden verzorgd, hoef je waarschijnlijk geen php-taakbestanden aan te passen. Voor de overige werkzaamheden wel, en dat is steeds hetzelfde soort werk. Deze modules worden daarom niet allemaal los behandeld.

Migratie gebruikersaccounts: migrate_d2d

migrate_d2d werkt super als het om migratie van accounts gaat. Samenwerking met Migrate en CMU zal geen probleem zijn: Deze laatste suggereert zelfs om accounts eerst te migreren met migrate_d2d voordat je met CMU aan de slag gaat.

Migratie producttypes: CMU

Zie Commerce Migrate Übercart-module#Taak CommerceMigrateUbercartProductProduct.

Migratie productnodes: CMU

Zie Commerce Migrate Übercart-module#Taak CommerceMigrateUbercartNodeProduct.

Migratie productafbeeldingen: CMU

De enige goede manier die ik ken om bestanden te migreren: Met behulp van de CMU-module, waarbij bestanden worden gemigreerd als onderdeel van producten.

Alternatieven:

  • Migreren zonder bestanden. Naderhand mbv. Feeds de productnodes uitbreiden met afbeeldingen. Feeds werkt namelijk écht heel gemakkelijk
  • Je kunt bestanden heel gemakkelijk migreren met behulp van de migrate_d2d-module. Echter: Producten zijn dan niet geassociëerd met producten. Zie verder Migrate d2d-module (Drupal)#Migratie bestanden
  • Handmatig bestanden migreren is voor mij zelfs nog gemakkelijker. Nadeel: Dan weet ik niet of er bestanden tussenzitten die niet meer gebruikt worden. Op die manier sleep ik steeds meer onbekende bestanden van installatie naar installatie.

Migratie customer profiles: CMU

Adresgegevens (billing address en/of shipping address) worden in Übercart in het orderkopje bijgehouden, en in Drupal Commerce in een aparte tabel. Deze gegevens moeten gemigreerd worden, voordat orders gemigreerd worden.

Zie Commerce Migrate Übercart-module#Customer billing profiles voor details.

Migratie taxonomieën: migrate_d2d

  • Migreren van taxonomieën gaat perfect mbv. de migrate_d2d-module. Vantevoren moet je uiteraard wel een taxonomie defineren op de doellocatie
  • Wat deze module echter niet doet, is het migreren van de associatie tussen nodes en taxons -- Zie verderop.

Migratie associatie producten met taxons

  • Taxonomieën kun je prima migreren met migrate_d2d, maar hoe migreer je de associatie tussen producten en taxons?
  • Vermoedelijk kan dit vrij eenvoudig mbv. Migrate, omdat je mbv. sourceMigration relaties kunt migreren, ook als de onderliggende sleutels door de migratie zijn veranderd. Wellicht vergt dit slechts een kleine aanpassing aan bestaande code van bv. migrate_d2d.

Datamodel - Drupal 6

Zoals hier wordt uitgelegd, wordt de relatie tussen nodes en taxons bijgehouden in Drupal 6 in de tabel term_node:

term_node (nid, tid, vid):

* nid = Node ID
* tid = Term ID
* vid = Version ID

Datamodel - Drupal 7

De associatie tussen node en taxon is in Drupal 7 vergelijkbaar met de situatie in Drupal 6:

taxonomy_index (nid, tid, sticky, created):

* nid = Node ID
* tid = Term ID


migrate_d2d

CMU-issue Bring Ubercart Taxonomy/Catalog into Commerce] bevat alle benodigde code voor een opzichzelfstaande oplossing. Het maakt gebruik van migrate, en sourceMigration → Incorporeren in bestaande migrate_d2d-code.

  • Waarschijnlijk heb je maar één SourceMigration-toevoeging nodig: De verwijzing naar nodes. Je kunt de taxonomie dus pas migreren nadat de nodes zijn gemigreerd.

Zie ook

Bronnen

Migratie Übercart naar Drupal Commerce - Algemeen

Migratie Übercart naar Drupal Commerce - Mbv. Feeds

Overig

Product reference mapping

Image field mapping

Migratie associatie nodes & taxons