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
  • Installation
  • Fonctionnement
  • Structure du code
  • Personnalisation
  • Utilisation avancée
  • Exemple de Log
  • Dépannage
  1. Alternance Lacier

Cleaner Module

Le module Cleaner est un outil développé pour supprimer les fichiers et dossiers anciens de certains répertoires spécifiques dans PrestaShop. Il est particulièrement utile pour nettoyer les fichiers générés automatiquement par des modules tels que des configurateurs ou des outils d'upload qui stockent des données inutilisées.

Fonctionnalités principales

  • Suppression des fichiers et dossiers ayant une date de modification dépassée (par exemple : plus de 6 mois).

  • Génération d'un historique des actions avec détails dans un fichier de logs.

  • Visualisation de l'historique directement dans le back-office sous forme de tableau.

  • Analyse des répertoires pour afficher :

    • Le nombre total de fichiers restants.

    • La date du fichier le plus ancien.

  • Téléchargement des logs via un bouton dans le back-office.


Installation

1. Prérequis

  • PrestaShop version 1.7.x ou supérieure.

  • Accès au répertoire modules/ via FTP ou le gestionnaire de fichiers de votre serveur.

2. Étapes d'installation

  • Ajout du module :

    • Placez le dossier cleaner dans le répertoire modules/ de votre installation PrestaShop.

    • Le module doit contenir cette structure :

modules/
├── cleaner/
    ├── controllers/
    │   └── admin/
    │       └── AdminCleanerController.php
    ├── logs/
    ├── cleaner.php
    ├── logo.png
  • Activation du module :

    • Connectez-vous à votre back-office.

    • Allez dans Modules > Gestion des modules.

    • Recherchez "Cleaner" et cliquez sur Installer.

  • Placement de l'onglet :

    • Le module crée automatiquement un sous-onglet dans l'onglet Commandes, intitulé : "Suppression des images CV et TD de plus de X mois".


Fonctionnement

