Предлагается практическое руководство по настройке загрузки и хранения общих картинок для 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.
Комментариев нет :
Отправить комментарий
Есть что сказать - скажи