Путь к файловой системе для изображений
Я пишу пользовательский помощник, который расширяет 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. Проверьте документ