Lacier
  • Alternance Lacier
    • Gestion des Canvas dans le Panier
    • Chatbot
      • Étapes pour intégrer la suggestion de produit
    • Monitoring
    • Compression Image Excel
    • Inventaire
    • Gravure Laser
    • Cleaner Module
    • Scripts JavaScript Indépendants
      • Croix pour fermer le widget d'avis
      • Section Instagram
      • Section Panier Commander
      • Chatbot
    • Notification de Retard de Commande
    • Gestion des Templates de Mails
    • Relance Devis
    • Image FIlter
    • Affichage des produits
    • Attribute Replacer
Powered by GitBook
On this page
  • Fonctionnalités
  • Structure du Code
  • 1. Méthode getContent()
  • 2. Méthode renderForm()
  • 3. Méthode renderAttributeTable()
  • 4. Méthode replaceAttribute()
  • 5. Méthode deleteUnusedAttribute()
  • 6. Méthode logHistory()
  • 7. Méthode renderHistory()
  • Précautions d'utilisation
  • Exemple d'utilisation
  • Conclusion
  1. Alternance Lacier

Attribute Replacer

Le module Attribute Replacer permet de remplacer facilement un attribut de produit par un autre dans PrestaShop. Il inclut également une option pour supprimer automatiquement l'ancien attribut s'il n'est plus utilisé par aucun produit. C'est un module puissant de gestion en masse, car il affecte tous les produits ayant l'ancien attribut sélectionné.


Fonctionnalités

  1. Remplacement en masse des attributs :

    • Tous les produits contenant l'ancien attribut sont mis à jour avec le nouvel attribut.

    • Cela simplifie les modifications massives sur les produits.

  2. Suppression des attributs inutilisés :

    • Après le remplacement, une option permet de supprimer automatiquement l'ancien attribut si aucun produit ne l'utilise plus.

  3. Affichage des attributs existants :

    • Un tableau clair et détaillé affiche les attributs disponibles, avec leur ID, nom et groupe pour faciliter leur sélection.

  4. Historique des actions :

    • Chaque action réalisée est enregistrée dans un fichier JSON avec les informations suivantes :

      • ID de l'ancien attribut

      • ID du nouvel attribut

      • Option de suppression

      • Date et heure de l'action


Structure du Code

Le module se compose des sections principales suivantes :

1. Méthode getContent()

Cette méthode est appelée pour afficher et gérer l'interface du module dans le back-office. Elle :

  • Récupère les valeurs soumises par le formulaire.

  • Valide les données (ancien attribut différent du nouvel attribut).

  • Appelle la méthode replaceAttribute() pour effectuer le remplacement.

  • Affiche les messages de confirmation ou d'erreur.

  • Génère le formulaire, la liste des attributs et l'historique des actions.

2. Méthode renderForm()

Cette méthode crée le formulaire pour saisir les ID des attributs.

  • Champs :

    • old_attribute : ID de l'attribut à remplacer.

    • new_attribute : ID de l'attribut de remplacement.

    • delete_old : Switch pour supprimer ou non l'ancien attribut.

Exemple d'affichage :

'type' => 'text',
'label' => $this->l('ID de l\'ancien attribut'),
'name' => 'old_attribute',
'required' => true
<?php
if (!defined('_PS_VERSION_')) {
    exit;
}

class AttributeReplacer extends Module
{
    private $historyFile;

    public function __construct()
    {
        $this->name = 'attributereplacer';
        $this->tab = 'administration';
        $this->version = '1.0.0';
        $this->author = 'Aleksandre';
        $this->need_instance = 0;
        $this->historyFile = _PS_MODULE_DIR_ . $this->name . '/history.json';

        parent::__construct();

        $this->displayName = $this->l('Attribute Replacer');
        $this->description = $this->l('Remplace un attribut de produit par un autre et supprime l ancien attribut si non utilisé.');
    }

    public function install()
    {
        return parent::install() && $this->registerHook('backOfficeHeader');
    }

    public function uninstall()
    {
        return parent::uninstall();
    }

    public function getContent()
    {
        $output = '';

        if (Tools::isSubmit('submitReplaceAttributes')) {
            $oldAttributeId = (int)Tools::getValue('old_attribute');
            $newAttributeId = (int)Tools::getValue('new_attribute');
            $deleteOld = (bool)Tools::getValue('delete_old');

            $this->logHistory($oldAttributeId, $newAttributeId, $deleteOld);

            if ($oldAttributeId && $newAttributeId && $oldAttributeId !== $newAttributeId) {
                $this->replaceAttribute($oldAttributeId, $newAttributeId, $deleteOld);
                $output .= $this->displayConfirmation($this->l('Les attributs ont été remplacés avec succès.'));
            } else {
                $output .= $this->displayError($this->l('Veuillez sélectionner deux attributs distincts.'));
            }
        }

        $output .= $this->renderForm();
        $output .= $this->renderHistory();

        return $output;
    }

