Путь к файловой системе для изображений

Я пишу пользовательский помощник, который расширяет HtmlHelper и переопределяя \HtmlHelper::image() метод для расчета размеров изображения и добавления их в качестве атрибутов HTML. То, что у меня пока хорошо работает для обычных картинок:

public function image($path, $options = array()) {
    if (!array_key_exists('width', $options) && !array_key_exists('height', $options)) {
        $stamp = Configure::read('Asset.timestamp');
        Configure::write('Asset.timestamp', false);

        $path = $this->assetUrl($path, $options + array('pathPrefix' => Configure::read('App.imageBaseUrl')));
        list($width, $height) = @getimagesize(rtrim(WWW_ROOT, '\\/') . $path);
        if (!is_null($width)) {
            $options['width'] = $width;
        }
        if (!is_null($height)) {
            $options['height'] = $height;
        }

        Configure::write('Asset.timestamp', $stamp);
    }
    return parent::image($path, $options);
}

... но имеет эти недостатки:

  • Картинки из плагинов не могут быть расположены на диске (и они должны), например:

    echo $this->Html->image('/debug_kit/img/cake.icon.png', array('alt' => 'CakePHP'));
    

    … Производит этот путь к файловой системе:

    …\src\webroot/debug_kit/img/cake.icon.png
    

    ... таким образом getimagesize() терпит неудачу, потому что фактическое местоположение:

    …\src\Plugin\DebugKit\webroot\img\cake.icon.png"
    
  • Внешние картинки (которые следует игнорировать) проходят через весь процесс:

    echo $this->Html->image('http://placekitten.com/200/300');
    …\src\webroothttp://placekitten.com/200/300
    

Я искал встроенный метод для преобразования URL изображения CakePHP (в любом формате, принятом \HtmlHelper::image() в путь файловой системы (о что-то вроде null когда не подходит) но я не смог найти ни одного. Собственные функции, которым нужен путь к диску, например \Helper::assetTimestamp() обернуты в тонны одноразового кода.

Есть ли элегантное решение?

2 ответа

Решение

Я бы сказал, что есть всего 3 варианта:

  • Отправьте патч для добавления функциональности поиска пути к файловой системе ресурса в ядро.
  • Скопируйте много кода из помощника (assetUrl(), webroot(), а также assetTimestamp()).
  • Используйте веб-запросы для локальных URL-адресов (в идеале в сочетании с кэшированием).

Попробуйте использовать DS вместо \ или /, они иногда могут вызвать проблемы с ОС. DS - это разделитель каталогов, предоставляемый CakePHP Short для PHP DIRECTORY_SEPARATOR, который находится в Linux и Windows. Проверьте документ

Другие вопросы по тегам