Malgré notre petit troll sur l’article d’une mise à jour de Prestashop 1.6 vers Prestashop 1.7, nous avons quand même tenté d’utiliser cette méthode pour une mise à jour.

Comme nous l’indiquions dans notre article,  une mise à jour majeure de Prestashop ne peut pas être aussi simple que celle décrite par Prestashop. Pour s’en rendre compte, vous pouvez consulter notre procédure pour une mise à jour d’un Prestashop 1.6 vers 1.7.

Par contre, l’idée de base qui  est de déposer les nouveaux fichiers, les fichiers de mise à jour et lancer la mise à jour nous semblait intéressant pour une automatisation.

Et effectivement pour une mise à jour mineure (X.Y.Z.W vers X.Y.A.B)  cette procédure simplifiée peut s’avérer grandement utile surtout si vous souhaitez l’automatiser. Sinon le module 1-click upgrade est largement utilisable.

Nous avons donc décidé de scripter une mise à jour mineure de Prestashop.

Pour ce faire, voici notre procédure sur un environnement de développement :

  1. Obtenir la version courante de Prestashop
  2. Récupération de la version de base de Prestashop sur le site des versions de Prestashop
  3. Modifier le nom du répertoire « admin » de la version de base de Prestashop par le nom du répertoire d’administration de votre boutique
  4. Effectuer une différence entre les fichiers présents dans la version de base de Prestashop et votre version courante utilisée pour votre boutique. Essayer de revenir au plus près de la version de base. Si des fichiers restent modifiés noter les différences ou les mettre de coté et les remplacer par ceux de la version de base. Normalement, cette liste doit être très courte car tous vos développements spécifiques doivent se trouver dans le répertoire override.
  5. Récupération de la dernière version souhaitée de Prestashop sur le site des versions de Prestashop
  6. Modifier le nom du répertoire « admin » de la dernière version souhaitée de Prestashop par le nom du répertoire d’administration de votre boutique
  7. Effectuer une différence pour récupérer la liste des fichiers présents dans la version de base mais non présent dans la dernière version souhaitée de Prestashop. Cette liste de fichier sera ajoutée à notre script.

Nous recherchons les différences avec des outils comme Meld pour Linux/Mac, ou Winmerge pour Windows.

Une fois la liste des fichiers supprimés établie, nous avons utilisé notre module dédié aux développeurs, afin de réaliser un script de mise à jour.

Ce script fonctionne aussi bien pour les mises à jour de Prestashop 1.6 ou de mises à jour de Prestashop 1.7.

Script de mise à jour mineure de Prestashop
!! Attention de toujours faire une sauvegarde de vos fichiers avant de les modifier. !!

Si vous ne comprenez pas ce que vous faites, ne pas modifier vos fichiers et demander à votre agence ou une agence de développement spécialisée dans Prestashop d’apporter ces modifications sur votre site Internet.

Ce fichier ne fonctionne qu’avec le module module Developper Tools. A vous de l’adapter en fonction de vos besoins.

modules/pliciwebupdate/data/001_update_prestashop_1.6.1.23.php

[sourcecode language= »php »]
<?php
$prestashop_version = ‘1.6.1.23’;
// This file must contain only prestashop content
$update_file = __DIR__.’/prestashop_’.$prestashop_version.’.zip’;

// PS 1.7 version
$logDir = _PS_ROOT_DIR_.’/app/logs/’.(_PS_MODE_DEV_ ? ‘dev’ : ‘prod’).’/’;
if (version_compare(_PS_VERSION_, ‘1.7.0.0’, ‘<‘)) { // PS 1.6 version $logDir = _PS_ROOT_DIR_.’/log/’; } // Disabled shop if (!Configuration::updateValue(‘PS_SHOP_ENABLE’, 0)) { Tools::displayError(vsprintf(‘Cannot disabled shop’, [])); $controller->errors[] = vsprintf(‘Cannot disabled shop’, []);
return false;
}

// Remove all cache
Tools::clearSmartyCache();
Tools::clearXMLCache();
Media::clearCache();

