📦 CatalogueIntermédiaire PS 1.6 PS 1.7 PS 8.x

Simplifier la création de produits PrestaShop : 4 approches comparées

Découvrez 4 méthodes pour simplifier la création de produits dans PrestaShop 8 : import CSV, module custom, formulaire front-office et outils tiers.

En bref : Quatre approches pour simplifier la création de produits PrestaShop : import CSV natif (le plus rapide pour les lots), outils tiers comme Store Commander (gestion tableur en temps réel), module back-office custom (formulaire simplifié), ou formulaire front-office avec validation (idéal pour les marketplaces). Le choix dépend du volume et du profil utilisateur.

Publié le 21 mars 2026 8 min de lecture Alexandre Carette

Le problème : un back-office trop complexe pour vos clients

Le formulaire de création de produit de PrestaShop est un monstre. Entre les dizaines d'onglets, les champs techniques incompréhensibles pour un non-développeur et les options rarement utilisées, beaucoup de marchands se retrouvent paralysés devant leur back-office.

C'est un problème récurrent que je rencontre depuis mes débuts sur PrestaShop en 2014. Un client qui n'arrive pas à ajouter ses produits efficacement, c'est un client qui perd du temps — et donc de l'argent.

Voici les quatre approches que je recommande, classées de la plus simple à la plus technique.

Approche 1 : L'import CSV — le couteau suisse sous-estimé

Pourquoi c'est souvent la meilleure solution

Avant de coder quoi que ce soit, posez-vous la question : est-ce qu'un simple fichier Excel ne suffirait pas ?

L'outil d'import natif de PrestaShop est puissant et souvent sous-exploité. Votre client travaille déjà avec Excel au quotidien, alors pourquoi ne pas capitaliser sur cette compétence ?

Mise en place concrète

Créez un fichier CSV avec les colonnes essentielles :


name;reference;price;description_short;quantity;image;category
"Mon produit";"REF-001";29.99;"Description courte";100;"https://monsite.com/img/produit1.jpg";"Ma catégorie"

Astuce clé : la colonne image accepte des URL distantes. Vous pouvez donc stocker vos images sur un serveur externe ou un service cloud, et PrestaShop les téléchargera automatiquement lors de l'import.

Chemin dans PrestaShop 8.x

Rendez-vous dans Paramètres avancés → Import puis sélectionnez le type d'entité "Produits".

Sur PrestaShop 8, l'interface d'import a été modernisée avec Symfony, mais le principe reste identique aux versions 1.6/1.7. Le mapping des colonnes est plus intuitif et la gestion des erreurs plus explicite.

Limites de l'import CSV

  • Pas d'interaction temps réel (processus batch)
  • Gestion des déclinaisons complexe en CSV
  • Risque d'écrasement si le mapping est mal configuré
  • Pas adapté à la création unitaire fréquente

Approche 2 : Un outil tiers comme Store Commander

Pour les marchands qui gèrent un catalogue volumineux, des outils comme Store Commander offrent une interface de type tableur directement connectée à la base de données PrestaShop.

L'avantage est considérable : vous manipulez vos produits comme dans Excel, mais avec la synchronisation en temps réel.

Ce que ces outils apportent

  • Édition en masse (prix, stocks, descriptions)
  • Copier-coller depuis Excel
  • Gestion visuelle des déclinaisons
  • Historique des modifications

Points de vigilance

  • Certains outils accèdent directement à la base de données, contournant les hooks PrestaShop — vos modules tiers pourraient ne pas être notifiés des changements
  • Vérifiez la compatibilité avec votre version exacte de PrestaShop
  • Faites toujours une sauvegarde avant une édition en masse

Approche 3 : Module de création produit simplifié (back-office)

Quand l'import CSV ne suffit pas et que le back-office natif est trop complexe, la solution intermédiaire consiste à développer un module PrestaShop dédié.

Architecture du module

L'idée est de créer un formulaire simplifié qui n'expose que les champs dont votre client a réellement besoin.


<?php
// modules/monmodule/controllers/admin/AdminSimpleProductController.php

class AdminSimpleProductController extends ModuleAdminController
{
    public function __construct()
    {
        $this->bootstrap = true;
        $this->table = 'product';
        $this->className = 'Product';
        parent::__construct();
    }

