Локальные URL - грабли №2

Вступив не неблагодарный путь работы с локальными URL (URL в рамках данного хоста без http://hostname/) я ошибочно полагал что все проблемы закончатся на исправлении данных в БД (здесь я типа обратился к сайдбару, в котором по ajax нашел ссылку на статью или какой другой объект и вставил в текст). Но не тут то было... Следующая грабля поджидает нас при попытке генерить изображения различных размеров. В частности common/plugins/topicintro/classes/modules/topic/entity/Topic.entity.class.php—>getPreviewImageUrl() спотыкается на проверке if (F::File_IsLocalUrl($sUrl)) и далее соответственно возвращает просто URL на исходник и тяни его CSS как хочешь.

Такое поведение происходит по целому ряду причин. В первую очередь это false в engine/include/functions/File.php—>LocalPath()
не нашел ничего лучше чем закостылить:

    static public function LocalPath($sPath, $xRoot) {

        $xResult = false;
        if (is_array($xRoot)) {
            foreach ($xRoot as $sRoot) {
                $xResult = static::LocalPath($sPath, $sRoot);
                if ($xResult) {
                    return $xResult;
                }
            }
            return $xResult;
        } else {
            $sRoot = (string)$xRoot;
        }
        if ($sPath && $sRoot) {
            $sPath = static::NormPath($sPath);
            $sRoot = static::NormPath($sRoot . '/');
            //135
            // костылим local URL
            if (substr($sPath, 0, 1) === '/')
                return substr($sPath, strlen($sRoot));
            elseif (strpos($sPath, $sRoot) === 0 || strpos($sPath . '/', $sRoot) === 0) {
                return substr($sPath, strlen($sRoot));
            }
        }
        return $xResult;
    }


Следующая грабля поджидает в engine/include/functions/File.php:ImgModSuffix(). Тут уже интереснее. Здесь потерпят фиаско уже не только попытки работы с local URL, но и все, кто попробует задать высоту вместе с шириной [и с crop/fit/pad]. Вносим минимальные правки — добавляем второй делитель и исправляем экстракцию высоты:

    static public function ImgModSuffix($xSize = null, $sExtension = null) {

        $sResult = '';
        $nPos = strpos($xSize, 'x');
        $mPos = strpos($xSize, '-');
        if ($nPos === false) {
            $nHeight = $nWidth = intval($xSize);
        } elseif ($nPos === 0) {
            $nWidth = 0;
            $nHeight = intval(substr($xSize, 1));
        } else {
            $nWidth = intval(substr($xSize, 0, $nPos));
            $mPos ? $nHeight = intval(substr($xSize, $nPos + 1, $mPos)) : $nHeight = intval(substr($xSize, $nPos + 1));
        }
        if ($nWidth || $nHeight) {
            $sResult .= '-' . ($nWidth ? $nWidth : '') . 'x' . $nHeight;
            if (strpos($xSize, 'fit')) {
                $sResult .= '-fit';
            } else if (strpos($xSize, 'crop')) {
                $sResult .= '-crop';
            } else if (strpos($xSize, 'pad')) {
                $sResult .= '-pad';
            }
            if ($sExtension) {
                $sResult .= '.' . strtolower($sExtension);
            }
        }
        return $sResult;
    }


Теперь получаем правильное имя файла, но если у нас его пока ещё нет, то чтобы он генерился в случае local URL нам надо в engine/include/functions/File.php—>Url2Dir() этот local URL закостылить, иначе проверка исходника на существование не пройдёт и $this->Img_Duplicate($sFile) в getPreviewImageUrl() не случится.

Похожие статьи


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

Автор статьи запретил добавлять комментарии