Включение автообновления

Опубликовано Опубликовано в рубрике prestashop, Руководство разработчика PrestaShop, Русская документация PrestaShop 1.6, Создание модулей PrestaShop

Включение автообновления

Начиная с PrestaShop 1.5 возможно автоматическое обновление вашего модуля: после того как новая версия доступна для расширений, PrestaShop предлагает «Обновить его!». Для пользователя. Нажатие этой кнопки вызовет ряд методов, каждый из которых приблизит последнюю версию вашего модуля.

Чтобы обеспечить поддержку автоматического обновления вашего модуля, вам понадобятся три основных вещи:

  • Четко укажите номер версии модуля в его методе конструктора: $this->version = '1.1';
  • Создать /upgrade подпапку в папке модуля.
  • Добавьте скрипт автоматического обновления PHP для каждой новой версии.

Например:

/*
* File: /upgrade/Upgrade-1.1.php
*/
function upgrade_module_1_1($module) {
  // Process Module upgrade to 1.1
  // ....
  return true// Return true if success.
}

…и затем:

/*
* File: /upgrade/Upgrade-1.2.php
*/
function upgrade_module_1_2($module) {
  // Process Module upgrade to 1.2
  // ....
  return true// Return true if succes.
}

Каждый метод должен внести необходимые изменения в файлы модуля и данные БД, чтобы получить последнюю версию.

Например, здесь install-1.4.9.php файл из модуля gamification:

<?php
if (!defined('_PS_VERSION_'))
    exit;
function upgrade_module_1_4_9($object)
{
    return Db::getInstance()->execute(
            'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'tab_advice` (
              `id_tab` int(11) NOT NULL,
              `id_advice` int(11) NOT NULL,
              PRIMARY KEY (`id_tab`, `id_advice`)
            ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;');
}

В модуль слайдера файл install-1.2.1.php делает еще больше:

<?php
if (!defined('_PS_VERSION_'))
    exit;
function upgrade_module_1_2_1($object)
{
    return Db::getInstance()->execute('
    UPDATE '._DB_PREFIX_.'homeslider_slides_lang SET
        '.homeslider_stripslashes_field('title').',
        '.homeslider_stripslashes_field('description').',
        '.homeslider_stripslashes_field('legend').',
        '.homeslider_stripslashes_field('url')
    );
}
function homeslider_stripslashes_field($field)
{
    $quotes array('"\\\'"''"\'"');
    $dquotes array('\'\\\\"\'''\'"\'');
    $backslashes array('"\\\\\\\\"''"\\\\"');
    return '`'.bqSQL($field).'` = replace(replace(replace(`'.bqSQL($field).'`, '.$quotes[0].', '.$quotes[1].'), '.$dquotes[0].', '.$dquotes[1].'), '.$backslashes[0].', '.$backslashes[1].')';
}

Затем PrestaShop анализирует все эти сценарии один за другим, последовательно. Поэтому настоятельно рекомендуется последовательно указывать версии вашего модуля и использовать только числа — поскольку код обновления использует PHP version_compare() method.

Если новая версия вашего модуля добавляет или обновляет свои хуки, вы должны также обновить и их

Действительно, поскольку хуки определяются (обычно) при установке модуля, PrestaShop не будет устанавливать модуль снова, чтобы включить новый код хуков, поэтому вам необходимо использовать методы обновления:

Например, вот файл  из модуля blockbestseller: install-1.2.php

<?php
if (!defined('_PS_VERSION_'))
    exit;
function upgrade_module_1_2($object)
{
    return ($object->registerHook('addproduct')
      && $object->registerHook('updateproduct')
      && $object->registerHook('deleteproduct')
      && $object->registerHook('actionOrderStatusPostUpdate'));
}