У нас был сайт на юкозе, бэкап ради которого нужно было вставать в 6 утра, 5 txt файлов мощнейшей кислоты, полсолонки непонятных символов и гора старых файлов и всего такого, всех цветов, а ещё литр текилы, литр рома, ящик пива. Не то чтобы это всё было нужно в переносе сайта на modx, но раз начал коллекционировать дич, то иди в своём увлечении до конца. Единственное, что меня беспокоило — это modx. В мире нет никого более беспомощного, безответственного и безнравственного, чем человек в modx'овом запое. И я знал, что довольно скоро мы в это окунёмся.
Никогда не думал, что мне прийдется возвращаться в то, с чего всё начиналось, моего первого сайта, который я собрал ещё в школе (какраз для школы его и собирал) сайт на ucoz, который просуществовал на этой платформе 12 лет, но этой весной ucoz придумал супер обновление, теперь размещение на их платформе сайта без показа рекламы обойдется в 300р в месяц... Ну и это было звоночком, что пора переносить сайт.
Создание бэкапа
Но не всё так просто в переносе оказалось:
Создать резервную копию можно только с 00 до 09. В восходящую луну. Перед нажатием три раза плюнув через левое плечо. Затем надеяться, что сегодня ваш день и в надежде ждать заветный архив с бэкапом. И вот, о чудо! Архив с бэкапом готов! Но, стоп, а где же заветные дампы баз данных, о которых нас информировал текст перед созданием бэкапа?
Д как же я сразу не догадался!!! Надо же в архиве открыть папку _s1
, а там всё что нужно! Что? Как это там нет sql дампов? Вот же news.txt
. Как это не похоже на дамп бд? А если приглядеться, то этот файл похож на csv таблицу. Сохраним файл в csv формат, и продолжим перенос.
Подготовка данных к переносу
По сути из важного и нужного со старого сайта это старые новости, со всеми картинками, ссылками на файлы и тд. Все остальные ресурсы из важных не так много, а те что нужны на новом сайте быстрее и проще перенести вручную.
Дамп базы новостей находится в файле news.txt
который предварительно сохранил в news.csv
, но если сейчас данный файл попробовать открыть, то ничего нормального мы не увидим, надо предварительно подготовить его.
Открываем файл, заменяем /_новая_строка
на пустое значение и заменяем /|
на ---
. Если что-то всё равно отображается не очень, то смотрим файл на предмет странных символов, переносов лишних (чаще всего это проявляется в контенте с тегами). Ну и после всех манипуляций становится более-менее читаемый файл, конвертируем его в более подходящий формат для переноса.
Сначала конвертируем в xlsx с помощью сервиса: https://www.convertcsv.com/csv-viewer-editor.htm
Затем открываем конвертированный файл и добавляем в шапку ключи для столбцов и удаляем лишнии столбцы. В итоге получится что-то типо такого:
Нужные поля:
- заголовок
- контент
- кол-во просмотров
- unixtime
Мне удобнее делать импорт из json массива, поэтому конвертируем в json http://beautifytools.com/excel-to-json-converter.php подгоняем массив под подходящий вид, проверяем, что файл сохраняем в кодировке utf-8, иначе при импорте могут возникнуть всякие бяки.
Всё! Данные готовы к переносу.
Импорт данных
Теперь у нас есть json файл с данными и можно эти данные перенести. Для этого написал простенький скрипт:
<?php
// показ всех ошибок
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Определяем константу
define('MODX_API_MODE', true);
// подключаем index.php
require $_SERVER['DOCUMENT_ROOT'].'/index.php';
$modx = new modX();
$pdoTools = $modx->getService('pdoTools');
// Включаем обработку ошибок
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
// получаем json с данными
$json_url = __DIR__."/data.json";
$json = file_get_contents($json_url);
$data = json_decode($json, true)["data"];
// перед началом импорта проверяем, что данные приходят корректно
// var_dump("<pre>");
// var_dump($data);
// var_dump("</pre>"); die;
$parent = 7; // id родителя
$template = 3; // id шаблона
$count = 0; // счетчик кол-ва импортированных ресурсов
foreach ($data as $key_news => $value_news) {
$content = $value_news["content"];
$title = $value_news["title"];
$alias = $value_news["alias"];
$hits = $value_news["hits"];
$unixtime = intval($value_news["unixtime"]);
$unixtime2 = intval($value_news["unixtime-2"]);
$time = $unixtime ?: $unixtime2;
if(!$content && !$title && !$alias && !$unixtime) continue;
$resource = $modx->newObject('modResource');
$resource->set('show_in_tree', 0); // показывать в дереве
$resource->set('hidemenu', 1); // скрыть в меню
$resource->set('parent', $parent); // id родителя
$resource->set('template', $template); // шаблон
$resource->set('alias', $alias); // алиас
$resource->set('published', 1); // опубликован
$resource->set('publishedon', $time); // дата публикации
$resource->set('createdon', $time); // дата создания
$resource->set('pagetitle', $title); // заголовок
$resource->set('content', $content); // контент
$resource->save();
// записываем кол-во просмотров в TV
$resID = $resource->get('id'); // получаем ID созданного ресурса
$tv_hits = $modx->getObject('modTemplateVar',[ 'name' => 'hits' ]); // получаем TV по имени
$tv_hits->setValue($resID, $hits);
$tv_hits->save();
unset($resource); unset($tv_hits); // Удаляем переменные
$count++;
}
$modx->cacheManager->refresh();
echo "Импорт ресурсов завершен. Кол-во: ".$count;
?>
Данный скрипт не универсальный, его стоит расценивать как шаблон, от которого можно отталкиваться подгоняя под свои задачи.
Теперь после переноса проверяем, что всё перенеслось хорошо и радуемся, какие молодцы =)
После переноса
Некоторые страницы, которые импортировали, могут выглядеть очень плохо, это связано с тем, что ucoz редактор текста очень много инлайн стилей прописывает. Для их очистки можно воспользоваться сервисом: https://html-cleaner.com/
Небольшая история
Перед переносом не успевал заняться сайтом, поэтому решил оплатить его на месяц, чтобы не спеша начать его переносить. Прошел месяц, я уже забыл, что его оплачивал, и тут с меня снова снимают оплату (а предварительно я проверил, чтобы не стояли никакие галки об автопродлении при оплате). Пишу в техподдержку, почему с меня сняли деньги, мне в ответ присылают скриншот, на котором показано, что я соглашаюсь на продление подписки:
Но вот так незадача, я то оплачивал в их новом интерфейсе и у меня там ничего такого вообще нет:
После этого была неделя молчания от них, потом мне написали, что продление отключается через панель управления подписками (в новом интерфейсе так и не смогли объяснить где он находится).
Так что будьте внимательны и не забудьте отключить автопродление.
P.S.
Давно откладывал эту статью, скорее хотел написать её не как инструкцию, а как отправную точку тем, кому вдруг достанется участь переноса сайта на ucoz. Когда я этим занялся, информации в сети вообще не было, д и не будет наверное, так как те, кому это надо и так разберутся, ну и сам сервис ucoz сейчас уже не так популярен (я так думаю).
Сам подход не сказать что очень правильный, но он занял минимальное кол-во времени, цель выполнил, так что думаю всё сделано правильно))). В любом случае, это было интересное занятие по переносу сайта, д и некоторые ссылки на сервисы, которые упомянуты в статье в дальнейшем думаю будут полезны.