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

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



    Ничего не могу написать про саму систему, так как даже в админку не заходил — работал только с базой данных. Кстати, это 322 таблицы, против 68 у MODx.


    О полном переносе всего-всего речи конечно не шло, была поставлена задача импортировать содержимое определенных инфоблоков (статей и новостей), с авторами и некоторыми свойствами (картинки, дата публикации).
    И конечно, сохранить все url адреса, хорошо проиндексированные поисковиками.

    Думаю, что при некотором усердии этот скрипт можно допилить для работы с другими CMS, типа Joomla или Drupal.

    В конце топика архив для скачивания, а я пока немного расскажу, как работает скрипт.

    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. В общем, отдаю, как есть.

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


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

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

    UPD. Не приятно получать минусы в пост и карму за, как мне кажется, полезный скрипт. Хоть бы кто отписался — что не устраивает?
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 11

      0
      >А это 250 таблиц
      Зависит от редакции. В интернет магазине «1С-Битрикс: Управление сайтом» их 389. Кстати, в phpMyAdmin по дефолту как раз 250 таблиц на страницу выводиться, так что может и в вашей редакции их больше?

        0
        не знаю, возможно. реально работал только с таблицами iblock* и file.
          0
          Действительно, 322 таблицы. Поправил, спасибо!
          0
          Спасибо за решение.
          Написать скрипт обратной миграции кажется не таким уж сложным.
            0
            Только если знаете Битрикс. Мне его структура БД показалась довольно непростой.

            Хотя, если вы будете импортировать в Битрикс — вы сможете использовать его API, и наверняка его методы сами все распихают куда надо.

            А у MODx все довольно просто — нужны только site_content (все ресурсы), site_tmplvars (дополнительные поля) и tmplvar_contentvalues (значения полей для ресурсов)
            0
            У битрикса есть стандартный механизм экспорта из инфоблоков двух типов:
            1. CSV
            2. XML

            XML экспортируется по стандарту CommerceML

            С MODx никогда не сталкивался, но есть шанс, что импорт по стандарту CommerceML уже кем то сделан для импорта данных из 1С (1с в CommerceML товары выгружает). Если готового импорта CommerceML для MODx нет, то мне кажется стоило обратить внимание именно на этот формат обмена, так как данные удобнее брать из одного места, а не из нескольких разрозненных таблиц. Да и в целом решение бы получилось более универсальное.
              0
              Читал про эту возможность, но работать напрямую с БД показалось быстрее, чем парсить огромный XML файл.

              Задача была быстро перенести информацию, а не создать универсальный инструмент для работы с CommerceML.
              +1
              UPD. Не приятно получать минусы в пост и карму за, как мне кажется, полезный скрипт. Хоть бы кто отписался — что не устраивает?

              Это происки агентов 1С-Битрик, они боятся, что данный пример наконец-то даст понять другим, что MODx — серьезная альтернатива и 1С-битриксу, да и прочим движкам.
                0
                Нереально улыбнулся с урлов битрикса. Импорт в MODx пишется быстро, любой.
                Для вашего случая рекомендовал бы переезд на нормальные урлы с помощью 301 редиректа. Создание их на лету тоже можно автоматизировать, подправив ваш скрипт и сделав еще одну таблицу сопоставления старых и новых урлов
                  0
                  Работаю как раз в основном именно с этими двумя движками (MODx и Битрикс) и сталкивался в работе только с переездом MODx -> Bitrix.

                  В силу этого обстоятельства сейчас возник профессиональный интерес: чем клиент мотивировал переезд Bitrix -> MODx? Если это не коммерческая тайна, конечно же.
                    0
                    видимо тайна :)

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое