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

В последнее время все чаще и чаще в MODX используются источники файлов (Media Source).

Хочу на заметку продемонстрировать пару примеров, чтобы показать, насколько это удобный инструмент. Следует отметить, что с медиасурсами можно работать не только в связке с TV-параметрами и статическими элементами, а как с самостоятельными объектами для формирования УРЛ и прочих путей до файлов.

Итак, примеры.

Инициализируем медиасурс.
$id = 2;    // ID медиасурса
// Получаем объект
$source = $modx->getObject('sources.modMediaSource', $id);
// Инициализируем 
$source->initialize();    


Сила xPDO в том, что вам не приходится заморачиваться какой именно тип медиасурса используется, будь то файловая система, облака AmazonS3 или какие-либо свои кастомные, расширяющие modMediaSource. Данные всех медиасурсов хранятся в одной таблице, и xPDO сам определит, какой именно тип объекта будет возвращен в $modx->getObject('sources.modMediaSource', $id);
Подробней о том, как это происходит, написано здесь: community.modx-cms.ru/blog/research/9457.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();


В общем поковыряйте на досуге эти объекты. Они могут очень даже пригодиться.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.