В последнее время все чаще и чаще в 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(′secretkey′,properties,''));
/* (Not needed at this time)
define('AWS_ACCOUNT_ID',modx−>getOption(′aws.accountid′,config,''));
define('AWS_CANONICAL_ID',modx−>getOption(′aws.canonicalid′,config,''));
define('AWS_CANONICAL_NAME',modx−>getOption(′aws.canonicalname′,config,''));
define('AWS_MFA_SERIAL',modx−>getOption(′aws.mfaserial′,config,''));
define('AWS_CLOUDFRONT_KEYPAIR_ID',modx−>getOption(′aws.cloudfrontkeypairid′,config,''));
define('AWS_CLOUDFRONT_PRIVATE_KEY_PEM',modx−>getOption(′aws.cloudfrontprivatekeypem′,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(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(); В общем поковыряйте на досуге эти объекты. Они могут очень даже пригодиться.