Комментарии ()

    +
    T
    >

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

    29.11.2018 21:12
    04.12.2018 21:17
    5285

    /* Превью

    По игрались и хватит, пора делать нормальные сайты на нормальных движках..

    */

    И так, имеем сайт на 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%'//Поиск в шаблонах