    public function renderForm()
    {
        $this->fields_form = [
            'legend' => [
                'title' => $this->l('Création rapide de produit'),
            ],
            'input' => [
                [
                    'type' => 'text',
                    'label' => $this->l('Nom du produit'),
                    'name' => 'name',
                    'lang' => true,
                    'required' => true,
                ],
                [
                    'type' => 'text',
                    'label' => $this->l('Référence'),
                    'name' => 'reference',
                ],
                [
                    'type' => 'text',
                    'label' => $this->l('Prix HT'),
                    'name' => 'price',
                    'suffix' => '€',
                ],
                [
                    'type' => 'textarea',
                    'label' => $this->l('Description courte'),
                    'name' => 'description_short',
                    'lang' => true,
                    'autoload_rte' => true,
                ],
                [
                    'type' => 'text',
                    'label' => $this->l('Quantité en stock'),
                    'name' => 'quantity',
                ],
            ],
            'submit' => [
                'title' => $this->l('Créer le produit'),
            ],
        ];

        return parent::renderForm();
    }

    public function postProcess()
    {
        if (Tools::isSubmit('submitProduct')) {
            $product = new Product();
            
            foreach (Language::getLanguages(true) as $lang) {
                $idLang = (int) $lang['id_lang'];
                $product->name[$idLang] = Tools::getValue('name_' . $idLang);
                $product->description_short[$idLang] = Tools::getValue('description_short_' . $idLang);
                $product->link_rewrite[$idLang] = Tools::str2url(
                    Tools::getValue('name_' . $idLang)
                );
            }

            $product->reference = Tools::getValue('reference');
            $product->price = (float) Tools::getValue('price');
            $product->id_tax_rules_group = (int) Configuration::get('PS_DEFAULT_TAX_RULES_GROUP');
            $product->id_category_default = (int) Configuration::get('PS_HOME_CATEGORY');
            $product->active = 0; // Inactif par défaut, validation manuelle
            $product->visibility = 'both';
            $product->available_for_order = 1;
            $product->show_price = 1;

            if ($product->add()) {
                // Mise à jour du stock
                StockAvailable::setQuantity(
                    (int) $product->id,
                    0,
                    (int) Tools::getValue('quantity')
                );

                // Association catégorie
                $product->addToCategories([
                    (int) Configuration::get('PS_HOME_CATEGORY')
                ]);

                $this->confirmations[] = $this->l('Produit créé avec succès (ID: ')
                    . $product->id . ')';
            } else {
                $this->errors[] = $this->l('Erreur lors de la création du produit.');
            }
        }
    }
}

Points techniques importants

Gestion du stock : Depuis PrestaShop 1.7, le stock est géré via StockAvailable et non plus directement dans l'objet Product. N'oubliez pas d'appeler StockAvailable::setQuantity() après la création.

Réécriture d'URL : Le champ link_rewrite est obligatoire. Utilisez Tools::str2url() pour générer automatiquement un slug propre à partir du nom du produit.

Statut par défaut : Créez les produits en statut inactif (active = 0) pour permettre une validation avant publication. C'est une bonne pratique qui évite les fiches produit incomplètes en front-office.

Adaptation pour PrestaShop 8.x

Sur PrestaShop 8, le formulaire produit natif utilise Symfony Forms. Si vous souhaitez une intégration plus poussée, vous pouvez étendre le ProductFormBuilder via les hooks Symfony :


// Déclaration du hook dans votre module
public function hookActionProductFormBuilderModifier(array $params): void
{
    /** @var FormBuilderInterface $formBuilder */
    $formBuilder = $params['form_builder'];
    
    // Masquer les champs non nécessaires
    // ou ajouter vos champs simplifiés
}

Cette approche est plus propre sur PrestaShop 8 car elle s'intègre au système de formulaires existant plutôt que de le contourner.

Approche 4 : Formulaire de création depuis le front-office

C'est l'approche la plus avancée : permettre à un utilisateur connecté de soumettre un produit directement depuis le front-office, avec une étape de validation en back-office avant publication.

Architecture recommandée


modules/
└── ac_frontproduct/
    ├── ac_frontproduct.php          # Module principal + hooks
    ├── controllers/
    │   └── front/
    │       └── submit.php           # Formulaire front-office
    ├── controllers/
    │   └── admin/
    │       └── AdminPendingProducts.php  # Validation BO
    ├── views/
    │   └── templates/
    │       └── front/
    │           └── submit.tpl       # Template Smarty
    └── sql/
        └── install.sql              # Table temporaire

