Последнее обновление: 10.02.2013 в 21:16
Подпишись на RSS
rss Подпишитесь на RSS, чтобы всегда быть в курсе событий.

Комментарии

Присоединяйтесь к обсуждению
  • Евгений: Доброго времени суток. Кто-то подскажет, как правильно настроить вывод мета-тэгов в результатах поиска. На...
  • Евгений: Доброго времени суток. Возник вопрос по специфике движка SilverStripe. Есть основное зеркало сайта вида...
  • Вадим: Спасибо помогло, сделал так date_timezone = Europe/Kiev
  • John Doe: Не помогло, шаблон все ровно всегда такой же как у главной страницы ((
  • Алексей: Здравствуйте. Спасибо за статью. Собираюсь осваивать MODx (сейчас сижу на WP) и статья очень пригодилась!...
25 Июнь 2011 · MODx, Проекты

Раннее, я уже упоминал библиотеку для работы с Excel файлами PHPExcel. Недавно пришлось для нескольких сайтов возможность отображения данных из Excel файла. Далее этот процесс расписан по шагам. Для профессионалов эта статья вероятно не откроет ни чего нового, но вот для тех, у кого есть время только на ответы она может быть полезной Итак, для [...]


2 Май 2012 · MODx

Недавно столкнулся с ситуацией, описанной в заголовке статьи. При изменении шаблона, страница перегружается и шаблон остается таким как был до изменения. Поиск по рунету ни чего особенного не дал, сложилось ощущение, что о проблеме знают давно, но как решать все молчат. Порывшись по просторам сети нашел весьма неожиданное решение. Идем в системные настройки(System settings), Ищем [...]


30 Январь 2011

Перенос данных с MODx Evo на MODx Revo

Рубрика: MODx. Метки: ,
Vote This Post DownVote This Post Up (+1 rating, 1 votes)
Loading ... Loading ...

С выходом новой версии MODx Revolution у меня встал вопрос о переносе данных со старой версии системы на новую.  На одном из проектов пришлось столкнуться с задачей в плотную. На сервере было более 2000 документов и переносить их вручную был не вариант.

Не скажу, что моё решение отличается оригинальностью и изяществом, на это просто не было времени, но по крайней мере оно сработало.

Под катом  пошаговый алгоритм со всеми необходимыми исходниками. В приципе  всё  тривиально.

Предисловие: Для начала предполжим, что у вас уже есть готовый сайт на MODx Revolution т.е все шаблоны, чанки и сниппеты находятся на своих местах и вопорс только в том, что бы перенести сами данные.

Шаг 1: Итак, во-первых, нам нужно получить собственно копию дерева документов сайта на MODx Evo, в формате который потом можно спокойно разобрать штатными средствами PHP. Я в своем проекте создал для этого отделный шаблон(с именем backup) в котором просто поставил вызов нижеследующего сниппета.

<?php
// определяем каталог в котором в итоге окажется файл с копией 
// БД
$path = dirname(realpath('.'));
// и создаем его
  $f=fopen($path.'/httpdocs/assets/database.txt','a+');
 $fa=array();
// получаем список документов дерева
 $table = $modx->getFullTableName( 'site_content' );
 $result = $modx->db->select( 'id',$table);
 $articles = $modx->db->getColumn( 'id', $result );
//или его части
//$articles=$modx->getChildIds(***,10);
// далее для каждого документа... 
 foreach($articles as $item)
 {
  $string=array();
//если он не пуст
  if($item)
 {
// получаем список всех полей
  $fields=$modx->getTemplateVarOutput('*',$item);
// если он не пуст и это не наш текущий документ 
  if(is_array($fields) && $item['id']!=$modx->documentIdentifier)
  foreach($fields as $key=>$value)
  {
// склдываем все поля в массив в виде пары ключ-значение 
// разделители взяты условно что бы не проявиться в текстовых 
// полях
   $string[]=$key."=|=|=".$value."|||EOF|||";
  }
//сохраняем полученный массив в файл ...
  fputs($f,implode("\r\n",$string));
// и добавляем маркер "конец записи"
  fputs($f,"\r\n-----EOR-----\r\n");
 }
 }
  fclose($f);
  echo "Thats all";
?>

Далее создаем новый документ и задаем ему шаблон backup после чего из фронтенда вызываем новый документ и в корневом каталоге сайта получаем файл database.txt в котором и содержатся все документы нашего сайта со всеми полями.

Переносим этот файл в корень сайта с Revolution

Шаг 2:
В корневом каталог нашего сайта, куда мы раньше поместили файл database.txt создаем файл export.php со следующим содержиым.

<?php
//подключаем и иннициализируем MODx без отображения сайта
define('MODX_API_MODE', true);
include('index.php');
//считываем наш файл БД в память 
$f=implode('',file('database.txt'));
//на всякий случай
set_time_limit(0);
//разбиваем файл на документы по зараннее заданному 
//разделителю
$pages=explode("\r\n-----EOR-----\r\n",$f);
//для каждого документа
foreach($pages as $page)
{
 //разбиваем его по маркеру "конец поля"
 $fields_raw=explode("|||EOF|||",$page);
 $fields=array();
//получаем в массив значений полей
 foreach($fields_raw as $field_raw)
 {
   $tmp=explode('=|=|=',$field_raw);
   $fields[trim($tmp[0])]=$tmp[1];
 }
// проверка на пустую строку
 if($fields['id']!='')
 {
// выводим отладочную информацию
 	echo $fields['id']."-".$fields['template']."<br />";
	$object = $modx->newObject('modResource');
//устанавливаем значения полей документа
	$object->set('id', $fields['id']);
	$object->set('pagetitle', $fields['pagetitle']);
	$object->set('isfolder', $fields['isfolder']);
	$object->set('longtitle', $fields['longtitle']);
        $object->set('description', $fields['description']);
        $object->set('alias', $fields['alias']);
        $object->set('published', $fields['published']);
        $object->set('introtext', $fields['introtext']);
// меняем синтаксис до modx revo
        $object->set('content', str_replace(array('[~','~]'),array('[[~',']]'),$fields['content']));
 
// Внемательно следим что бы шаблоны в старой и новой версии 
// совпадали если надо меняем ID шаблона в соответствии со 
// структурой текущего сайта см. пояснение 1
	if($fields['template']=='4')
	{ 
		$object->set('template', '2');
	}
        $object->set('menuindex', $fields['menuindex']);
        $object->set('searchable', $fields['searchable']);
        $object->set('cacheable', $fields['cacheable']);
        $object->set('createdby', $fields['createdby']);
        $object->set('editedby', $fields['editedby']);
        $object->set('deleted', $fields['deleted']);
        $object->set('publishedby', $fields['publishedby']);
        $object->set('createdon', $fields['createdon']);
        $object->set('publishedon', $fields['publishedon']);
        $object->set('editedon', $fields['editedon']);
        $object->set('menutitle', $fields['menutitle']);
        $object->set('donthit', $fields['donthit']);
        $object->set('haskeywords', $fields['haskeywords']);
        $object->set('hasmetatags', $fields['hasmetatags']);
        $object->set('hidemenu', $fields['hidemenu']);
	$object->set('parent', $fields['parent']);
// сохраняем подготовленный документ
	$object->save();
// переносим значения TV параметров в зависимости от шаблона
	if(($fields['template']=='5')
	{
		$tv = $modx->getObject('modTemplateVar', array('name'=>'text'));
		$tv->setValue($fields['id'],$fields['text']);
		$tv->save();
	}
 
 }
}
?>

Хочу подробнее остановиться на двух моментах.
1) Если на вашем старом сайте шаблон для страницы с текстовым содержимым имеет id=2, а на новом id=5 то в соответствующей секции файла добавить следующий фрагмен

 	if($fields['template']=='2')
	{ 
		$object->set('template', '5');
	}

2) TV параметры должны быть созданы, зараннее все значения параметров для старого сайта должны присутствовать на новом для параметров где это имеет смысл

Всё переходим по ссылке
http://[имя вашего сайта]/[папка если надо]/export.php

теперь мы имеем копию данных со старого сайта на новом.

Заключение: Данный способ не является оптимальным и скорее всего можно внести ещё много усовершенствований данная статья может служить скорее базовым примером на основе которого можно пердложит ешё множество решений.

Если у вас появятся вопросы замечания или предложения милости прошу в коментарии.

Читайте так же:



  • http://Сайт Никита

    Спасибо вам за ваш пост! :)
    У меня вопрос: Какую команду надо написать в modx revolution, чтобы получить id текущего документа?
    В modx evolution это было:
    $id = $modx->documentIdentifier;

    • http://loom-studio.net Денис

      Примерно так
      $id=$modx->resource->get(‘id’);

  • http://unix.am Юрик Дертлян

    Спасибо за интересный метод. Он послужил отправной точкой для меня. В своем случае я решил облегчить задачу: установил Revolution на одном сервере с Evolution (на временный поддомен). База данных тоже одна на двоих (у Evo и Revo разные префиксы таблиц). Теперь можно спокойно считывать из базы старые данные (при помощи MySQL-команд) и конвертировать их при помощи xPDO в новые. Помимо документов, в моем случае предусмотрена возможность переноса комментариев из Jot в Quip. Также возможно реализую перенос пользователей.

    • http://loom-studio.net Denis

      Вам, спасибо за комментарий.
      На самом деле было бы очень интересно посмотреть на реализацию Вашего метода, у меня сайт был с одним пользователем и без комментариев. :) Если не сложно опишите как Вы переносили части, которых нет в моем описании

      • http://unix.am Юрик Дертлян

        Не хотелось выкладывать рабочий вариант, но раз вы просите, выкладываю: http://text20.ru/21071 (первый сервис, который нашёл, там что-то с экранированием не так, но суть будет понятна).
        Я создал сниппет Migration и вызываю его с главной страницы Revolution-варианта (c GET-параметром migrate). $prefix — префикс Evolution-таблиц, $templates — массив соответствия кодов старых шаблонов новым. В SQL стоят лимиты, т.к. я пока в режиме тестирования (можно убрать). Это сырой рабочий вариант (из которого я убрал все «кастомные» блоки), который я на данный момент дорабатываю под свою конкретную задачу.
        Если будет время, по завершении оформлю сниппет и выложу в общее пользование.

        • http://loom-studio.net Denis

          Ещё раз большое спасибо.сейчас есть идея модуля позволяющего переносить данные с Evo на Revo, чувствую потом будет интересно сравнить версии :)

  • cmed

    А как все же сделать перенос значений тв-параметров? У меня часть текстов вбивается непосредственно на отдельных страницах в тв-параметры.
    Тв-параметров немного, пару штучек всего, может как-то можно id и содержимое дописать и куда? Спасибо заранее.

    • http://loom-studio.net Денис

      Не совсем понял вопрос. Напишите пожалуйста через форму обратной связи.

    • cmed

      начал экспериментировать. vps сервер, видимо какой-то функции не хватает — при запуске export.php выдает 500 ошибку

      • http://loom-studio.net Денис

        напишите на почту loomst[at]gmail[dot].com помогу чем смогу

Мы плетем паутину
Создание сайтов для меня это не просто работа, это то, что больше всего мне нравится в этой жизни. Я постояно учусь новому и кое-что попадает на страницы этого блога. Сюда же я выкладываю свои мысли о жизни. Заходите, читайте, спрашивайте.

Счетчик