Меняем modx, Evo на Revo
/* Превью
По игрались и хватит, пора делать нормальные сайты на нормальных движках..
*/
И так, имеем сайт на modx Evolution 1.4.6, и хотим его перенести на modx Revolution 2.7.0.
Для реализации этой задачи подберём песню, так как задача муторная, кропотливая и имеющая множество подводных камней, возьмём что то соответствующее дальнейшему подгаранию..
Подготавливаем поле боя
- Создаём сайт на Revo и делаем backup базы, чтобы можно было быстро откатиться при проблемах
- Делаем backup сайта и базы на Evo
Полезли в базы
Одна из проблем переноса сайта с Evo на Revo это различия в базах данных, для переноса сначала надо определить что нужно переносить, составить список всего необходимого, в моём случае получается такой список:
- Ресурсы
- Шаблоны
- Категории
- Дополнительны поля
- Чанки
Далее редактируем базу Evo с помощью SQL запросов в PhpMyAdmin, и экспортируя из неё отредактированные таблицы, обязательно убирая галочку в настройках экспорта Добавить выражение CREATE TABLE
Ресурсы
Ресурсы хранятся в таблице modx_site_content в обоих системах, но количество столбцов у них разное, проверять каких нет в Evo а какие есть в Revo я конечно же не буду, а просто импортирую эту таблицу из одной системы в другую, таким образом я выявляю ошибки слияния, потыкав там, потыкав здесь, избавляюсь от них.
- Удаляем лишние столбцы,`hasmetatags` `haskeywords`, вот таким SQL кодом
ALTER TABLE `modx_site_content` DROP `haskeywords`, DROP `hasmetatags`;
- Добавляем столбцы 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`;
- В созданном столбце class_key хранится тип ресурса, ссылка это или документ, чтобы заполнить эти значения используем SQL
UPDATE `modx_site_content` SET `class_key` = 'modWebLink', `type` = 'document' WHERE `type`='reference'
- Созданный 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%'//Поиск в шаблонах
Комментарии ()
Написать комментарий