Fi1osof 23 августа 2013 0 0
И правда, почему?

Я бы сформулировал это так: если вы научитесь понимать xPDO-объекты, их методы и принципы, вы сможете творить в MODX вообще что угодно!

Вот еще небольшой пример: мне достался сайт, на котором «галерея» была организована на уровне документов (modResource). То есть один элемент — это один документ, в котором загружена картинка и прописано описание. И это все мне надо перенести в Gallery по альбомам, вместе с описаниями, названиями и файлами.

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

Скрипт писал минут 30, не больше. Сэкономил себе минимум пару часов, и то потому что элементов не так много было. А мог бы и больше времени сэкономить. Но главное — подобные вещи творить (не в высоком смысле слова) можно часто и где угодно. Используют они стандартные метода. Подробности под катом.

Сам скрипт (источник на GistHub: gist.github.com/Fi1osof/70d5197fa7ee3fc74ff7 ):
if(!$docs = $modx->getCollection('modResource', array(
    'parent' => 26
))){
    return;
}
$album = 2;
 
$albumDir = $album.'/';
// Получаем полный путь к директории альбома
$targetDir = $modx->call('galAlbum','getFilesPath',array(&$modx)).$albumDir;
 
// Получаем кеш-менеджер, который к тому же используется и для работы с папками и файлами
$cacheManager = $modx->getCacheManager();
// Если нет папки, создаем ее
if (!file_exists($targetDir) || !is_dir($targetDir)) {
if (!$cacheManager->writeTree($targetDir)) {
$modx->log(xPDO::LOG_LEVEL_ERROR,'[Gallery] Could not create directory: '.$targetDir);
return $modx->toJSON(array('error' => 'Could not create directory: ' . $targetDir));
}
}
// Проверяем, чтобы была доступна для записи
if (!is_readable($targetDir) || !is_writable($targetDir)) {
$modx->log(xPDO::LOG_LEVEL_ERROR,'[Gallery] Could not write to directory: '.$targetDir);
return $modx->toJSON(array('error' => 'Could not write to directory: ' . $targetDir));
}
$r = 0; // Счетчик ранга элемента

// Проходимся по каждому элементу
foreach($docs as $doc){
    $r++;
    $title = $doc->get('pagetitle');
    
    // Пытаемся найти картинку и получить путь
    if(!preg_match('/src="(.+?)"/', $doc->content, $match)){
        $modx->log(1, "Не было найдено изображение для документа ". $doc->id);
    }
    $img = $match[1];
    $filenm = MODX_BASE_PATH. $img; // Абсолютный путь до картинки-источника
    
    
    // Описание элемента
    $desc = strip_tags($doc->content);
    
    // Создаем новый элемент альбома
    $item = $modx->newObject('galItem', array(
        'name' => $doc->pagetitle,
    ));
    
    // Сохраняем его, чтобы получить id (будет использован для формирования имени файла)
    $item->save();
    
    // Самый быстрый способ получить расширение файла
    $extension = end(explode('.', $img));
    $filename = $item->id.'.'.$extension;
    $relativePath = $albumDir.$filename;
    $absolutePath = $targetDir.$filename;
    // Копируем картинку в папку альбома
    $cacheManager->copyFile($filenm, $absolutePath );
    
    // Набиваем конечные данные в объект элемента альбома
    $item->fromArray(array(
        'filename' => $albumDir.$filename,
        'description' => $desc,
        'active' => 1,
    ));
    
    // Создаем объект Элемент-Альбом
    $ai = $modx->newObject('galAlbumItem', array(
        'album' => $album,
        'rank' => $r,
    ));
    // Добавляем к нему элемент, чтобы сформировалась связь при сохранении
    $ai->addOne($item);
    // Сохраняем
    $ai->save();
}


То есть здесь я на уровне API MODX-а и получил нужные элементы из документов, и скопировал файлы кеш-манагером, и сразу создал все элементы в Gallery. Если кто считает, что это не удобно, хотел бы выслушать возражения.

Но главное — практически все компоненты MODX — стандартны. И если вы изучите xPDO, то у вас будет в сотни раз меньше вопросов что и как работает.
0 комментариев
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.