Миграция с Drupal на ModX Revolution

Здесь будет информация по переносу сайта

Как-то понравился ModX - есть поле для творчества. Или это показалось. Однако, поскольку "корпоративный" сайт делал на нём, а поддерживать ещё и личный на Drupal уже не хочется, да и клиенты висят на ModX - буду мигрировать. Более 100 страниц с облаком тегов. Больше пока не нужно.

Для перезаписи URL добавляем в конфигурацию сервера nginx:

if (!-e $request_filename) {
    rewrite ^/info/(.*)$ /info/index.php?q=$1 last;
}

Теперь в настройках пункты friendly_urls, friendly_urls_strict, global_duplicate_uri_check, use_alias_path устанавливаем в "Yes"

Облако тегов было реализовано по инструкции с http://www.marabar.ru/vyvodim-oblako-tegov-v-modx-revo.html

Собственно, ничего не получилось, и поэтому придётся читать оригинальную документацию по tagLister

Далее берём контент и теги из одной базы и вставляем в другую:

<?php

$drupalHost = "";
$drupalUser = "";
$drupalPass = "";
$drupalDb   = "";

$modxHost = "";
$modxUser = "";
$modxPass = "";
$modxDb   = "";

$drupalDB = mysql_connect($drupalHost, $drupalUser, $drupalPass);
if(!$drupalDB) die("Can't connect to Drupal DB");
mysql_select_db($drupalDb, $drupalDB);
mysql_query('SET NAMES utf8', $drupalDB);
$modxDB = mysql_connect($modxHost, $modxUser, $modxPass);
if(!$modxDB) die("Can't connect to ModX DB");
mysql_select_db($modxDb, $modxDB);
mysql_query('SET NAMES utf8', $modxDB);

// Выбор статей
$sql = "SELECT n.nid AS id, r.title AS title, r.body AS body, n.status AS status FROM node n INNER JOIN node_revisions r ON n.vid = r.vid";
$pagesList = mysql_query($sql, $drupalDB);
if(FALSE === $pagesList) die("Error ". mysql_errno($drupalDB) .": ". mysql_error($drupalDB));
while($arrPage = mysql_fetch_assoc($pagesList)) {
	// Выбор тегов статьи
	$sql = "SELECT n.nid AS id, td.name AS tag FROM node n INNER JOIN term_node tn ON ( n.nid = tn.nid AND n.vid = tn.vid ) "
		  ."INNER JOIN term_data td ON tn.tid = td.tid WHERE n.nid = ". $arrPage["id"];
	$tagsList = mysql_query($sql, $drupalDB);
	if(FALSE === $tagsList) die("Error ". mysql_errno($drupalDB) .": ". mysql_error($drupalDB));
	$arrTags = array();
	while($arrTag = mysql_fetch_assoc($tagsList)) {
		$arrTags[] = $arrTag["tag"];
	}
	print $arrPage["id"] ." = ". implode(",", $arrTags)."\n";

	sleep(1);

	$sql = "INSERT INTO modx_site_content VALUES (NULL, 'document', 'text/html', '"
			. mysql_real_escape_string($arrPage["title"]) ."', '"
			. mysql_real_escape_string($arrPage["title"]) ."', '', '', '', 0, 0, 0, 0, 0, '', '"
			. mysql_real_escape_string($arrPage["body"]) ."', 1, 1, 0, 1, 1, 1, ". time() .", 1, "
			. time() .", 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 'modDocument', 'web', 1, NULL, 0, 0, 1, NULL)";
	$res = mysql_query($sql, $modxDB);
	if(FALSE === $res) die("Error ". mysql_errno($modxDB) .": ". mysql_error($modxDB));
	$lastId = mysql_insert_id($modxDB);

$sql = "UPDATE modx_site_content SET alias='$lastId', published=". $arrPage["status"]
        .", uri='". $lastId .".html' WHERE id=". $lastId;
	$res = mysql_query($sql, $modxDB);
	if(FALSE === $res) die("Error ". mysql_errno($modxDB) .": ". mysql_error($modxDB));


	$sql = "INSERT INTO `modx_site_tmplvar_contentvalues` (`id`, `tmplvarid`, `contentid`, `value`) VALUES (NULL, 1, $lastId, '"
			. mysql_real_escape_string(implode(",", $arrTags)) ."')";
	$res = mysql_query($sql, $modxDB);
	if(FALSE === $res) die("Error ". mysql_errno($modxDB) .": ". mysql_error($modxDB));
}


?>
Всё это хорошо, но Drupal при выводе ноды форматирует текст, поэтому при переливке получили "кашу" из одной строки. Получить "друпальное" форматирование можно из страниц с помощью простого скрипта:
<?php

$content=file_get_contents("http://galaober.org.ua/node/89");
$doc = new DOMDocument();
$doc->loadHTML($content);
$element = $doc->getElementById("content-node-89");
print $doc->saveXML($element);

?>

nginx, drupal, modx