Миграция с Gallery в ms2Gallery

Сегодня стояла задача мигрировать все картинки из Gallery загруженные для каждого ресурса (вот по этой инструкции) в ms2Gallery. Да при этом в контентах всех ресурсов заменить ссылку старого изображения из TV на новую ссылку из ms2Gallery. К тому-же в конце работы, чтоб удалял старые изображения с сервера, и данные в ТВшках о старых картинках.

Результат работы под катом.


Скрипт положить в корень или можно куда-нибудь глубже в папку и запустить из браузера (надёжнее из консоли).

Чтобы удалялись данные о старых изображениях надо выставить "$remove_old = 1".

<?php

// >> Подключаем
define('MODX_API_MODE', true);

$current_dir = dirname(__FILE__) .'/';
$index_php = $current_dir .'index.php';

$i=0;
while( !file_exists( $index_php ) && $i < 9 )
{
	$current_dir = dirname(dirname($index_php)) .'/';
	$index_php = $current_dir .'index.php';
	$i++;
}

if( file_exists($index_php) )
{
	require_once $index_php;
}
else {
	print "Не удалось подгрузить MODX";
	die;
}
// << Подключаем


// >> Включаем обработку ошибок
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
// << Включаем обработку ошибок


$modx->addPackage('gallery', MODX_CORE_PATH . 'components/gallery/model/'); // подключим модель компонента "Gallery"

$modx->addPackage('ms2gallery', MODX_CORE_PATH . 'components/ms2gallery/model/'); // подключим модель компонента "ms2Gallery"


$tv_id = '1'; // TV с типом GalleryAlbum

$remove_old = 0; // после заливки удалять данные из базы о фотках и старый файл с сервера?


// >> Выборка
$q = $modx->newQuery( 'galItem' );
$q->innerJoin(
	'galAlbumItem',
	'galAlbumItem',
	'galAlbumItem.item = galItem.id'
);
$q->innerJoin(
	'galAlbum',
	'galAlbum',
	'galAlbum.id = galAlbumItem.album'
);
$q->innerJoin(
	'modTemplateVarResource',
	'modTemplateVarResource',
	'modTemplateVarResource.value = galAlbum.id AND modTemplateVarResource.tmplvarid = "'. $tv_id .'"'
);
$q->innerJoin(
	'modTemplateVar',
	'modTemplateVar',
	'modTemplateVar.id = modTemplateVarResource.tmplvarid'
);
$q->select(
	array(
		'modTemplateVarResource.contentid as id',
		'modTemplateVar.source as source',
		'galItem.id as file_id',
		'galItem.filename as filepath',
	)
);
$q->where( array(
	'modTemplateVar.type = "galleryalbumview"'.
''));
$s = $q->prepare(); //print_r( $q->toSQL() ); die;
$s->execute();
$rows = $s->fetchAll(PDO::FETCH_ASSOC);
unset($q); unset($s);
//print_r( $rows ); die;

if( !is_array($rows) OR !count($rows) ) { print 'Ничего не найдено.'; die; }
// << Выборка


$modx->loadClass('sources.modMediaSource'); // подключаем класс modMediaSource

$slashes = array('////','///','//');

$_rows = $rows;


foreach( $rows as $k => $row )
{
	$source_base_url = '/assets/gallery/';
	
	$filepath		= substr( str_replace( $slashes, '/', '/'. $source_base_url .'/'. $row['filepath'] ), 1);
	$filepath_full	= $current_dir . substr( str_replace( $slashes, '/', '/'. $source_base_url .'/'. $row['filepath'] ), 1);
	
	if( file_exists($filepath_full) )
	{
		//print $row['id'] .' '. $filepath_full; die;
		
		$response_upload = $modx->runProcessor('gallery/upload', array(
				'file'		=> $filepath,
				'id'		=> $row['id'],
			),
			array('processors_path' => MODX_CORE_PATH.'components/ms2gallery/processors/mgr/')
		);
		
		if( isset( $response_upload->response['object']['url'] ) )
		{
			$new_filepath		= substr( str_replace( $slashes, '/', '/'. $response_upload->response['object']['url'] ), 1);
			$new_filepath_full	= $current_dir . substr( str_replace( $slashes, '/', '/'. $response_upload->response['object']['url'] ), 1);
			
			if( file_exists($new_filepath_full) )
			{
				// >> Выборка и замена в ресурсах в поле "content" старого изображения на новое
				$sql = "UPDATE {$modx->getTableName('modResource')} SET content = REPLACE(content, '". $filepath ."', '". $new_filepath ."') WHERE content LIKE '%". $filepath ."%'";
				$q = $modx->prepare($sql);
				$q->execute();
				unset($q);
				// << Выборка и замена в ресурсах в поле "content" старого изображения на новое
			}
		}
		
		unset( $_rows[ array_search( $row, $_rows ) ] );
		
		
		// >> Удаляем старые файл и данные galItem, если перезалили в ms2Gallery
		if( $remove_old )
		{
			if( isset( $response_upload->response['object']['url'] ) || ( isset( $response_upload->response['message'] ) && strstr( $response_upload->response['message'], 'уже есть' ) ) )
			{
				if( !search_in_array( $row['filepath'], $_rows ) )
				{
					unlink( $filepath_full );
					
					$q = $modx->newQuery('galItem');
					$q->command('delete');
					$q->where(array(
						'id'		=> $row['file_id'],
					));
					$q->prepare();
					//print $q->toSQL(); die;
					$q->stmt->execute();
					unset($q);
				}
			}
		}
		// << Удаляем старые файл и данные galItem, если перезалили в ms2Gallery
		
		
		unset($response_upload);
	}
}


// >> Функция поиска в многомерном массиве
function search_in_array( $value, $array )
{
	foreach( $array as $k => $v )
	{
		if( array_search( $value, $v ) )
		{
			return true;
		}
	}
	
	return false;
}
// << Функция поиска в многомерном массиве
Павел Гвоздь
16 августа 2015, 19:36
modx.pro
7
1 542
+6
Поблагодарить автора Отправить деньги

Комментарии: 1

Алексей
18 марта 2016, 10:15
+1
Очень крутой скрипт! только нужно перед вызовом процессора
$response_upload = $modx->runProcessor('gallery/upload', array(
...
вставить:
$res = $modx->getObject('modResource',$row['id']);
$res->set('properties','{"ms2gallery":{"media_source":"4"}}');
$res->save();
Где media_source нужно указать ID источника файлов ms2gallery
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1