Поиск по блогу

четверг, 16 ноября 2017 г.

Настройка доступа к общим изображениям в Yii2 advanced

Использование общих изображений для frontend и backend оказалось далеко не тривиальной задачей. В интернете было найдено множество "советов", однако по большей части они так и остались советами.
Предлагается практическое руководство по настройке загрузки и хранения общих картинок для Yii2 advanced на OpenServer под управлением Windows 10.



Для начала определимся с местом хранения картинок. Правильно хранить общие изображения в каталоге /common/images или в корневом /images.  Если вы планируете использовать каталог с названием images, например, в frontend/web/images, то вам придется либо использовать, как вариант frontend/web/img или использовать общие каталоги /common/img или /img. Понятно, что названия папок могут быть любые, главное, чтобы они не были одинаковы для общей папки и папки внутри *end/web.

Файл .htaccess

Немаловажный момент. В сети можно найти много вариантов этого файла. Я рекомендую воспользоваться вот этим руководством. Решение интересно тем, что используется не три, а всего лишь один файл .htaccess который расположен в корневом каталоге. На всякий случай приведу его листинг:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
 
# if request begins with /admin remove admin and ad /backend/web/
RewriteCond %{REQUEST_URI} ^/admin
RewriteRule ^admin/?(.*) /backend/web/$1
 
# other requests add /frontend/web/$1
RewriteCond %{REQUEST_URI} !^/(frontend/web|backend/web|admin)
RewriteRule (.*) /frontend/web/$1
 
# if frontend request 
RewriteCond %{REQUEST_URI} ^/frontend/web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /frontend/web/index.php 
 
# if backend request
RewriteCond %{REQUEST_URI} ^/backend/web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /backend/web/index.php 

Загрузка картинок

Реализация загрузки изображений не составляет особого труда и доступно из коробки. Простой вариант хорошо описан в руководстве, например, здесь. Подробно останавливаться на этом я не буду. Возьмем лишь  за основу указанное руководство и внесем некоторые коррективы.
Во первых, изменим папку назначения на /images. Для этого создадим алиас для загрузки картинок в файле /common/config/bootstrap.php:
Yii::setAlias( 'com_images', dirname( dirname( __DIR__ ) ) . '/images' );
Таким образом мы определили алиас @com_images который будет доступен для front- и back-end. Теперь класс модели upload() будет иметь такой вид:

public function upload() {
 if( $this->validate() ) {
  $imgPath = Yii::getAlias( '@com_images' ) . DIRECTORY_SEPARATOR.'subdir';
   
  $this->delImageFile($imgPath);
   
  $this->foto = uniqid() . '.' . $this->imageFile->extension;
  $this->imageFile->saveAs( $imgPath . $this->foto );
  return TRUE;
 }
 else {
  return FALSE;
 }
}
private function delImageFile($path) {
 
 if( is_file( $path . $this->foto ) ) {
  unlink( $path . $this->foto );
 }
}

В foto у меня сохраняется имя файла картинки которое формируется с помощью PHP функции uniqid() и далее сохраняется в базе. Также добавлена функция удаления файла delImageFile() которая удаляет существующий файл при замене картинки.

В форму я добавил отображение картинки, если она существует. И в этом, как раз и заключается проблема.

Отображение картинок

Картинку мы загрузили как вы помните в /images. Теперь попробуем ее вывести.
Выводить будем в форме представления (продолжаем по руководству). Добавим после:

<?= $form->field($model, 'imageFile')->fileInput() ?>
такой код:
<?php if( strlen( $model->foto ) ) :?>
 <?= Html::img( 'backend/web/images/subdir/'.$model->foto); ?>
<?php endif ?>

В качестве пути к картинке мы указали backend/web/images/subdir/. Для frontend будет соответственно  frontend/web/images/subdir/.
Теперь нам необходимо сделать симлинки на нашу папку  /images. Оказывается в Windows это не так сложно. Пользуемся этим руководством. Я воспользовался утилитой Link Shell Extension.
Открываем проводник находим нашу папку /images кликаем  правой кнопкой выбираем Запомнить источник ссылки. Затем идем в  backend/web и внутри папки жмем правую кнопку выбираем Пометить как / Символическую ссылку. То же делаем для каталога frontend/web
Внутри этих папок будет создан файл символической ссылки на нашу папку  /images  И вот теперь наши пути backend/web/images/subdir/  и  frontend/web/images/subdir/ будут работать.
Для удобства в frontend/config/bootstrap.php и backend/config/bootstrap.php создадим алиас:
Yii::setAlias( 'cimages', '@siteurl/frontend/web/images/' );
а в common/config/bootstrap.php добавим:
Yii::setAlias( 'siteurl', 'http://mysite.com' );

Теперь можно использовать код:
<?= Html::img( '@cimages/subdir/'.$model->foto); ?>
в любой части сайта.
Не забываем почистить кеш и assets.

Комментариев нет :

Отправить комментарий

Есть что сказать - скажи