Единственно что, так это я не понял нафига делать такую замудренность в виде base(Path/Url)Relative. Ведь можно же было всё это автоматически определять по наличию/отсутствию слэша/MODX_BASE_PATH в начале строки basePath/baseUrl медиасоурса и, исходя из этого, формировать конечный адрес. Т.е., к примеру, вот кусок кода моего компонента:
function getFileUrl ($input) { $fileUrl = $this->fileHandler->getDirectoryFromFile($input); // если в $input из сниппета пришла строка вида - "filename.ext", т.е. без слэшей и папок if ($fileUrl == './') { $fileUrl = ''; } $inputUrlType = ''; // если адрес относительный if (!$this->isAbsoluteUrl($fileUrl)) { // значит пришёл адрес вида "images/picture.jpg" $inputUrlType = 'relative'; } // если абсолютный, но не существующий и не содержащий MODX_BASE_PATH в начале строки else if (!file_exists($fileUrl) && strpos($fileUrl, $this->basePath) !== 0) { // значит пришёл адрес вида "/images/picture.jpg" $inputUrlType = 'absolute'; } else { // иначе пришёл полный физический путь. // так сделаем же из него абсолютный! $fileUrl = '/'. substr($fileUrl, strlen($this->basePath)); $inputUrlType = 'absolute'; } $fileUrl = $this->fileHandler->sanitizePath($fileUrl); $fileUrl = $this->fileHandler->postfixSlash($fileUrl); $this->inputUrlType = $inputUrlType; $this->fileUrl = $fileUrl; return $this->fileUrl; } function getFilePath () { switch ($this->inputUrlType) { // если файл пришёл в виде относительного урл case 'relative': $filePath = $this->basePath .'/'. $this->baseUrl .'/'. $this->fileUrl; break; // если файл пришёл в виде абсолютного урла case 'absolute': $filePath = $this->basePath .'/'. $this->fileUrl; break; } $this->filePath = $this->fileHandler->sanitizePath($filePath); return $this->filePath; } function isAbsoluteUrl ($path) { $path = $this->fileHandler->sanitizePath($path); return (substr($path, 0, 1) == '/'); }
И вот здесь абсолютно пофигу — пришёл ли относительный путь, абсолютный или вообще полный физический — всё корректно обработается и вернутся правильные fileUrl и filePath. Поэтому эти 2 настройки (base(Path/Url)Relative) поначалу меня и ввели в замешательство — я думал, что такое, как и у меня, должно на автомате обрабатываться :-)