Подпишитесь на RSS, чтобы всегда быть в курсе событий.
Комментарии
- Denis: Попробуйте обновить кэш
- porcelanosa: У меня почему-то ничего не появилось — т.е. после применения к странице шаблона — ничего не...
- Mark Hamstra: I used Google Translate to read this post, and just wanted to add that those issues should have been...
- безимени: все было бы прекрасно если бы не гигантское количество грамматических ошибок. Серьезно. Глаза режет
- Vasiliy Ivanov: Уже есть рабочий плагин, если готовы заняться — ради бога.=) Напишите только в разработчики...
С наступившим новым годом
Читайте так же:Снова про книгу о MODxИнтересное наблюдениеС новым годомРазговором с начальством навеянноСамооборона 100%
Перенос данных с MODx Evo на MODx Revo
С выходом новой версии MODx Revolution у меня встал вопрос о переносе данных со старой версии системы на новую. На одном из проектов пришлось столкнуться с задачей в плотную. На сервере было более 2000 документов и переносить их вручную был не вариант. Не скажу, что моё решение отличается оригинальностью и изяществом, на это просто не [...]
Метки
Ссылки
Перенос данных с MODx Evo на MODx Revo
С выходом новой версии 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://Сайт Никита
-
http://unix.am Юрик Дертлян
-
http://loom-studio.net Denis
-
http://unix.am Юрик Дертлян
-
http://loom-studio.net Denis
-
cmed
-
cmed
Рубрики
Архивы
- Май 2012
- Февраль 2012
- Январь 2012
- Ноябрь 2011
- Октябрь 2011
- Июль 2011
- Июнь 2011
- Май 2011
- Апрель 2011
- Март 2011
- Февраль 2011
- Январь 2011
- Декабрь 2010
- Июль 2010
- Июнь 2010
- Март 2010
- Февраль 2010
- Январь 2010
- Декабрь 2009
- Ноябрь 2009
- Октябрь 2009
- Сентябрь 2009
- Август 2009
- Июнь 2009
- Май 2009
- Апрель 2009
- Март 2009
- Февраль 2009
- Январь 2009