1. Paramétrage

  • Accédez à la page du module dans le back-office (sous l'onglet Commandes).

  • Remplissez le champ pour spécifier l'âge des fichiers à supprimer (en mois).

  • Cliquez sur le bouton Lancer le nettoyage.

2. Suppression des fichiers

Le module effectue les étapes suivantes :

  1. Parcourt les répertoires spécifiés (par exemple, /modules/configurateurvisuel/upload/compositions et /modules/configurateurvisuel/upload/users).

  2. Supprime les fichiers et dossiers dont la date de modification est supérieure à l'âge indiqué.

  3. Calcule l'espace libéré et le nombre total d'éléments supprimés.

3. Historique et analyse

Après chaque action, les informations suivantes sont :

  • Stockées dans un fichier de logs : modules/cleaner/logs/deletion_log.txt.

  • Affichées sous forme de tableau dans le back-office, comprenant :

    • La date de l'opération.

    • Un résumé des actions effectuées.

    • Le nombre total de fichiers restants dans chaque répertoire.

    • La date du fichier le plus ancien.

4. Téléchargement des logs

Un bouton permet de télécharger directement le fichier complet de logs pour archivage ou analyse.


Structure du code

1. Fichier principal : cleaner.php

Ce fichier contient :

  • La logique principale du module :

    • Installation et désinstallation du module et de l'onglet.

    • Gestion du formulaire de configuration et des actions déclenchées.

  • Les méthodes importantes :

    • cleanOldFoldersAndFiles($months) : Supprime les fichiers anciens.

    • logDeletion($message) : Écrit les logs.

    • logRemainingFiles($directories) : Analyse les fichiers restants.

    • getLogsData() : Transforme les logs en tableau lisible pour le back-office.

    • renderLogsTable() : Génère un tableau des logs dans le back-office.


2. Contrôleur Admin : AdminCleanerController.php

  • Définit la gestion du module depuis l'administration PrestaShop.

  • Permet la connexion entre le tableau des logs et l'interface utilisateur.


Personnalisation

1. Modification des répertoires analysés

Les répertoires analysés peuvent être modifiés dans la méthode cleanOldFoldersAndFiles() :

$directories = [
    _PS_ROOT_DIR_ . '/modules/configurateurvisuel/upload/compositions',
    _PS_ROOT_DIR_ . '/modules/configurateurvisuel/upload/users'
];

Ajoutez ou remplacez ces chemins par vos propres répertoires.

2. Intervalle d'analyse

  • Par défaut, l'intervalle d'analyse est spécifié par l'utilisateur via le formulaire (en mois).

  • La valeur est récupérée grâce à :

    $months = (int)Tools::getValue('cleaner_months');

Utilisation avancée

1. Analyse des fichiers

  • Après chaque suppression, l’analyse fournit des informations sur :

    • Le nombre total de fichiers restants dans chaque répertoire.

    • La date du fichier le plus ancien.

  • Ces informations sont visibles dans :

    • Le tableau du back-office.

    • Le fichier de logs (deletion_log.txt).

2. Téléchargement des logs

Le bouton de téléchargement est directement disponible dans l'interface du module, permettant de récupérer un fichier texte contenant toutes les actions et analyses.


Exemple de Log

Voici un exemple de contenu du fichier deletion_log.txt généré par le module :

[2024-11-25 16:00:00] DÉBUT DU NETTOYAGE : Suppression des fichiers vieux de 6 mois.
[2024-11-25 16:00:01] 10 éléments supprimés (fichiers et dossiers), 2.5 Go libérés.
[2024-11-25 16:00:02] ANALYSE DES FICHIERS RESTANTS
[2024-11-25 16:00:03] Dans /modules/configurateurvisuel/upload/compositions :
- Nombre total de fichiers restants : 15
- Fichier le plus ancien : 1723462343-284_1.png (modifié le 2024-08-12 13:32:23)
[2024-11-25 16:00:04] Dans /modules/configurateurvisuel/upload/users :
- Nombre total de fichiers restants : 8
- Fichier le plus ancien : 1723470135-420_1.svg (modifié le 2024-08-10 15:30:00)

Dépannage

1. Erreur : Jeton invalide

Si vous rencontrez un problème de jeton invalide, assurez-vous que :

  • Le contrôleur est bien défini dans AdminCleanerController.

  • Le cache de PrestaShop est vidé après chaque modification.

2. Fichier de log non créé

Vérifiez :

  • Les permissions sur le répertoire modules/cleaner/.

  • Les erreurs dans les logs PHP du serveur.

Voici le code source du module

<?php
if (!defined('_PS_VERSION_')) {
    exit;
}

class Cleaner extends Module
{
    public function __construct()
    {
        $this->name = 'cleaner';
        $this->tab = 'administration';
        $this->version = '1.0.0';
        $this->author = 'Aleksandre';
        $this->need_instance = 0;
        $this->bootstrap = true;

        parent::__construct();

        $this->displayName = $this->l('Cleaner Module');
        $this->description = $this->l('Permet le suppression des images des modules CV et TD qui datent d un certains temps.');
    }

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

    public function uninstall()
    {
        return parent::uninstall() && $this->uninstallTab();
    }

    private function installTab()
    {
        // ID de l'onglet parent "Commandes"
        $id_parent = 30;
    
        $tab = new Tab();
        $tab->active = 1;
        $tab->class_name = 'AdminCleaner'; // Nom contrôleur
        $tab->name = [];
        foreach (Language::getLanguages() as $lang) {
            $tab->name[$lang['id_lang']] = 'Suppression des images CV et TD de plus de X mois'; // Nom du sous-onglet
        }
        $tab->id_parent = $id_parent; // Définit "Commandes" comme parent
        $tab->module = $this->name;
    
        return $tab->add();
    }
    

    private function uninstallTab()
    {
        $id_tab = (int)Tab::getIdFromClassName('AdminCleaner');
        if ($id_tab) {
            $tab = new Tab($id_tab);
            return $tab->delete();
        }
        return true;
    }
    
    

    public function getContent()
    {
        $output = '';
    
        if (Tools::isSubmit('downloadLogs')) {
            $this->downloadLogs();
        }
    
        if (Tools::isSubmit('submitCleaner')) {
            $months = (int)Tools::getValue('cleaner_months');
            $output .= $this->cleanOldFoldersAndFiles($months);
        }
    
        $output .= '<form method="post">';
        $output .= '<button type="submit" name="downloadLogs" class="btn btn-primary">' . $this->l('Télécharger les logs') . '</button>';
        $output .= '</form>';
    
        $output .= $this->renderForm();
        $output .= $this->renderLogsTable();
    
        return $output;
    }
    

    private function renderForm()
    {
        $fields_form = [
            'form' => [
                'legend' => [
                    'title' => $this->l('Nettoyage des images'),
                    'icon' => 'icon-trash',
                ],
                'input' => [
                    [
                        'type' => 'text',
                        'label' => $this->l('Supprimer les images vieilles de (mois)'),
                        'name' => 'cleaner_months',
                        'required' => true,
                        'class' => 'fixed-width-lg',
                    ],
                ],
                'submit' => [
                    'title' => $this->l('Lancer le nettoyage'),
                    'class' => 'btn btn-primary',
                ],
            ],
        ];

        $helper = new HelperForm();
        $helper->module = $this;
        $helper->name_controller = $this->name;
        $helper->token = Tools::getAdminTokenLite('AdminCleaner');
        $helper->currentIndex = AdminController::$currentIndex . '&configure=' . $this->name;
        $helper->submit_action = 'submitCleaner';

        return $helper->generateForm([$fields_form]);
    }

    private function cleanOldFoldersAndFiles($months)
    {
        // Liste des répertoires à nettoyer
        $directories = [
            _PS_ROOT_DIR_ . '/modules/configurateurvisuel/upload/compositions',
            _PS_ROOT_DIR_ . '/modules/configurateurvisuel/upload/users'
        ];
    
        $threshold = strtotime("-$months months");
        $totalDeletedCount = 0;
        $totalFreedSpace = 0;

        // Log de début
        $this->logDeletion("DÉBUT DU NETTOYAGE : Suppression des fichiers vieux de $months mois.");

        foreach ($directories as $path) {
            if (!is_dir($path)) {
                $this->logDeletion("Le chemin spécifié n'est pas valide ou inaccessible : $path");
                continue;
            }

            foreach (glob($path . '/*') as $item) {
                if (filemtime($item) < $threshold) {
                    if (is_file($item)) {
                        $totalFreedSpace += filesize($item);
                        if (unlink($item)) {
                            $totalDeletedCount++;
                        } else {
                            $this->logDeletion("ÉCHEC : Impossible de supprimer le fichier : $item");
                        }
                    } elseif (is_dir($item)) {
                        $folderSize = $this->getFolderSize($item);
                        $totalFreedSpace += $folderSize;
                        if ($this->deleteFolder($item)) {
                            $totalDeletedCount++;
                        } else {
                            $this->logDeletion("ÉCHEC : Impossible de supprimer le dossier : $item");
                        }
                    }
                }
            }
        }

        $totalFreedSpace = round($totalFreedSpace / (1024 * 1024 * 1024), 2);

        // Log des résultats
        $this->logDeletion("$totalDeletedCount éléments supprimés (fichiers et dossiers), $totalFreedSpace Go libérés.");
        $this->logRemainingFiles($directories);

        // Retourne un message de confirmation
        return $this->displayConfirmation(
            "$totalDeletedCount éléments supprimés (fichiers et dossiers), $totalFreedSpace Go libérés."
        );
    }

    private function getFolderSize($folder)
    {
        $size = 0;
        foreach (glob(rtrim($folder, '/') . '/*', GLOB_NOSORT) as $file) {
            $size += is_file($file) ? filesize($file) : $this->getFolderSize($file);
        }
        return $size;
    }

    private function deleteFolder($folder)
    {
        foreach (glob($folder . '/*', GLOB_NOSORT) as $file) {
            is_file($file) ? unlink($file) : $this->deleteFolder($file);
        }
        return rmdir($folder);
    }

    private function logDeletion($message)
    {
        $logDir = _PS_MODULE_DIR_ . $this->name . '/logs';
        $logFile = $logDir . '/deletion_log.txt';
    
        // Créez le répertoire "logs" s'il n'existe pas
        if (!file_exists($logDir)) {
            mkdir($logDir, 0755, true);
        }
    
        // Ajoutez une ligne au fichier de log
        file_put_contents($logFile, "[" . date('Y-m-d H:i:s') . "] $message\n", FILE_APPEND);
    }
    

    private function logRemainingFiles($directories)
    {
        $logFile = _PS_MODULE_DIR_ . $this->name . '/logs/deletion_log.txt';
        file_put_contents($logFile, "[" . date('Y-m-d H:i:s') . "] ANALYSE DES FICHIERS RESTANTS\n", FILE_APPEND);

        foreach ($directories as $path) {
            if (!is_dir($path)) {
                file_put_contents($logFile, "Le chemin n'existe pas ou n'est pas un répertoire : $path\n", FILE_APPEND);
                continue;
            }

            $files = glob($path . '/*');
            $totalFiles = count($files);

            if ($totalFiles === 0) {
                file_put_contents($logFile, "Aucun fichier ou dossier restant dans : $path\n", FILE_APPEND);
            } else {
                // Récupère la date de modification du fichier le plus ancien
                $oldestFile = array_reduce($files, function ($oldest, $file) {
                    return filemtime($file) < filemtime($oldest) ? $file : $oldest;
                }, $files[0]);

                // Résumé général
                file_put_contents($logFile, "Dans $path :\n", FILE_APPEND);
                file_put_contents($logFile, "- Nombre total de fichiers restants : $totalFiles\n", FILE_APPEND);
                file_put_contents($logFile, "- Fichier le plus ancien : " . basename($oldestFile) . " (modifié le " . date('Y-m-d H:i:s', filemtime($oldestFile)) . ")\n", FILE_APPEND);
            }
        }
    }

    private function getLogsData()
    {
        $logFile = _PS_MODULE_DIR_ . $this->name . '/logs/deletion_log.txt';
        $logs = [];
    
        if (file_exists($logFile)) {
            $lines = file($logFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            foreach ($lines as $line) {
                if (preg_match('/\[(.*?)\] (.+)/', $line, $matches)) {
                    $logs[] = [
                        'date' => $matches[1],
                        'message' => $matches[2],
                    ];
                }
            }
        }
    
        // Ajouter un résumé des fichiers restants par répertoire
        $directories = [
            _PS_ROOT_DIR_ . '/modules/configurateurvisuel/upload/compositions',
            _PS_ROOT_DIR_ . '/modules/configurateurvisuel/upload/users'
        ];
    
        foreach ($directories as $path) {
            if (!is_dir($path)) {
                $logs[] = [
                    'date' => date('Y-m-d H:i:s'),
                    'message' => "Le chemin n'existe pas ou n'est pas un répertoire : $path",
                    'total_files' => 0,
                    'oldest_file_date' => '-',
                ];
            } else {
                $files = glob($path . '/*');
                $totalFiles = count($files);
                $oldestFileDate = '-';
    
                if ($totalFiles > 0) {
                    $oldestFile = array_reduce($files, function ($oldest, $file) {
                        return filemtime($file) < filemtime($oldest) ? $file : $oldest;
                    }, $files[0]);
    
                    $oldestFileDate = date('Y-m-d H:i:s', filemtime($oldestFile));
                }
    
                $logs[] = [
                    'date' => date('Y-m-d H:i:s'),
                    'message' => "Dans $path",
                    'total_files' => $totalFiles,
                    'oldest_file_date' => $oldestFileDate,
                ];
            }
        }
    
        return $logs;
    }
    

    private function renderLogsTable()
    {
        // Récupère les données des logs
        $logs = $this->getLogsData();

        // Définit les colonnes du tableau
        $fields_list = [
            'date' => [
                'title' => $this->l('Date'),
                'type' => 'text',
            ],
            'message' => [
                'title' => $this->l('Message'),
                'type' => 'text',
            ],
            'total_files' => [
                'title' => $this->l('Nombre de fichiers restants'),
                'type' => 'text',
            ],
            'oldest_file_date' => [
                'title' => $this->l('Fichier le plus ancien'),
                'type' => 'text',
            ],
        ];

        // Initialise HelperList
        $helper = new HelperList();
        $helper->shopLinkType = '';
        $helper->no_link = true;
        $helper->simple_header = true;
        $helper->identifier = 'id_log';
        $helper->show_toolbar = false;
        $helper->title = $this->l('Historique des suppressions');
        $helper->table = $this->name;
        $helper->token = Tools::getAdminTokenLite('AdminCleaner');
        $helper->currentIndex = AdminController::$currentIndex . '&configure=' . $this->name;

        // Ajoute un identifiant unique pour chaque ligne
        foreach ($logs as $key => &$log) {
            $log['id_log'] = $key;
            // Initialiser les champs optionnels si manquants
            if (!isset($log['total_files'])) {
                $log['total_files'] = '-';
            }
            if (!isset($log['oldest_file_date'])) {
                $log['oldest_file_date'] = '-';
            }
        }

        // Génère le tableau
        return $helper->generateList($logs, $fields_list);
    }
}
<?php
class AdminCleanerController extends ModuleAdminController
{
    public function __construct()
    {
        parent::__construct();
        $this->bootstrap = true;
    }

    public function renderList()
    {
        return $this->module->getContent();
    }
}
PreviousGravure LaserNextScripts JavaScript Indépendants

Last updated 5 months ago

12KB
cleaner.php
269B
AdminCleanerController.php