И правда, почему? Я бы сформулировал это так: если вы научитесь понимать 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, то у вас будет в сотни раз меньше вопросов что и как работает.