Я бы сформулировал это так: если вы научитесь понимать xPDO-объекты, их методы и принципы, вы сможете творить в MODX вообще что угодно!
Вот еще небольшой пример: мне достался сайт, на котором «галерея» была организована на уровне документов (modResource). То есть один элемент — это один документ, в котором загружена картинка и прописано описание. И это все мне надо перенести в Gallery по альбомам, вместе с описаниями, названиями и файлами.
Элементов довольно много, потому я просто написал скриптик и выполнил его через консоль.
Скрипт писал минут 30, не больше. Сэкономил себе минимум пару часов, и то потому что элементов не так много было. А мог бы и больше времени сэкономить. Но главное — подобные вещи творить (не в высоком смысле слова) можно часто и где угодно. Используют они стандартные метода. Подробности под катом.
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, то у вас будет в сотни раз меньше вопросов что и как работает.