// Delete old files
$files_to_remove = array();
$files_to_remove[] = ‘admin6797/filemanager/jPlayer/skin/blue.monday/spirites_blue.monday_2011.psd’;
$files_to_remove[] = ‘admin6797/themes/default/template/controllers/attachments/list_action_delete.tpl’;
$files_to_remove[] = ‘admin6797/themes/default/template/controllers/meta/helpers/options’;
$files_to_remove[] = ‘admin6797/themes/default/template/controllers/tax_rules_group/helpers/form’;
$files_to_remove[] = ‘js/jquery/plugins/jquery.storageapi.js’;
$files_to_remove[] = ‘js/jquery/jquery-1.11.0.min.map’;
$files_to_remove[] = ‘js/admin-dashboard.js’;
$files_to_remove[] = ‘js/admin-dnd.js’;
$files_to_remove[] = ‘js/admin-products.js’;
$files_to_remove[] = ‘js/admin-scene-cropping.js’;
$files_to_remove[] = ‘js/adminImport.js’;
$files_to_remove[] = ‘js/admin_carrier_wizard.js’;
$files_to_remove[] = ‘js/admin_order.js’;
$files_to_remove[] = ‘js/admin_themes.js’;
$files_to_remove[] = ‘js/attributesBack.js’;
$files_to_remove[] = ‘js/login.js’;
$files_to_remove[] = ‘js/notifications.js’;
$files_to_remove[] = ‘js/price.js’;
$files_to_remove[] = ‘js/tinymce.inc.js’;
$files_to_remove[] = ‘mails/en/order_changed.html’;
$files_to_remove[] = ‘mails/en/order_changed.txt’;
$files_to_remove[] = ‘tools/parser_sql/parser_sql.php’;
$files_to_remove[] = ‘tools/parser_sql/php-sql-parser.php’;
$files_to_remove[] = ‘tools/profiling/Hook.php’;
$files_to_remove[] = ‘tools/smarty/debug.tpl’;
$files_to_remove[] = ‘tools/swift/Swift’;
$files_to_remove[] = ‘tools/swift/EasySwift.php’;
$files_to_remove[] = ‘tools/swift/Swift.php’;
$files_to_remove[] = ‘themes/default-bootstrap/font’;
foreach($files_to_remove as $file_to_remove)
{
$filename = _PS_ROOT_DIR_.’/’.$file_to_remove;
if (file_exists($filename))
{
if (is_dir($filename)) {
if (!Tools::deleteDirectory($filename))
{
Tools::displayError(vsprintf(‘Cannot delete dir "%s"’, [$filename]));
$controller->errors[] = vsprintf(‘Cannot delete dir "%s"’, [$filename]);
return false;
}
} else {
Tools::deleteFile($filename);
}
}
}

// Unzip database update
$zip = new ZipArchive;
if (true !== $zip->open($update_file)) {
Tools::displayError(vsprintf(‘Cannot open update file "%s"’, [$update_file]));
$controller->errors[] = vsprintf(‘Cannot open update file "%s"’, [$update_file]);
return false;
}
if (true !== $zip->extractTo(_PS_ROOT_DIR_)) {
$zip->close();
Tools::displayError(vsprintf(‘Cannot extract file "%s" to path "%s"’, [$update_file, _PS_ROOT_DIR_]));
$controller->errors[] = vsprintf(‘Cannot extract file "%s" to path "%s"’, [$update_file, _PS_ROOT_DIR_]);
return false;
}
$zip->close();

// Launch database update
$update_url = Context::getContext()->shop->getBaseURL().’install/upgrade/upgrade.php’;
$update_result = Tools::file_get_contents($update_url, false, null, 120);
if (empty($update_result))
{
Tools::displayError(vsprintf(‘Cannot upgrade database’, []));
$controller->errors[] = vsprintf(‘Cannot upgrade database’, []);
return false;
}
file_put_contents($logDir.’/upgrade.log’, $update_result);

// Remove install dir
if (false == Tools::deleteDirectory(_PS_ROOT_DIR_.’/install’)) {
Tools::displayError(vsprintf(‘Cannot delete dir "%s" ‘, [_PS_ROOT_DIR_.’/install’]));
$controller->errors[] = vsprintf(‘Cannot delete dir "%s" ‘, [_PS_ROOT_DIR_.’/install’]);
return false;
}

// Rename admin dir
// Delete current admin dir
if (false == Tools::deleteDirectory(_PS_ADMIN_DIR_)) {
Tools::displayError(vsprintf(‘Cannot delete dir "%s" ‘, [_PS_ADMIN_DIR_]));
$controller->errors[] = vsprintf(‘Cannot delete dir "%s" ‘, [_PS_ADMIN_DIR_]);
return false;
}
// Rename admin dir to current admin dir
if (false == rename(_PS_ROOT_DIR_.’/admin’, _PS_ADMIN_DIR_)) {
Tools::displayError(vsprintf(‘Cannot rename dir "%s" to "%s"’, [_PS_ROOT_DIR_.’/admin’, _PS_ADMIN_DIR_]));
$controller->errors[] = vsprintf(‘Cannot rename dir "%s" to "%s"’, [_PS_ROOT_DIR_.’/admin’, _PS_ADMIN_DIR_]);
return false;
}

// Check result
$errorLogFile = $logDir.date(‘Ymd’).’_upgrade.log’;

$controller->confirmations[] = ‘
‘.vsprintf(‘Prestashop updated’."\n".’%s’."\n", [$update_result]);
$controller->warnings[] = ‘
‘.vsprintf(‘Don\’t forget to enable your shop’, []);
$controller->warnings[] = ‘
‘.vsprintf(‘Check error log file’."\n

<pre>".’%s’."</pre>

\n", [file_get_contents($errorLogFile)]);
[/sourcecode]

Vous devez accompagner ce fichier avec le fichier de la nouvelle version de Prestashop qui doit être stocké dans à l’emplacement :
modules/pliciwebupdate/data/prestashop_1.7.2.5.zip
En espérant que cela vous sera utile afin de rendre moins fastidieux les mises à jour de Prestashop.

A ce propos, nous allons essayer de développer un module qui permettra de vérifier si les classes parents des fichiers du répertoire override ont évolué entre deux versions. N’hésitez pas à nous dire si cela vous semble utile. Mais nous en reparlerons dans un nouvel article.