Третьего дня задали задачу — написать скрипт для переезда с Битрикс на MODx. Задача показалась интересной, тем более, что с Битрикс толком ни разу не работал — пришло время попробовать.
Не буду ничего писать про систему, я даже в админку не заходил — работал сразу с базой данных. А это 250 таблиц, против 68 у MODx.
Сразу видно, насколько Битрикс круче!
О полном переносе всего-всего речи конечно не шло, была поставлена задача перенести содержимое определенных инфоблоков (статей и новостей), с авторами и некоторыми свойствами (картинки, дата публикации).
И конечно, сохранить все адреса, хорошо проиндексированные поисковиками.
В конце топика архив для скачивания, а я пока немного расскажу, как он работает.
3 файла:
- config.inc.php — массив с определенной структурой, в которой лежат настройки для каждого инфоблока
- import.class.php — класс с методами
- process.php — файл для запуска, подключает конфиг и класс
Конфигурация
Все нужные для работы данные вносим в массив:
'table_prefix' => 'bitrix_'
,'blocks' => array(
'articles' => array(
'id' => 3
,'cat_tpl' => 3
,'tpl' => 3
,'uri_override' => 1
,'preview_picture' => 'preview_picture'
,'detail_picture' => 'detail_picture'
)
В массиве blocks хранятся настройки импорта конкретных инфоблоков:
- id — номер родительского ресурса для импорта всех страниц инфоблока. Нужно создать заранее.
- cat_tpl — идентификатор шаблона для контейнеров (категорий)
- tpl — идентификатор шаблона для обычных ресурсов
- uri_override — заморозить uri страницы, нужно для сохранения старых ссылок.
- preview_picture — ТВ параметр для сохранения мелкой картинки страницы, необязательно
- detail_picture — ТВ параметр для большой картинки, необязательно
Также в настройках указывается префикс таблиц Битрикса. Я считаю, что они лежат в одной базе данных с таблицами MODx.
Доступные методы
Теперь нужно заглянуть в файл proccess.php.
Там подключается сам MODx, класс импорта и вызываются нужные методы для импорта:
- truncateTable — принимает id ресурса, и удаляет все ресурсы после него. Полезно для эксперементов.
- importBlock — непосредственно импорт инфоблока, принимает его имя (и ищет в массиве конфига настройки)
- linkToAuthors — метод нужный лично для моей ситуации, связывает страницы авторов статей со статьями. Пригодится как пример.
- getProps — принимает имя секции инфоблока и выдает ее свойства (правила для построения uri и подобное)
- getElements — принимает id секции и выводит все ее дочерние страницы
- getSections — строит дерево категорий (из секций), вкладывает их друг в друга, как на оригинальном сайте. Принимает свойства из getProps и конфиг
- getFile — принимает id файла и выдает его свойства (адрес, имя). Файлы цепляются у Битрекса через отдельную таблицу в БД.
- makeURI — создание uri для ресурса MODx (нам же нужно его сохранить) по шаблону из свойств секции
- getProperty — дополнительные элементы эелемента инфоблока. Что то типа ТВ у MODx.
В целом, практически все методы написаны чтобы работать в importBlock.
При его запуске достаются свойства секции, создаются ее подкатегории, потом импортируются в них ресурсы и сохраняются картинки в ТВшечки.
Uri страниц
Самое главное — работают все uri, при использовании следующего плагина, конечно:
<?php
if ($modx->event->name == 'OnPageNotFound') {
$uri = parse_url(substr($_SERVER['REQUEST_URI'],1));
$query = explode('&', $uri['query']);
$num1 = count($query);
$query = array_unique($query);
$num2 = count($query);
if ($num1 != $num2) {
$modx->sendRedirect($modx->getOption('site_url').$uri['path'].'?'.implode('&', $query));
}
else if ($res = $modx->getObject('modResource', array('uri' => $uri['path'].'?'.$query[0]))) {
$modx->sendForward($res->get('id'));
}
}
Так как в Битриксе (не знаю, всегда, или только в моем случае) вот такие адреса — news/detail.php?news=6868, нужно еще заставить веб-сервер отдавать их на index.php в корне сайта. То есть, это как бы у нас такие friendly urls выходят.
Плагин даже заставляет работать пагинацию с getPage. То есть news/detail.php?news=6868&page=5 — отработает корректно.
Заключение.
Скрипт я старался писать как можно универсальнее, но не в ущерб основной работе. В любом случае, желающим переехать с Битрикс на MODx теперь есть от чего отталкиваться.
Работает довольно быстро, импорт 5000 ресурсов и линковка между собой через ТВ занимает около 4х, 5ти минут на обычном домашнем компе. Линковка — это моя специфическая задача, не знаю, пригодится ли кому еще.
Дописывать, модифицировать и развивать этот скрипт я не буду — только если попросят перенести еще один сайт с Битрикс на Revo. В общем, отдаю, как есть.
Напоследок, коротко:
- Установить MODx Revo.
- Создать контейнеры для импорта, назначить ТВ для картинок.
- Залить дамп БД битрикса.
- Скачать архив и распаковать в корень сайта.
- Настроить config.inc.php, указать префикс таблиц и настройки инфоблоков.
- Запустить импорт инфоблоков в process.php из консоли — есть возможность произвольного запуска.
- Если что-то не так — копаться в коде и править под себя.
Очень прошу не разворачивать очередные холивары на тему «лучшей в мире CMS»!
P.S. Заказали, оплатили, и разрешили поделиться ребята из Webmaster Agency
Автор: bezumkin