Inhoud en gebruikers migreren van een Wordpress, Joomla, ... Drupal 7 site naar een Drupal 8 site. De eenvoudige manier...

Moeilijkheidsgraad

Je kunt via programmeren een site van een andere CMS of Drupal versie overzetten naar Drupal 8. Voor velen is dit echter een stap te ver. Ik deel graag mijn ervaring bij het overzetten van een Drupal 7 naar een Drupal 8 site waarbij ik niet geprogrammeerd heb. (Deze werkwijze is van toepassing op elke CMS aangezien elke CMS een exportmogelijkheid van inhoud heeft)

Ik veronderstel wel dat je op de nieuwe site een inhoudstype klaar hebt om de inhoud te ontvangen. Dit is handwerk, maar het verplicht je om ook de nieuwe Drupal 8 mogelijkheden optimaal te benutten. Via Features kan je ook inhoudstypen overzetten, maar de verschillende versies zijn niet compatibel met elkaar. Ik veronderstel ook dat je een nieuwe structuur en thema gebruikt. Deze handleiding behandelt enkel het overzetten van inhoud.

Principe:

  1. exporteer de gegevens van de oude site naar een CSV bestand.
  2. stel Feeds en Feeds Tamper in op de meest doeltreffende manier.
  3. importeer in de nieuwe site.

Eerst maak je in je Drupal 7 een export view aan. Je kunt hiervoor gebruik maken van 'data export', maar je kunt ook de view in tabelvorm maken en plakken in een Excel file... Ik heb verschillende types van velden gebruikt. (tekst, taxonomie, boolean, bestanden, afbeeldingen, video, email, data, links,...)

Afbeeldingen moet je via een image URL weergeven, anders krijg je afbeeldingen in je Excel file waar je niets mee bent.. Daar is een module voor (ook in Drupal 7): https://www.drupal.org/project/image_url_formatter . Als je de formatter eerst 'Afbeelding' had gezet en je had dan ook een afbeeldingsstijl gekozen.. dan geeft hij de link naar de afbeelding horend bij deze afbeeldingsstijl. Eigenaardig, maar goed om weten... Neem de originele afbeelding tenzij je anders wenst natuurlijk...

Voor bestanden kies je deze formatter

voor boolean velden (Ja/neen)

Voor video velden

Het komt er dus op neer dat alles wat bestanden en links bevat als link moet worden geëxporteerd... (liefst absolute link)

Je krijgt dan een Excel file met alle velden die je gekozen hebt.

Nu moet je wel eens kijken of je niet de celeigenschappen moet wijzigen. Zo zie je dat sommige telefoonnummers al wiskundige cijfers worden voorgesteld. (E+11)

Stel de eigenschappen als getal in

Geslaagd..

Ook de boolean velden met Yes/No of 0,1 moeten aangepast worden. Op dit ogenblik doet de import het niet goed. Alles wordt als Yes aanzien, ook de No! Geen probleem. Doe alle Nee's weg. Geen info bij de import wordt dan als Neen aanzien.

Doe ook de hyperlinks weg bij mail en website velden.

Als je ook de aanmaakdatum (publicatie- , wijzigingsdatum,.. ) van de node ook wilt invoeren dan moet je het datumveld dat je daarvoor gebruikt in 'primitieve notatie' zetten. De uren:minuten:seconden moeten ingevuld worden.

Nu is het tijd om als CSV op te slaan.

Je ziet nu het CSV bestand en het scheidingsteken dat gebruikt wordt. (hier punt-komma)

Nu maken we onze Feeds en Tamper klaar voor import. Zie bespreking van Feeds en Tamper op deze site.

Ik kies om het bestand op te laden.

Bij de 'mapping' stel je alle nodige velden in.

