Миграция с Gallery в ms2Gallery
Сегодня стояла задача мигрировать все картинки из Gallery загруженные для каждого ресурса (вот по этой инструкции) в ms2Gallery. Да при этом в контентах всех ресурсов заменить ссылку старого изображения из TV на новую ссылку из ms2Gallery. К тому-же в конце работы, чтоб удалял старые изображения с сервера, и данные в ТВшках о старых картинках.
Результат работы под катом.
Скрипт положить в корень или можно куда-нибудь глубже в папку и запустить из браузера (надёжнее из консоли).
Чтобы удалялись данные о старых изображениях надо выставить "$remove_old = 1".
Результат работы под катом.
Скрипт положить в корень или можно куда-нибудь глубже в папку и запустить из браузера (надёжнее из консоли).
Чтобы удалялись данные о старых изображениях надо выставить "$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;
}
// << Функция поиска в многомерном массиве
Поблагодарить автора
Отправить деньги
Комментарии: 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
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.