    private function renderForm()
    {
        $fields_form = array(
            'form' => array(
                'legend' => array(
                    'title' => $this->l('Remplacer un attribut'),
                    'icon' => 'icon-cogs'
                ),
                'input' => array(
                    array(
                        'type' => 'text',
                        'label' => $this->l('ID de l\'ancien attribut'),
                        'name' => 'old_attribute',
                        'required' => true,
                        'desc' => $this->l('Entrez l\'ID de l\'attribut à remplacer.')
                    ),
                    array(
                        'type' => 'text',
                        'label' => $this->l('ID du nouvel attribut'),
                        'name' => 'new_attribute',
                        'required' => true,
                        'desc' => $this->l('Entrez l\'ID de l\'attribut de remplacement.')
                    ),
                    array(
                        'type' => 'switch',
                        'label' => $this->l('Supprimer l\'ancien attribut ?'),
                        'name' => 'delete_old',
                        'is_bool' => true,
                        'values' => array(
                            array(
                                'id' => 'delete_old_on',
                                'value' => 1,
                                'label' => $this->l('Oui')
                            ),
                            array(
                                'id' => 'delete_old_off',
                                'value' => 0,
                                'label' => $this->l('Non')
                            )
                        )
                    )
                ),
                'submit' => array(
                    'title' => $this->l('Remplacer'),
                )
            )
        );

        $helper = new HelperForm();
        $helper->submit_action = 'submitReplaceAttributes';
        $helper->fields_value = $this->getConfigFormValues();

        return $helper->generateForm(array($fields_form));
    }

    private function renderAttributeTable()
    {
        $attributes = $this->getAllAttributes();
        $output = '<h4>' . $this->l('Liste des attributs disponibles') . '</h4>';
        $output .= '<table class="table">';
        $output .= '<thead><tr><th>' . $this->l('ID') . '</th><th>' . $this->l('Nom') . '</th><th>' . $this->l('Groupe') . '</th></tr></thead><tbody>';

        foreach ($attributes as $groupName => $attrList) {
            foreach ($attrList as $attr) {
                $output .= '<tr>';
                $output .= '<td>' . (int)$attr['id_attribute'] . '</td>';
                $output .= '<td>' . htmlspecialchars($attr['name']) . '</td>';
                $output .= '<td>' . htmlspecialchars($groupName) . '</td>';
                $output .= '</tr>';
            }
        }

        $output .= '</tbody></table>';
        return $output;
    }

    private function replaceAttribute($oldAttributeId, $newAttributeId, $deleteOld)
    {
        $sql = 'UPDATE ' . _DB_PREFIX_ . 'product_attribute_combination
                SET id_attribute = ' . (int)$newAttributeId . '
                WHERE id_attribute = ' . (int)$oldAttributeId;
        Db::getInstance()->execute($sql);

        if ($deleteOld) {
            $this->deleteUnusedAttribute($oldAttributeId);
        }
    }

    private function deleteUnusedAttribute($attributeId)
    {
        $used = Db::getInstance()->getValue('SELECT COUNT(*) FROM ' . _DB_PREFIX_ . 'product_attribute_combination WHERE id_attribute = ' . (int)$attributeId);
        if ($used == 0) {
            Db::getInstance()->delete(_DB_PREFIX_ . 'attribute', 'id_attribute = ' . (int)$attributeId);
        }
    }

    private function getAllAttributes()
    {
        $attributes = array();
        $groups = AttributeGroup::getAttributesGroups($this->context->language->id);
        foreach ($groups as $group) {
            $attributes[$group['name']] = Attribute::getAttributes($this->context->language->id, $group['id_attribute_group']);
        }
        return $attributes;
    }

    private function getConfigFormValues()
    {
        return [
            'old_attribute' => Tools::getValue('old_attribute', ''), 
            'new_attribute' => Tools::getValue('new_attribute', ''),
            'delete_old' => Tools::getValue('delete_old', 0)
        ];
    }

    private function logHistory($oldAttribute, $newAttribute, $deleteOld)
    {
        $history = file_exists($this->historyFile) ? json_decode(file_get_contents($this->historyFile), true) : [];
        $history[] = [
            'old_attribute' => $oldAttribute,
            'new_attribute' => $newAttribute,
            'delete_old' => $deleteOld,
            'timestamp' => date('Y-m-d H:i:s')
        ];
        file_put_contents($this->historyFile, json_encode($history, JSON_PRETTY_PRINT));
    }

