Получаем абсолютный путь файла из медиасурса.

В последнее время все чаще и чаще в MODX используются источники файлов (Media Source). Хочу на заметку продемонстрировать пару примеров, чтобы показать, насколько это удобный инструмент. Следует отметить, что с медиасурсами можно работать не только в связке с TV-параметрами и статическими элементами, а как с самостоятельными объектами для формирования УРЛ и прочих путей до файлов. Итак, примеры. Инициализируем медиасурс. id=2;//IDмедиасурса//Получаемобъектid = 2; // ID медиасурса // Получаем объект source = modx>getObject(sources.modMediaSource,modx->getObject('sources.modMediaSource', id); // Инициализируем source>initialize();СилаxPDOвтом,чтовамнеприходитсязаморачиватьсякакойименнотипмедиасурсаиспользуется,будьтофайловаясистема,облакаAmazonS3иликакиелибосвоикастомные,расширяющиеmodMediaSource.Данныевсехмедиасурсовхранятсяводнойтаблице,иxPDOсамопределит,какойименнотипобъектабудетвозвращенвsource->initialize(); Сила xPDO в том, что вам не приходится заморачиваться какой именно тип медиасурса используется, будь то файловая система, облака AmazonS3 или какие-либо свои кастомные, расширяющие modMediaSource. Данные всех медиасурсов хранятся в одной таблице, и xPDO сам определит, какой именно тип объекта будет возвращен в modx->getObject('sources.modMediaSource', id);Подробнейотом,какэтопроисходит,написаноздесь:http://modxclub.ru/blog/166.htmlЗдесьстоитболеевнимательноизучитьid); Подробней о том, как это происходит, написано здесь: http://modxclub.ru/blog/166.html Здесь стоит более внимательно изучить source->initialize(); Дело в том, что modFileMediaSource — это производный класс от modMediaSource, и есть отличия в инициализации этих объектов. Вот метод modMediaSource::initialize public function initialize() { this>setProperties(this->setProperties(this->getProperties(true)); this->getPermissions(); return true; } А вот метод modFileMediaSource::initialize public function initialize() { parent::initialize(); options = array(); if (!this->ctx) { this->ctx =& this->xpdo->context; } options['context'] = this>ctx>get(key);this->ctx->get('key'); this->fileHandler = this>xpdo>getService(fileHandler,modFileHandler,,this->xpdo->getService('fileHandler','modFileHandler', '',options); return true; } То есть если у нас файловый медиасурс, и мы до инициализации не присвоили ему определенный контекст, то будет присвоен текущий контекст. Это важно учитывать, так как медиасурс получает многие настройки из указанного контекста, а в различных контекстах эти настройки могут отличаться. Так же могут проверяться различные уровни доступов к контекстам. Инииализация амазоновского медиасурса так же отличается. public function initialize() { parent::initialize(); properties=properties = this->getPropertyList(); if (!defined('AWS_KEY')) { define('AWS_KEY',this>xpdo>getOption(key,this->xpdo->getOption('key',properties,'')); define('AWS_SECRET_KEY',this>xpdo>getOption(secretkey,this->xpdo->getOption('secret_key',properties,'')); /* (Not needed at this time) define('AWS_ACCOUNT_ID',modx>getOption(aws.accountid,modx->getOption('aws.account_id',config,'')); define('AWS_CANONICAL_ID',modx>getOption(aws.canonicalid,modx->getOption('aws.canonical_id',config,'')); define('AWS_CANONICAL_NAME',modx>getOption(aws.canonicalname,modx->getOption('aws.canonical_name',config,'')); define('AWS_MFA_SERIAL',modx>getOption(aws.mfaserial,modx->getOption('aws.mfa_serial',config,'')); define('AWS_CLOUDFRONT_KEYPAIR_ID',modx>getOption(aws.cloudfrontkeypairid,modx->getOption('aws.cloudfront_keypair_id',config,'')); define('AWS_CLOUDFRONT_PRIVATE_KEY_PEM',modx>getOption(aws.cloudfrontprivatekeypem,modx->getOption('aws.cloudfront_private_key_pem',config,'')); define('AWS_ENABLE_EXTENSIONS', 'false');*/ } include_once $this->xpdo->getOption('core_path',null,MODX_CORE_PATH).'model/aws/sdk.class.php';

$this->getDriver();
$this->setBucket($this->xpdo->getOption('bucket',$properties,''));
return true;

} То есть здесь инициализируются ключи взаимодействия с облаком. Итак, медиасурс мы проинициализировали. Что теперь мы можем с ним сделать? А теперь мы его используем по назначению. К примеру получим путь до корневого раздела. source>getBasePath();ПосмотримнаэтотметодвmodMediaSourcepublicfunctiongetBasePath(source->getBasePath(); Посмотрим на этот метод в modMediaSource public function getBasePath(object = '') { return ''; } То есть сам по себе этот объект нам ничего не вернет. Посмотрим в modFileMediaSource public function getBasePath(object = '') { bases = this>getBases(this->getBases(object); return bases['pathAbsolute']; } Вот он уже нам вернет абсолютный путь до корневой папки. А вот облачный медиасурс нам тоже ничего не сообщит о корневом разделе, так как не имеет своего метода getBasePath, а наследует «пустой» метод от modMediaSource. А вот УРЛ до файла нам вернет файловый, и облачный медиасурс. url = source>getObjectUrl(images/image.png);ТакжеможноузнатьбазовыйУРЛдокорневогораздела.source->getObjectUrl('images/image.png'); Так же можно узнать базовый УРЛ до корневого раздела. url = $source->getBaseUrl(); В общем поковыряйте на досуге эти объекты. Они могут очень даже пригодиться.