Bij de afbeeldingen is er iets speciaals..Ik gebruik hier UUID. De afbeelding wordt dan bij de import van de URL rechtstreeks geladen en in de map gezet die je in je nieuw veld hebt ingesteld. Geen download van de afbeelding is dus nog nodig. Deze import gebeurt trouwens aan een ongelooflijke snelheid. Veel sneller dan met een FTP programma. Magic!

Deze werkwijze kan je ook gebruiken bij bestanden.. De pdf's, docx, ... worden gewoon van de ene site naar de andere overgezet.

Met Tamper moet je bij meervoudige velden de scheiding instellen. Bij mij is dit een komma gevolgd door een spatie. Je stelt dit op deze manier in

Ik kreeg geen video veld te zien van het type Vide Embed (voor youtube en vimeo)

Op het net staat er beschreven hoe je dit oplost. In onderstaand bestand moet je de regel "video_embed_field" moet toevoegen.

Opgelost.

Je moet deze instelling per inhoudstype doen. Als er weinig inhoud is.. kopiëren en plakken bestaat ook nog hé...

Voor de rest is het genieten.. Ik importeer honderden nodes...

 

Elke node heeft zijn geïmporteerde velden die je op de gepaste manier weergeeft.



Importeren van gebruikers

Weer met Feeds kan je gebruikers, hun mailadressen, rollen, ... importeren. Hun paswoorden niet. Dit is standaard niet voorzien om veiligheidsredenen.

Je kan de volgende items toevoegen. Maak bij de export van je gebruikers op de bronsite dat je de nodige kolommen aanmaakt. Je kunt dit doen door een view te maken met de gebruikers en de nodige velden toe te voegen. Kopiëren en plakken in Excel => CSV.

 


Een gans ander verhaal wordt het als je ook de paswoorden van de gebruikers wilt importeren. Normaal gezien worden de gebruikers verwacht om een nieuw paswoord aan te vragen. Logisch, maar als je honderden gebruikers hebt en je wilt de overgang van Drupal 7 => Drupal 8 zo onopgemerkt mogelijk houden...dan omt er wat php aan te pas.

Eerst ga je in de database van de bronsite een export doen van de gegevens. In Drupal 7 zit dit in de tabel 'users'. Hou naam en paswoord over in je CSV bestand. De paswoorden zijn gecodeerd. (hash). Het goede nieuws is dat deze gecodeerde paswoorden ook in een nadere versie bruikbaar zijn!

Maak nu een php pagina aan in je doelsite (Drupal8) en gebruik bvb deze script.

We gaan voor elke gebruiker, die we reeds hebben geïmporteerd nu ook het paswoord koppelen. (Dit staat op dit ogenblik niet ingevuld.) In Drupal 8 is de structuur gewijzigd. De tabel die de paswoorden nu bevat is users_field_data in plaats van users. Na het runnen van deze script kan je de oorspronkelijke paswoorden (zonder hash) gebruiken zoals voorheen.

Ik doe hier voor elke gebruiker telkens weer een nieuwe import van mijn csv file. Voor grote hoeveelheden gebruikers is het beter om eenmaal de import te doen en de gegevens te stockeren in variabelen. De lus wordt dan een lus met de variabelen.

<?php

 $value=0;

// vul je eigen gegevens in

$conn = mysqli_connect("localhost","gebruiker","paswoord","database");

if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$sql = "SELECT * FROM users_field_data";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
    
  while($row = mysqli_fetch_assoc($result)) {  
    

//begin lus in lus

// wijzig dit naar het pd van je bestand op de server

if (($handle = fopen("https://test16.cursistendrupal8.be/temp/userexport.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 2000, ";")) !== FALSE) {
      
if ($data[0] == $row["name"]){
  

$sql2 = "UPDATE users_field_data SET pass='$data[1]' WHERE name='$data[0]'";

if ($conn->query($sql2) === TRUE) {
    echo "Record updated successfully";
} else {
    echo "Error updating record: " . $conn->error;
}

}
}

 }
 }

mysqli_close($conn);

    fclose($handle);
}
?>