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

Комментарии

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

Следующим пунктом с которым мне удалось разобраться был поиск. Для установки поисковой формы на сайт ни каких особо сложных действий не требуется Для начала правим шаблон. В том месте где должна стоять поисковая форма просто пишем $SearchForm после чего необходимо поправить таблицу стилей для этой формы сама форма имеет класс SearchForm_SearchForm соответственно поле ввода можно [...]


21 Декабрь 2009 · MODx, о работе

Обещанная статья по созданию шаблонов на MODx. Данная статья написана мною исходя из достаточно большого практического опыта работы с MODx. Идеи изложенные здесь далеко не новы и опытный разработчик, вероятно не найдет здесь для себя ни чего нового.А вот новичкам изложенный здесь материал может быть не только интересен, но и полезен На мой взгляд проще [...]


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 помогу чем смогу

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

Счетчик