+

Меняем modx, Evo на Revo

29.11.2018 21:12
04.12.2018 21:17
726

И так, имеем сайт на modx Evolution 1.4.6, и хотим его перенести на modx Revolution 2.7.0.

Для реализации этой задачи подберём песню, так как задача муторная, кропотливая и имеющая множество подводных камней, возьмём что то соответствующее дальнейшему подгаранию..

Подготавливаем поле боя

  1. Создаём сайт на Revo и делаем backup базы, чтобы можно было быстро откатиться при проблемах
  2. Делаем backup сайта и базы на Evo

Полезли в базы

Одна из проблем переноса сайта с Evo на Revo это различия в базах данных, для переноса сначала надо определить что нужно переносить, составить список всего необходимого, в моём случае получается такой список:

  1. Ресурсы
  2. Шаблоны
  3. Категории
  4. Дополнительны поля
  5. Чанки

Далее редактируем базу Evo с помощью SQL запросов в PhpMyAdmin, и экспортируя из неё отредактированные таблицы, обязательно убирая галочку в настройках экспорта Добавить выражение CREATE TABLE

Ресурсы

Ресурсы хранятся в таблице modx_site_content в обоих системах, но количество столбцов у них разное, проверять каких нет в Evo а какие есть в Revo я конечно же не буду, а просто импортирую эту таблицу из одной системы в другую, таким образом я выявляю ошибки слияния, потыкав там, потыкав здесь, избавляюсь от них.

  1. Удаляем лишние столбцы,`hasmetatags` `haskeywords`, вот таким SQL кодом
    ALTER TABLE `modx_site_content`
      DROP `haskeywords`,
      DROP `hasmetatags`;
       
  2. Добавляем столбцы class_key и content_type, аналогичные revo, опять же SQL
    ALTER TABLE `modx_site_content` ADD `class_key` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'modDocument' AFTER `alias_visible`, ADD `content_type` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `class_key`;
     
  3. В созданном столбце class_key хранится тип ресурса, ссылка это или документ, чтобы заполнить эти значения используем SQL
    UPDATE `modx_site_content` SET `class_key` = 'modWebLink', `type` = 'document' WHERE `type`='reference'
     
  4. Созданный content_type содержит типы содержимого, XML или HTML, CSS и прочая хрень, в общем SQL
    UPDATE `modx_site_content` SET `content_type` = '4' WHERE `contentType`='text/css';
      UPDATE `modx_site_content` SET `content_type` = '1' WHERE `contentType`='text/html';
      UPDATE `modx_site_content` SET `content_type` = '5' WHERE `contentType`='text/javascript';
      UPDATE `modx_site_content` SET `content_type` = '3' WHERE `contentType`='text/plain';
      UPDATE `modx_site_content` SET `content_type` = '2' WHERE `contentType`='text/xml';
      UPDATE `modx_site_content` SET `content_type` = '7' WHERE `contentType`='application/json';
     

Готово, ресурсы перенесены!

Шаблоны

`modx_site_templates` - таблица с шаблонами.
В столбце 'selectable' - не совсем понятно что, а значит не так уж он и нужен, в Рево его нет. editedon, createdon тоже нет..

ALTER TABLE `modx_site_templates`
  DROP `selectable`,
  DROP `editedon`,
  DROP `createdon`;

Категории

Таблица modx_categories, переносится безболезненно.

Дополнительны поля

Переносим таблицу modx_site_tmplvars - сами доп параметры, modx_site_tmplvar_contentvalues - значения параметров, modx_site_tmplvar_templates - шаблоны к которым прикреплены параметры.

modx_site_tmplvars - проблема возникает только с ней, почикаем лишнее..

ALTER TABLE `modx_site_tmplvars`
  DROP `editedon`,
  DROP `createdon`,
  DROP `display_params`;

Чанки

Чанки содержатся в таблице modx_site_htmlsnippets. Режем лишнее.