    private function renderHistory()
    {
        $history = file_exists($this->historyFile) ? json_decode(file_get_contents($this->historyFile), true) : [];
        if (empty($history)) {
            return '<h4>Historique des actions</h4><p>Aucune action enregistrée.</p>';
        }

        $output = '<h4>Historique des actions</h4><ul>';
        foreach ($history as $entry) {
            $output .= '<li>Old Attribute: ' . $entry['old_attribute'] . ' | New Attribute: ' . $entry['new_attribute'] . ' | Delete Old: ' . ($entry['delete_old'] ? 'Oui' : 'Non') . ' | ' . $entry['timestamp'] . '</li>';
        }
        $output .= '</ul>';
        return $output;
    }
}
[
    {
        "old_attribute": 0,
        "new_attribute": 0,
        "delete_old": false,
        "timestamp": "2024-12-17 14:39:28"
    },
    {
        "old_attribute": 0,
        "new_attribute": 0,
        "delete_old": false,
        "timestamp": "2024-12-17 14:41:27"
    },
    {
        "old_attribute": 44934,
        "new_attribute": 44935,
        "delete_old": false,
        "timestamp": "2024-12-17 14:51:40"
    },
    {
        "old_attribute": 3824,
        "new_attribute": 2574,
        "delete_old": false,
        "timestamp": "2024-12-17 14:59:25"
    },
    {
        "old_attribute": 19150,
        "new_attribute": 118,
        "delete_old": false,
        "timestamp": "2024-12-17 15:17:48"
    },
    {
        "old_attribute": 19148,
        "new_attribute": 122,
        "delete_old": false,
        "timestamp": "2024-12-17 15:19:17"
    },
    {
        "old_attribute": 19069,
        "new_attribute": 123,
        "delete_old": false,
        "timestamp": "2024-12-17 15:19:37"
    },
    {
        "old_attribute": 19070,
        "new_attribute": 3799,
        "delete_old": false,
        "timestamp": "2024-12-17 15:19:56"
    }
]

3. Méthode renderAttributeTable()

Cette méthode génère un tableau affichant tous les attributs existants avec les informations suivantes :

  • ID de l'attribut

  • Nom de l'attribut

  • Groupe auquel il appartient (ex. : Couleur, Taille).

Exemple de tableau :

ID

Nom

Groupe

123

Taille L

Taille

456

Rouge

Couleur

789

Acier Inoxydable

Matériau


4. Méthode replaceAttribute()

Cœur du module, cette méthode effectue l'action principale :

  • Elle met à jour la table product_attribute_combination pour remplacer les ID d'attributs.

Requête SQL utilisée :

UPDATE ps_product_attribute_combination
SET id_attribute = NEW_ID
WHERE id_attribute = OLD_ID;
  • Ensuite, elle appelle deleteUnusedAttribute() si l'option supprimer l'ancien attribut est activée.


5. Méthode deleteUnusedAttribute()

Cette méthode vérifie si l'ancien attribut est encore utilisé par d'autres produits. Si ce n'est pas le cas, il est supprimé.

Requête SQL pour vérifier l'utilisation :

sqlCopy codeSELECT COUNT(*) 
FROM ps_product_attribute_combination 
WHERE id_attribute = OLD_ID;

6. Méthode logHistory()

Cette méthode enregistre chaque action dans un fichier JSON history.json :

  • Exemple de structure de log :

[
  {
    "old_attribute": 123,
    "new_attribute": 456,
    "delete_old": true,
    "timestamp": "2024-12-17 15:00:00"
  }
]

7. Méthode renderHistory()

Cette méthode affiche un historique des actions sous forme de liste simple pour un suivi visuel des remplacements effectués.

Exemple de rendu :

Old Attribute: 123 | New Attribute: 456 | Delete Old: Oui | 2024-12-17 15:00:00

Précautions d'utilisation

  1. Sauvegardez votre base de données avant d'utiliser le module, car il effectue des modifications massives.

  2. Assurez-vous des ID : Utilisez la table des attributs fournie pour éviter toute erreur.


Exemple d'utilisation

  1. Sélectionnez l'ID de l'ancien attribut dans le tableau (ex. : 123).

  2. Entrez l'ID du nouvel attribut dans le champ (ex. : 456).

  3. Cochez l'option "Supprimer l'ancien attribut" si nécessaire.

  4. Cliquez sur Remplacer.

  5. Vérifiez l'historique pour confirmer l'action.


Conclusion

Le module Attribute Replacer est un outil indispensable pour gérer et mettre à jour efficacement les attributs de produits dans PrestaShop. Il automatise les modifications massives et simplifie le processus de suppression des attributs obsolètes tout en assurant un suivi précis via son historique.

PreviousAffichage des produits

Last updated 5 months ago