Sommaire
Vue d'ensemble des outils disponibles
Plusieurs solutions existent pour migrer vos données de PrestaShop vers Sylius. Chacune répond à des besoins différents et nous allons les voir en détail.
1. Plugin Jgrasp Sylius PrestaShop Migration
Le plugin jgrasp est un outil open source disponible sur Packagist. Il permet de migrer automatiquement les principales entités PrestaShop vers Sylius via des commandes console.
Version actuelle : 0.5.2 Licence : MIT Compatibilité : PHP 8.0+, Sylius 1.10+
2. BitBag PrestaShop Sylius Migrator
BitBag a développé un outil propriétaire de migration, utilisé pour leurs projets clients. Cet outil couvre les trois domaines principaux : commandes, clients et catalogue produits.
L'outil BitBag inclut :
- Exportation par lots en arrière-plan depuis PrestaShop
- Test d'importation pour détecter les conflits
- Importation finale vers Sylius
- Détection des doublons (numéros de commande, SKU, emails clients)
3. FriendsOfSylius Import Export Plugin
Le plugin FriendsOfSylius permet d'importer et exporter des données via CSV. Utile pour des migrations partielles ou des imports complémentaires.
Prérequis techniques
Avant de commencer la migration, assurez-vous de disposer de :
Infrastructure
- [ ] Environnement Sylius installé et fonctionnel (version 1.10 minimum)
- [ ] Accès complet à la base de données PrestaShop
- [ ] Espace disque suffisant (2 à 3 fois la taille des données PrestaShop)
- [ ] PHP 8.0 ou supérieur
- [ ] Composer installé
Sauvegardes complètes
- [ ] Backup complet de la base de données PrestaShop (mysqldump)
- [ ] Sauvegarde du répertoire
/img(images produits) - [ ] Sauvegarde des fichiers téléchargeables (
/download) - [ ] Export des configurations personnalisées
Accès et permissions
- [ ] Accès SSH au serveur
- [ ] Droits d'écriture dans le répertoire Sylius
- [ ] Connexion réseau entre les deux bases de données
Méthode 1 : migration avec le plugin Jgrasp (la recommandation ACSEO)
Cette méthode utilise l'outil open source le plus complet disponible pour la migration PrestaShop vers Sylius. Voici les différentes étapes à suivre.
Étape 1 : installation du plugin
Installez le plugin via Composer dans votre projet Sylius :
composer require jgrasp/sylius-prestashop-migration-plugin
Étape 2 : activation du bundle
Ajoutez le plugin dans config/bundles.php :
<?php
return [
// ... autres bundles
Jgrasp\PrestashopMigrationPlugin\PrestashopMigrationPlugin::class => ['all' => true],
];
Étape 3 : configuration de la connexion PrestaShop
Créez ou modifiez le fichier .env.local pour ajouter la connexion à votre base PrestaShop :
# .env.local
PRESTASHOP_DATABASE_URL="mysql://user:password@host:3306/prestashop_db"
Paramètres :
user: utilisateur MySQL PrestaShoppassword: mot de passe MySQLhost: hôte de la base de données (localhost ou IP serveur)prestashop_db: nom de la base de données PrestaShop
Étape 4 : configuration Doctrine DBAL
Ajoutez une connexion nommée dans config/packages/doctrine.yaml :
# config/packages/doctrine.yaml
doctrine:
dbal:
default_connection: default
connections:
default:
url: '%env(resolve:DATABASE_URL)%'
prestashop:
url: '%env(resolve:PRESTASHOP_DATABASE_URL)%'
Étape 5 : configuration du plugin
Créez le fichier de configuration config/packages/prestashop_migration.yaml :
# config/packages/prestashop_migration.yaml
prestashop_migration:
public_dir: '%kernel.project_dir%/public'
connection: 'prestashop'
product_image_url: 'https://votre-ancien-site.com/img/p/'
Paramètres :
public_dir: répertoire public de Sylius où seront copiées les imagesconnection: nom de la connexion Doctrine configurée à l'étape précédenteproduct_image_url: URL complète du répertoire images PrestaShop
Étape 6 : adaptation des entités
Le plugin nécessite que votre entité ProductVariant implémente une interface spécifique.
Modifiez src/Entity/Product/ProductVariant.php :
<?php
declare(strict_types=1);
namespace App\Entity\Product;
use Doctrine\ORM\Mapping as ORM;
use Jgrasp\PrestashopMigrationPlugin\Entity\Product\ProductVariantInterface;
use Sylius\Component\Core\Model\ProductVariant as BaseProductVariant;
#[ORM\Entity]
#[ORM\Table(name: 'sylius_product_variant')]
class ProductVariant extends BaseProductVariant implements ProductVariantInterface
{
// Le plugin ajoutera automatiquement les propriétés nécessaires
}
Générez la migration pour mettre à jour le schéma :
bin/console doctrine:migrations:diff
bin/console doctrine:migrations:migrate
Étape 7 : exécution de la migration
Le plugin propose plusieurs commandes de migration. Vous pouvez migrer chaque type de données séparément ou tout migrer d'un coup.
Commandes disponibles
# Voir toutes les commandes disponibles
bin/console list prestashop:migration
Liste des commandes :
| Commande | Description |
|---|---|
prestashop:migration:locale | Migre les langues |
prestashop:migration:currency | Migre les devises |
prestashop:migration:country | Migre les pays |
prestashop:migration:channel | Migre les boutiques (channels) |
prestashop:migration:address | Migre les adresses |
prestashop:migration:customer | Migre les clients |
prestashop:migration:admin_user | Migre les administrateurs |
prestashop:migration:product | Migre les produits et variantes |
prestashop:migration:product:images | Migre les images produits |
prestashop:migration:all | Migre toutes les entités dans l'ordre |
Ordre d'exécution recommandé
L'ordre d'exécution est important car certaines entités dépendent d'autres. Voici l'ordre recommandé :
# 1. Configuration de base
bin/console prestashop:migration:locale
bin/console prestashop:migration:currency
bin/console prestashop:migration:country
bin/console prestashop:migration:channel
# 2. Clients et adresses
bin/console prestashop:migration:customer
bin/console prestashop:migration:address
# 3. Catalogue produits
bin/console prestashop:migration:product
bin/console prestashop:migration:product:images
# 4. Administrateurs (optionnel)
bin/console prestashop:migration:admin_user
Migration complète automatique
Pour migrer toutes les données en une seule commande :
bin/console prestashop:migration:all
ATTENTION : Cette commande supprime et recrée complètement la base de données Sylius. Ne jamais utiliser sur un environnement de production.
Étape 8 : vérification post-migration
Après l'exécution des commandes, vérifiez que les données ont été migrées correctement :
# Vérifier le nombre de produits
bin/console sylius:debug:resource product
# Vérifier le nombre de clients
bin/console sylius:debug:resource customer
# Lister les channels
bin/console sylius:debug:channel
Accédez également au back-office Sylius pour vérifier visuellement :
- Les produits avec leurs variantes
- Les images associées
- Les catégories
- Les clients
Étape 9 : migration des images
La migration des images produits nécessite une étape spécifique :
bin/console prestashop:migration:product:images
Cette commande :
- Télécharge les images depuis
product_image_urlconfiguré - Les copie dans le répertoire
/public/media/imagede Sylius - Associe chaque image au produit correspondant
Temps estimé : Variable selon le nombre et la taille des images (peut prendre plusieurs heures pour de gros catalogues).
Méthode 2 : migration manuelle via export/import CSV
Pour des migrations partielles ou si vous souhaitez plus de contrôle, utilisez une approche CSV. Voici les différentes étapes à suivre :
Étape 1 : export depuis PrestaShop
PrestaShop propose une fonctionnalité d'export native dans le back-office.
Pour exporter les produits :
- Connectez-vous au back-office PrestaShop
- Allez dans Catalogue > Produits
- Cliquez sur Exporter (icône en haut à droite)
- Téléchargez le fichier CSV
Pour exporter les clients :
- Allez dans Clients > Clients
- Cliquez sur Exporter
- Téléchargez le fichier CSV
Vous pouvez également exporter directement depuis la base de données :
-- Export des produits actifs
SELECT
p.id_product,
p.reference,
pl.name,
pl.description,
p.price,
p.wholesale_price,
p.active,
ps.quantity
FROM ps_product p
LEFT JOIN ps_product_lang pl ON p.id_product = pl.id_product
LEFT JOIN ps_stock_available ps ON p.id_product = ps.id_product
WHERE pl.id_lang = 1
INTO OUTFILE '/tmp/products.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Étape 2 : installation du plugin FriendsOfSylius ImportExport
composer require friendsofsylius/sylius-import-export-plugin
Activez le bundle dans config/bundles.php :
FriendsOfSylius\SyliusImportExportPlugin\FOSSyliusImportExportPlugin::class => ['all' => true],
Étape 3 : transformation du format CSV
Le CSV PrestaShop ne correspond pas exactement au format attendu par Sylius. Vous devez transformer les données.
Mapping des colonnes produits :
| PrestaShop | Sylius | Transformation |
|---|---|---|
id_product | code | Préfixer : PROD_ + id |
reference | variant.code | Utiliser tel quel |
name | translations[locale].name | Par langue |
description | translations[locale].description | Par langue |
price | channelPricings[channel].price | Convertir en centimes |
active | enabled | 1 = true, 0 = false |
quantity | variant.onHand | Utiliser tel quel |
Exemple de CSV Sylius attendu :
code,enabled,name,description,price,stock
TSHIRT-001,1,"T-Shirt Rouge","Description du t-shirt",1999,50
TSHIRT-002,1,"T-Shirt Bleu","Description du t-shirt",1999,30
Étape 4 : import dans Sylius
Le plugin FriendsOfSylius permet d'importer via l'interface d'administration ou en ligne de commande.
Via l'interface :
- Connectez-vous au back-office Sylius
- Allez dans Configuration > Import
- Sélectionnez le type de ressource (Product, Customer, etc.)
- Uploadez votre fichier CSV
- Lancez l'import
Via la ligne de commande :
bin/console sylius:import product your-products.csv
Méthode 3 : scripts SQL personnalisés
Pour des migrations très spécifiques ou des volumétries importantes, des scripts SQL directs peuvent être nécessaires. Voici les différentes étapes de mise en place.
Étape 1 : analyse du schéma PrestaShop
Identifiez les tables principales à migrer :
Tables produits :
ps_product: informations produitps_product_lang: traductionsps_product_attribute: combinaisons (variantes)ps_stock_available: stocksps_image: imagesps_category_product: associations catégories
Tables clients :
ps_customer: comptes clientsps_address: adressesps_orders: commandes
Tables catégories :
ps_category: catégoriesps_category_lang: traductions catégories
Étape 2 : analyse du schéma Sylius
Identifiez les tables cibles dans Sylius :
Tables produits :
sylius_product: produitssylius_product_translation: traductionssylius_product_variant: variantessylius_channel_pricing: prix par canalsylius_product_image: imagessylius_product_taxon: associations catégories
Tables clients :
sylius_customer: clientssylius_shop_user: comptes utilisateurssylius_address: adressessylius_order: commandes
Tables taxonomies (catégories) :
sylius_taxon: catégoriessylius_taxon_translation: traductions
Étape 3 : script de migration produits
Exemple de script SQL pour migrer les produits simples (sans variantes) :
-- Migration des produits dans sylius_product
INSERT INTO sylius_product (code, created_at, updated_at)
SELECT
CONCAT('PROD_', p.id_product) as code,
p.date_add as created_at,
p.date_upd as updated_at
FROM ps_product p
WHERE p.active = 1;
-- Migration des traductions produits
INSERT INTO sylius_product_translation (translatable_id, name, slug, description, locale)
SELECT
sp.id,
pl.name,
LOWER(REPLACE(pl.link_rewrite, '-', '_')) as slug,
pl.description,
CASE pl.id_lang
WHEN 1 THEN 'fr_FR'
WHEN 2 THEN 'en_US'
END as locale
FROM ps_product p
INNER JOIN sylius_product sp ON sp.code = CONCAT('PROD_', p.id_product)
INNER JOIN ps_product_lang pl ON p.id_product = pl.id_product
WHERE p.active = 1;
-- Migration des variantes (une variante par défaut pour les produits simples)
INSERT INTO sylius_product_variant (product_id, code, on_hand, created_at, updated_at)
SELECT
sp.id,
CONCAT('VAR_', p.id_product),
COALESCE(ps.quantity, 0) as on_hand,
p.date_add,
p.date_upd
FROM ps_product p
INNER JOIN sylius_product sp ON sp.code = CONCAT('PROD_', p.id_product)
LEFT JOIN ps_stock_available ps ON p.id_product = ps.id_product
WHERE p.active = 1;
-- Migration des prix (en supposant un channel par défaut avec id=1)
INSERT INTO sylius_channel_pricing (product_variant_id, channel_code, price, original_price)
SELECT
spv.id,
'default',
ROUND(p.price * 100) as price, -- Conversion en centimes
NULL as original_price
FROM ps_product p
INNER JOIN sylius_product sp ON sp.code = CONCAT('PROD_', p.id_product)
INNER JOIN sylius_product_variant spv ON spv.product_id = sp.id
WHERE p.active = 1;
Attention : Ces scripts sont des exemples. Vous devrez les adapter selon :
- La version de PrestaShop (les tables peuvent varier)
- La configuration de Sylius (channels, locales)
- Vos besoins spécifiques (attributs personnalisés, etc.)
Étape 4 : script de migration clients
-- Migration des clients
INSERT INTO sylius_customer (email, email_canonical, first_name, last_name, gender, created_at, updated_at)
SELECT
c.email,
LOWER(c.email) as email_canonical,
c.firstname,
c.lastname,
CASE c.id_gender
WHEN 1 THEN 'm'
WHEN 2 THEN 'f'
ELSE 'u'
END as gender,
c.date_add,
c.date_upd
FROM ps_customer c
WHERE c.active = 1 AND c.deleted = 0;
-- Migration des comptes utilisateurs (shop_user)
INSERT INTO sylius_shop_user (customer_id, username, username_canonical, enabled, password, created_at, updated_at)
SELECT
sc.id,
c.email,
LOWER(c.email),
1,
c.passwd, -- ⚠️ Attention au format de hash
c.date_add,
c.date_upd
FROM ps_customer c
INNER JOIN sylius_customer sc ON sc.email = c.email
WHERE c.active = 1 AND c.deleted = 0;
Important sur les mots de passe : PrestaShop et Sylius n'utilisent pas le même algorithme de hachage. Vous avez deux options :
- Forcer une réinitialisation de mot de passe pour tous les clients
- Développer un encodeur personnalisé compatible avec l'ancien hash PrestaShop
Gestion des cas complexes
Migration des produits avec variantes
PrestaShop utilise le concept de "combinaisons" tandis que Sylius utilise des "variantes" avec des options.
Structure PrestaShop :
Produit : T-Shirt
└─ Combinaisons :
- Taille S, Couleur Rouge
- Taille M, Couleur Rouge
- Taille L, Couleur Bleu
Structure Sylius :
Product : T-Shirt
├─ Options :
│ ├─ Taille (S, M, L)
│ └─ Couleur (Rouge, Bleu)
└─ Variantes :
- Variant 1 : S + Rouge
- Variant 2 : M + Rouge
- Variant 3 : L + Bleu
La migration nécessite :
- Créer les
ProductOption(Taille, Couleur) - Créer les
ProductOptionValue(S, M, L, Rouge, Bleu) - Créer une
ProductVariantpar combinaison - Associer les
ProductOptionValueà chaque variante
Le plugin Jgrasp gère automatiquement cette logique.
Migration des catégories (taxonomies)
PrestaShop utilise des catégories, Sylius utilise des "taxons" (taxonomies).
Correspondance :
ps_category→sylius_taxonps_category_lang→sylius_taxon_translationps_category_product→sylius_product_taxon
Le plugin Jgrasp ne migre pas automatiquement les catégories dans la version actuelle. Vous devrez utiliser un script personnalisé ou une migration manuelle.
Migration des commandes
La migration des commandes historiques est optionnelle mais recommandée pour conserver l'historique client.
Données à migrer :
- Commandes (orders)
- Lignes de commande (order items)
- Adresses de facturation/livraison
- États de commande
- Paiements
- Expéditions
Le plugin Jgrasp ne gère pas actuellement les commandes. BitBag propose cette fonctionnalité dans son outil propriétaire.
Tests et validation
Tests de cohérence des données
Après la migration, vérifiez la cohérence entre PrestaShop et Sylius :
-- Comparer le nombre de produits actifs
-- PrestaShop
SELECT COUNT(*) FROM ps_product WHERE active = 1;
-- Sylius
SELECT COUNT(*) FROM sylius_product WHERE enabled = 1;
-- Comparer le nombre de clients
-- PrestaShop
SELECT COUNT(*) FROM ps_customer WHERE active = 1 AND deleted = 0;
-- Sylius
SELECT COUNT(*) FROM sylius_customer;
Tests fonctionnels
Vérifiez manuellement dans le back-office Sylius :
- [ ] Les produits s'affichent correctement
- [ ] Les images sont présentes
- [ ] Les prix sont corrects (attention conversion centimes)
- [ ] Les stocks correspondent
- [ ] Les clients peuvent se connecter
- [ ] Les catégories sont bien organisées
- [ ] Les traductions fonctionnent
Tests de performance
Comparez les performances avant/après migration :
# Test de charge avec Apache Bench
ab -n 1000 -c 10 https://votre-site-sylius.com/
# Monitoring des requêtes lentes
bin/console debug:doctrine:queries
Gestion des erreurs courantes
Erreur : "Duplicate entry for key 'UNIQ_email'"
Cause : Emails clients en double dans PrestaShop
Solution : Nettoyer les doublons avant migration
-- Identifier les doublons
SELECT email, COUNT(*)
FROM ps_customer
GROUP BY email
HAVING COUNT(*) > 1;
-- Garder uniquement le client le plus récent
DELETE c1 FROM ps_customer c1
INNER JOIN ps_customer c2
WHERE c1.id_customer < c2.id_customer
AND c1.email = c2.email;
Erreur : "Foreign key constraint fails"
Cause : Ordre d'insertion incorrect Solution : Respecter l'ordre de migration recommandé (locales → currencies → countries → channels → products → customers)
Images non migrées
Causes possibles :
- URL
product_image_urlincorrecte - Permissions insuffisantes sur
/public/media - Timeout sur le téléchargement
Solution :
# Vérifier les permissions
chmod -R 775 public/media
# Relancer la migration images avec timeout plus long
php -d max_execution_time=3600 bin/console prestashop:migration:product:images
Caractères spéciaux mal encodés
Cause : Encodage différent entre PrestaShop (latin1) et Sylius (utf8) Solution : Convertir l'encodage de la base PrestaShop avant migration
-- Convertir une table en UTF-8
ALTER TABLE ps_product_lang CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Checklist complète de migration
Préparation (J-7)
- [ ] Backup complet PrestaShop (BDD + fichiers)
- [ ] Installation environnement Sylius de staging
- [ ] Installation plugin de migration
- [ ] Configuration connexion BDD PrestaShop
- [ ] Test de connexion réussi
Migration de test (J-3)
- [ ] Migration locales et devises
- [ ] Migration channels
- [ ] Migration produits (échantillon 100 produits)
- [ ] Migration images
- [ ] Migration clients (échantillon 100 clients)
- [ ] Vérification cohérence données
- [ ] Tests fonctionnels basiques
Migration complète (J-1)
- [ ] Freeze du catalogue PrestaShop (mode maintenance)
- [ ] Export final des données PrestaShop
- [ ] Migration complète vers Sylius staging
- [ ] Vérification exhaustive des données
- [ ] Tests de charge
- [ ] Validation métier
Mise en production (Jour J)
- [ ] Mise en maintenance du site PrestaShop
- [ ] Migration finale des données
- [ ] Configuration DNS vers Sylius
- [ ] Tests post-migration
- [ ] Levée de la maintenance
- [ ] Monitoring renforcé
Estimation des temps de migration
Les temps varient selon les volumétries :
| Volumétrie | Produits | Clients | Temps estimé |
|---|---|---|---|
| Petit | < 1 000 | < 5 000 | 2-4 heures |
| Moyen | 1 000 - 10 000 | 5 000 - 50 000 | 4-8 heures |
| Important | 10 000 - 50 000 | 50 000 - 200 000 | 8-24 heures |
| Très important | > 50 000 | > 200 000 | 24-48 heures |
Facteurs influençant la durée :
- Nombre d'images à migrer
- Complexité des produits (variantes)
- Connexion réseau entre serveurs
- Puissance du serveur
Bonnes pratiques
Avant la migration
- Nettoyer les données PrestaShop
- Supprimer les produits obsolètes
- Dédoublonner les clients
- Archiver les anciennes commandes
- Optimiser les images
- Planifier une fenêtre de maintenance
- Choisir une période de faible activité
- Informer les clients en avance
- Prévoir une marge de sécurité (2x le temps estimé)
- Tester sur un environnement isolé
- Ne jamais tester en production
- Utiliser une copie récente des données
- Valider avec les équipes métier
Pendant la migration
- Surveiller les logs
tail-f var/log/dev.log - Documenter les anomalies
- Noter les erreurs rencontrées
- Conserver les requêtes SQL personnalisées
- Prendre des screenshots
- Valider au fur et à mesure
- Vérifier après chaque étape
- Ne pas attendre la fin pour tester
Après la migration
- Tests de non-régression
- Parcours clients complets
- Commandes de test
- Vérification emails
- Formation des équipes
- Back-office Sylius
- Nouveaux processus
- Outils de gestion
- Monitoring renforcé
- Erreurs 500
- Performance
- Taux de conversion
Conclusion
La migration des données de PrestaShop vers Sylius demande rigueur et méthodologie. L'utilisation du plugin Jgrasp permet d'automatiser 80% du travail pour les données standards. Les 20% restants (catégories, commandes, données spécifiques) nécessitent souvent des développements sur mesure.
Chez ACSEO, on recommande systématiquement une migration en trois phases :
- Phase de test : migration partielle pour valider le process
- Phase de recette : migration complète en staging avec validation métier
- Phase de production : bascule finale avec plan de rollback
Cette approche progressive limite les risques et permet d'ajuster la stratégie en fonction des résultats observés.
Sources et références
- Plugin Jgrasp Sylius PrestaShop Migration
- Documentation GitHub du plugin
- BitBag PrestaShop Sylius Migrator
- FriendsOfSylius ImportExportPlugin
- Sylius Documentation - Resource Layer
- PrestaShop Database Structure
- Sylius Database Schema
- Best Practices for Data Migration Testing
Dans le prochain article de la série "Migration de PrestaShop vers Sylius", nous traiterons de la migration du thème et de l'intégration front-end, en détaillant comment recréer l'expérience utilisateur PrestaShop dans Sylius avec Twig et les bonnes pratiques Symfony.