ALTER TABLE `modx_site_htmlsnippets`
  DROP `createdon`,
  DROP `editor_name`,
  DROP `editedon`,
  DROP `disabled`;

В итоге получаем 7 выгруженных таблиц, перед заливкой их на Revo нужно удалить содержимое аналогичных таблиц в Revo. Но перед тем как начать нужно подправить синтаксис, Evo на Revo.

Массовая замена синтаксиса Evo на Revo в базе данных

Начнём с самых простых различий, заменять будем при помощи SQL

Замена для вывода содержимого, например [*content*] на [[*content]] в маетах и чанках выглядит так:

UPDATE `modx_site_templates` SET content = REPLACE(content, '[*', '[[*');
UPDATE `modx_site_templates` SET content = REPLACE(content, '*]', ']]');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '[*', '[[*');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '*]', ']]');

Системные параметры

UPDATE `modx_site_templates` SET content = REPLACE(content, '[(', '[[++');
UPDATE `modx_site_templates` SET content = REPLACE(content, ')]', ']]');
UPDATE `modx_site_content` SET content = REPLACE(content, '[(', '[[++');
UPDATE `modx_site_content` SET content = REPLACE(content, ')]', ']]');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '[(', '[[++');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, ')]', ']]');

Теперь вывод чанков в макетах

UPDATE `modx_site_templates` SET content = REPLACE(content, '{{', '[[$');
UPDATE `modx_site_templates` SET content = REPLACE(content, '}}', ']]');

и самих чанках

UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '{{', '[[$');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '}}', ']]');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '[+', '[[+');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '+]', ']]');

в содержания страниц

UPDATE `modx_site_content` SET content = REPLACE(content, '{{', '[[$');
UPDATE `modx_site_content` SET content = REPLACE(content, '}}', ']]');

Правим ссылки

UPDATE `modx_site_templates` SET content = REPLACE(content, '[~', '[[~');
UPDATE `modx_site_templates` SET content = REPLACE(content, '~]', ']]');
UPDATE `modx_site_content` SET content = REPLACE(content, '[~', '[[~');
UPDATE `modx_site_content` SET content = REPLACE(content, '~]', ']]');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '[~', '[[~');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '~]', ']]');

Замена приложений Evo на Revo

С приложениями ловкий SQL не поможет, или поможет но нужно выдавать совершенно сложные SQL запросы, по этому пришло время по ковырять код руками..

eForm на FormIt + AjaxForm

Устанавливаем FormIt и AjaxForm

Находим код eForm и заменяем [!eForm? ... !] на [[AjaxForm? ... ]] и названия параметров внутри по примеру таблицы.

eFrom FormIt + AjaxForm
formid formName
subject emailSubject
tpl form - если не используем AjaxForm вызываем чанком отдельно
to emailTo
from emailFrom
report emailTpl
thankyou successMessage (но в значении не чанк а текст сообщения об успешной отправке) только для AjaxForm
&hooks=`spam, email, FormItSaveForm` - добавляем от себя, чтобы результаты сохранялись в админку, был антиспам какой ни какой, и сообщения отправлялись на почту
&snippet=`FormIt` - если используем AjaxForm нужно обязательно

еще про FormIt, если использовать только FormIt без Ajax код выглядит примерно так

[[!FormIt?
 &formName=`Форма такая то - под таким именем сохраняется в админке`
 &hooks=`email - отправлять сообщение на почту, FormItSaveForm - сохранять в админку, redirect - если надо редирект на определённую страницу после успешной отправки`
 &emailSubject=`Тема сообщения`
 &emailTo=`мыло на которое отправляем`
 &emailTpl=`шаблончег письма`
 &validate=`
  name:minLength=^2^,
  email:email:required,
  message:minLength=^10^`
 &formFields=`поля через запятую которые нужно сохранить в админке, если не заполненно то все`
 &fieldNames=`name==Имя, phone==Телефон - и тд, как поля будут подписаны в админке`
 &redirectTo=`212 - id страницы для редиректа`
]]
[[$eFromDeliveryForm]]

