К содержанию

Как выполнить ресолвер только при обновлении с 3 на 4 версию компонента?

Добрый день! В моем компоненте планируются большие правки базы и нужно при обновлении на новую версию компонента внести изменения в базу (скопировать данные из одной таблицы в другую), но нужно выполнить это только 1 раз, при обновлении с 3 на 4 версию, не выполнять при новой установке и не выполнять при деинсталляции и установки заново. Как это сделать? Или может можно как нибудь в ресолвере получить номер обновляемой( предыдущей) версии и номер устанавливаемой?
Александр Туниеков
Александр Туниеков
01 марта 2019, 19:45
modx.pro
1 237
Поблагодарить автора Отправить деньги
Реклама

Комментарии: 5

Александр Туниеков
01 марта 2019, 21:16
Посмотрел код установщика пакетов. Похоже никак нельзя предыдущею версию нельзя получить :(
    Илья Уткин
    Илья Уткин Администратор
    01 марта 2019, 21:52
    Проверяй не версию пакета, а существование новой таблицы и данных в ней.
      Александр Туниеков
      02 марта 2019, 05:41
      Спасибо. Этот вариант как-то не пришел в голову :)
      Сергей Шлоков
      Сергей Шлоков Эксперт
      02 марта 2019, 07:50
      Можно так
      $c = $modx->newQuery('transport.modTransportPackage');
      $c->select('version_major')
          ->where(array(
          'package_name' => 'ИМЯ ПАКЕТА',
      ))
          ->sortby('version_major','DESC')
          ->limit(1);
      $version = (int) $modx->getValue($c->prepare());
      
      if ($version == 3)  {
          ...
      }
        Александр Туниеков
        02 марта 2019, 09:22
        Кажется немного не верно. Здесь https://github.com/modxcms/revolution/blob/769b4f498bfc486b6417835f01443666178abc72/core/model/modx/transport/modtransportpackage.class.php#L233 Происходит сохранение пакета в таблицу до его установки. То есть ваш запрос вернет версию, которая ставиться. Надо добавить фильтр по installed не null.
        Наверно так
        $c = $modx->newQuery('transport.modTransportPackage');
        $c->select('version_major')
            ->where(array(
            'package_name' => 'ИМЯ ПАКЕТА',
            'installed:!=' => null,
        ))
            ->sortby('version_major','DESC')
            ->limit(1);
        $version = (int) $modx->getValue($c->prepare());
        
        if ($version == 3)  {
            ...
        }
        Проверять надо. Но проверка на пустое содержимое таблицы мне подходит. Надеюсь никто не додумается поставить пакет и потом сразу же обновить.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        5