Импорт узла с другого сайта

Периодически бывает задача скопировать каталог с одного сайта на другой. Если сайт «чистый», то можно пойти копированием таблиц. А вот если на сайте реципиенте есть уже какая-то структура, если ID идут вразнобой, то тут возникают сложности. Для облегчения жизни написал вот такую вот канитель (не самый оптимизированный вариант, но рабочий).

На сайте доноре в корне создаем файл export.php
<?php
	define('MODX_API_MODE', true);
	define('IN_MANAGER_MODE', false);	
	include_once("index.php");	
	$modx->db->connect();	
	if (empty ($modx->config)) {
		$modx->getSettings();
	}
	$modx->runSnippet('DocLister',array('parents'=>0,'showParent'=>1,'display'=>-1,'tvPrefix'=>'','tvList'=>'mages,price','depth'=>28,'prepareWrap'=>function($data){echo '$docs = '.var_export($data,1).';';exit();}));

Здесь указываем $parents — корневой родитель, который мы качаем, ТВшки, ну и далее по вкусу.

На сайте реципиенте в корне создаем файлик import.php
<?php
	set_time_limit(0);
	define('MODX_API_MODE', true);
	define('IN_MANAGER_MODE', false);	
	include_once("index.php");	
	$modx->db->connect();	
	if (empty ($modx->config)) {
		$modx->getSettings();
	}
	include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modResource.php");	
	$file = file_get_contents('https://you_site.com/export.php');	
	eval($file);
	$docs = $docs['docs'];	
        $start = 0;
	$parents[$start] = 33523;	
	
	function form_tree($mess){
		if (!is_array($mess)) {
			return false;
		}
		$tree = array();
		foreach ($mess as $value) {
			$tree[$value['parent']][] = $value;
		}
		return $tree;
	}	
	
	function build_tree($cats, $parent_id){
		global $modx,$parents;
		if (is_array($cats) && isset($cats[$parent_id])) {
			
			foreach ($cats[$parent_id] as $cat) {
				$id = $cat['id'];				
				unset($cat['id']);
				/*
				* здесь можем подменить шаблончики и т.д.
				*/
				if ($parents[$parent_id]) $cat['parent'] = $parents[$parent_id];
				$doc = new modResource($modx);	
				$doc->create($cat);				
				$parents[$id] = $doc->save(false, false);					
				build_tree($cats, $id);				
			}			
			} else {
			return false;
		}
		return $tree;
	}	
	$tree = form_tree($docs);	
	build_tree($tree, $start);	
	echo 'Import site complete!';	

Здесь в 11-ой строке указываем сайт, с которого будем копировать, в 14-ой указываем корневой айдишник на сайте доноре, в 15-ой значение — в какой ресурс копировать.
Проверил на нескольких сайтах — работает.
По окончанию работ не забудьте снести эти файлики)

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.