Николай Ланец
22 авг. 2013 г., 15:00

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

В последнее время все чаще и чаще в MODX используются источники файлов (Media Source).
Хочу на заметку продемонстрировать пару примеров, чтобы показать, насколько это удобный инструмент. Следует отметить, что с медиасурсами можно работать не только в связке с TV-параметрами и статическими элементами, а как с самостоятельными объектами для формирования УРЛ и прочих путей до файлов.
Итак, примеры.
Инициализируем медиасурс.
$id = 2; // ID медиасурса // Получаем объект $source = $modx->getObject('sources.modMediaSource', $id); // Инициализируем $source->initialize();
Сила xPDO в том, что вам не приходится заморачиваться какой именно тип медиасурса используется, будь то файловая система, облака AmazonS3 или какие-либо свои кастомные, расширяющие modMediaSource. Данные всех медиасурсов хранятся в одной таблице, и xPDO сам определит, какой именно тип объекта будет возвращен в $modx->getObject('sources.modMediaSource', $id); Подробней о том, как это происходит, написано здесь: http://modxclub.ru/blog/166.html
Здесь стоит более внимательно изучить $source->initialize(); Дело в том, что modFileMediaSource — это производный класс от modMediaSource, и есть отличия в инициализации этих объектов.
Вот метод modMediaSource::initialize
public function initialize() { $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->fileHandler = $this->xpdo->getService('fileHandler','modFileHandler', '',$options); return true; }
То есть если у нас файловый медиасурс, и мы до инициализации не присвоили ему определенный контекст, то будет присвоен текущий контекст. Это важно учитывать, так как медиасурс получает многие настройки из указанного контекста, а в различных контекстах эти настройки могут отличаться. Так же могут проверяться различные уровни доступов к контекстам.
Инииализация амазоновского медиасурса так же отличается.
public function initialize() { parent::initialize(); $properties = $this->getPropertyList(); if (!defined('AWS_KEY')) { define('AWS_KEY',$this->xpdo->getOption('key',$properties,'')); define('AWS_SECRET_KEY',$this->xpdo->getOption('secret_key',$properties,'')); /* (Not needed at this time) define('AWS_ACCOUNT_ID',$modx->getOption('aws.account_id',$config,'')); define('AWS_CANONICAL_ID',$modx->getOption('aws.canonical_id',$config,'')); define('AWS_CANONICAL_NAME',$modx->getOption('aws.canonical_name',$config,'')); define('AWS_MFA_SERIAL',$modx->getOption('aws.mfa_serial',$config,'')); define('AWS_CLOUDFRONT_KEYPAIR_ID',$modx->getOption('aws.cloudfront_keypair_id',$config,'')); define('AWS_CLOUDFRONT_PRIVATE_KEY_PEM',$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();
Посмотрим на этот метод в modMediaSource
public function getBasePath($object = '') { return ''; }
То есть сам по себе этот объект нам ничего не вернет.
Посмотрим в modFileMediaSource
public function getBasePath($object = '') { $bases = $this->getBases($object); return $bases['pathAbsolute']; }
Вот он уже нам вернет абсолютный путь до корневой папки.
А вот облачный медиасурс нам тоже ничего не сообщит о корневом разделе, так как не имеет своего метода getBasePath, а наследует «пустой» метод от modMediaSource.
А вот УРЛ до файла нам вернет файловый, и облачный медиасурс.
$url = $source->getObjectUrl('images/image.png');
Так же можно узнать базовый УРЛ до корневого раздела.
$url = $source->getBaseUrl();
В общем поковыряйте на досуге эти объекты. Они могут очень даже пригодиться.

Добавить комментарий