Версия ajax не сильно отличается, нужно заменить название сниппета и добавить следующие параметры

[[!AjaxForm?
 &form=`чанк формы`
 &snippet=`FormIt`
 &validationErrorMessage=`В форме содержатся ошибки!`
 &successMessage=`Сообщение успешно отправлено`
 ...
]]

Wayfinder на pdoMenu

Для Revo нужно скчать и установить pdoTools чтобы воспользоваться замечательным инструментом pdoMenu

Далее меняем Wayfinder на pdoMenu и содержимые параметры, для pdoMenu parents=`1` - обязательно добавляем, id родителя или 0

Правим чанки чтобы выводилась нужная информация

UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '+wf.id', '+id');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '+wf.classnames', '+classnames');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '+wf.link', '+link');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '+wf.title', '+menutitle');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '+wf.attributes', '+attributes');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '+wf.linktext', '+menutitle');
UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '+wf.wrapper', '+wrapper');

Ditto на pdoResources

pdoResources входит в комплект pdoTools

С учётом предыдущих замен, можно сделать и такую замену через SQL

UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '[[Ditto', '[[pdoResources');
UPDATE `modx_site_content` SET content = REPLACE(content, '[[Ditto', '[[pdoResources');
UPDATE `modx_site_templates` SET content = REPLACE(content, '[[Ditto', '[[pdoResources');

Но это не всё, придётся менять и параметры, например выводить необходимые допсвойства такие как картинки. И при выводе доп свойст добавлять tv. в начале, это можно сделать через SQL


UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '[[+image]]', '[[+tv.image]]');

Сортировка в pdoResources не задаётся одним параметром, по этому правим

UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '&orderBy=`menuindex ASC`', '&sortby=`menuindex` &sortdir=`ASC`');
UPDATE `modx_site_content` SET content = REPLACE(content, '&orderBy=`menuindex ASC`', '&sortby=`menuindex` &sortdir=`ASC`');
UPDATE `modx_site_templates` SET content = REPLACE(content, '&orderBy=`menuindex ASC`', '&sortby=`menuindex` &sortdir=`ASC`');

DocInfo заменяем на аналог из инструментов pdoTools


[[DocInfo? &docid=`186` &field=`social-vk`]]

Код выше мы можем заменить таким вот образом


[[#186.social-vk]]

phpthumb заменяем аналагом phpThumbOf

Скачиваем, устанавливаем, заменяем..

UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, '[[phpthumb', '[[phpthumbof');
UPDATE `modx_site_content` SET content = REPLACE(content, '[[phpthumb', '[[phpthumbof');
UPDATE `modx_site_templates` SET content = REPLACE(content, '[[phpthumb', '[[phpthumbof');

Итог, MySQL для работы с остатками изменений в базе

Замена в базе

UPDATE `modx_site_htmlsnippets` SET snippet = REPLACE(snippet, 'что ищем', 'на что заменяем'); //В чанках
UPDATE `modx_site_content` SET content = REPLACE(content, 'что ищем', 'на что заменяем');//В содержании ресурсов
UPDATE `modx_site_templates` SET content = REPLACE(content, 'что ищем', 'на что заменяем');//В шаблонах

Если вдруг где-то что то осталось, ищем следующим образом

Следующий код для поиска DocInfo

SELECT `*` FROM `modx_site_htmlsnippets` WHERE `snippet` LIKE '%DocInfo%'//Поиск в чанках

SELECT `*` FROM `modx_site_templates` WHERE `content` LIKE '%DocInfo%'//Поиск в содержании ресурсов

SELECT `*` FROM `modx_site_content` WHERE `content` LIKE '%DocInfo%'//Поиск в шаблонах