Le flux de données

  1. L'utilisateur remplit un formulaire simplifié en front-office
  2. Les données sont stockées dans une **table temporaire** (pas directement dans `ps_product`)
  3. Un administrateur valide en back-office
  4. À la validation, le produit est créé via l'ObjectModel `Product`
  5. Table temporaire

    
    CREATE TABLE IF NOT EXISTS `PREFIX_ac_pending_product` (
        `id_pending_product` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        `id_customer` INT(11) UNSIGNED NOT NULL,
        `name` VARCHAR(255) NOT NULL,
        `reference` VARCHAR(64) DEFAULT NULL,
        `price` DECIMAL(20,6) NOT NULL DEFAULT 0.000000,
        `description_short` TEXT,
        `description` TEXT,
        `quantity` INT(11) NOT NULL DEFAULT 0,
        `status` ENUM('pending','approved','rejected') NOT NULL DEFAULT 'pending',
        `date_add` DATETIME NOT NULL,
        `date_upd` DATETIME NOT NULL,
        PRIMARY KEY (`id_pending_product`),
        KEY `id_customer` (`id_customer`),
        KEY `status` (`status`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    

    Sécurité — points critiques

    • **Validation des données** : filtrez systématiquement chaque champ avec `pSQL()`, `(int)`, `(float)` avant insertion
    • **Token CSRF** : utilisez le token natif PrestaShop dans votre formulaire
    • **Upload d'images** : vérifiez le type MIME réel (pas seulement l'extension), limitez la taille, et stockez dans un répertoire temporaire hors du webroot
    • **Droits d'accès** : vérifiez que le client est connecté et a le droit de soumettre des produits
    
    // Validation CSRF dans le controller front
    if (!$this->isTokenValid()) {
        Tools::redirect('index.php?controller=authentication');
    }
    
    // Nettoyage des entrées
    $name = pSQL(Tools::getValue('product_name'));
    $price = (float) Tools::getValue('product_price');
    $quantity = (int) Tools::getValue('product_quantity');
    $description = pSQL(Tools::getValue('product_description'), true); // true = HTML autorisé
    

    Quelle approche choisir ?

    CritèreImport CSVOutil tiersModule BOFormulaire Front **Complexité**FaibleFaibleMoyenneÉlevée **Coût**Gratuit50-300 €Sur mesureSur mesure **Adapté aux non-techs**MoyenOuiOuiOui **Création unitaire**NonOuiOuiOui **Création en masse**OuiOuiNonNon **Cas d'usage typique**Migration, mise à jour catalogueGestion quotidienne gros catalogueClient avec besoins simplesMarketplace, soumission vendeurs

    Bonnes pratiques transversales

    Toujours valider avant publication

    Quelle que soit l'approche choisie, ne publiez jamais un produit directement en front-office. Prévoyez systématiquement une étape de validation, même si elle est automatique (vérification que les champs obligatoires sont remplis, qu'au moins une image est présente, que le prix est cohérent).

    Sauvegarder avant toute manipulation en masse

    Avant un import CSV massif ou une édition groupée via un outil tiers, exportez votre catalogue existant. Un mauvais mapping de colonnes peut écraser des centaines de fiches produit en quelques secondes.

    Tester sur un environnement de préprod

    C'est d'autant plus vrai pour les modules custom qui insèrent directement en base de données. Une erreur dans la création d'un ObjectModel peut corrompre les relations entre tables (produit-catégorie, produit-attribut, stock).

    Penser multilingue dès le départ

    Même si votre boutique est monolingue aujourd'hui, structurez vos formulaires et imports pour gérer plusieurs langues. Les champs name, description, description_short et link_rewrite sont tous multilingues dans PrestaShop — un refactoring ultérieur serait coûteux.

#création produit #import CSV #AdminProductController #module PrestaShop #back-office #catalogue #productivité

Questions fréquentes

Tout ce que vous devez savoir sur ce sujet.

Un projet PrestaShop ?

Discutons-en directement.

★★★★★

193 projets livrés

Gratuit & sans engagement — réponse sous 24h

Alexandre Carette

Alexandre Carette

Expert PrestaShop & Architecture E-commerce

Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.