Импорт инфоблоков из 1С-Битрикс в MODx Revolution

в 16:24, , рубрики: bitrix, modx, modx revolution, битрикс, метки: , ,

Третьего дня задали задачу — написать скрипт для переезда с Битрикс на MODx. Задача показалась интересной, тем более, что с Битрикс толком ни разу не работал — пришло время попробовать.

Импорт инфоблоков из 1С Битрикс в MODx Revolution

Не буду ничего писать про систему, я даже в админку не заходил — работал сразу с базой данных. А это 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ти минут на обычном домашнем компе. Линковка — это моя специфическая задача, не знаю, пригодится ли кому еще.
Импорт инфоблоков из 1С Битрикс в MODx Revolution

Дописывать, модифицировать и развивать этот скрипт я не буду — только если попросят перенести еще один сайт с Битрикс на Revo. В общем, отдаю, как есть.

Напоследок, коротко:

  1. Установить MODx Revo.
  2. Создать контейнеры для импорта, назначить ТВ для картинок.
  3. Залить дамп БД битрикса.
  4. Скачать архив и распаковать в корень сайта.
  5. Настроить config.inc.php, указать префикс таблиц и настройки инфоблоков.
  6. Запустить импорт инфоблоков в process.php из консоли — есть возможность произвольного запуска.
  7. Если что-то не так — копаться в коде и править под себя.

Очень прошу не разворачивать очередные холивары на тему «лучшей в мире CMS»!

P.S. Заказали, оплатили, и разрешили поделиться ребята из Webmaster Agency

Автор: bezumkin

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js