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