Загрузка изображений в Yii2 через редактор Imperavi
Добавление поля imageUpload в Imperavi
Итак, данный пост является кратким конспектом видео Максима Тимофеева на тему загрузки изображений через редактор imperavi. Ссылка на сам редактор: imperavi
Пример того, как в ActiveForm добавлять поле с данным редактором:
$form->field($model, 'text')->widget(Widget::className(), [ 'settings' => [ 'lang' => 'ru', 'minHeight' => 200, 'plugins' => [ 'clips', 'fullscreen', ], 'imageUpload' => Url::to(['/site/save-redactor-img', 'sub' => 'blog']), ], ]);Ключевое здесь:
'imageUpload' => Url::to(['/site/save-redactor-img', 'sub' => 'blog'])
/site/save-redactor-img - это action actionSaveRedactorImg в контроллере SiteController, в котором собственно и будет реализовываться логика загрузки изображения.
Добавление yii2-image
Также необходимо добавить yii2-image. Тут всё просто:
{ "require": { "yurkinx/yii2-image": "dev-master" } }в composer.json. После чего выполняем:
composer update
Далее создаём новый alias в файле common/config/bootstrap.php(advanced-приложение)
Yii::setAlias('@images', dirname(dirname(__DIR__)) . '/frontend/web/uploads/images');
Ну и собственно код контроллера, отвечающего за загрузку файлов:
public function actionSaveRedactorImg($sub = 'main') { $this->enableCsrfValidation = false; if (Yii::$app->request->isPost) { $dir = Yii::getAlias('@images') . '/' . $sub . '/'; if (!file_exists($dir)) { FileHelper::createDirectory($dir); } $result_link = str_replace('admin', '', Url::home(true)) . 'uploads/images' . '/' . $sub . '/'; $file = UploadedFile::getInstanceByName('file'); $model = new DynamicModel(compact('file')); $model->addRule('file', 'image')->validate(); if ($model->hasErrors()) { $result = [ 'error' => $model->getFirstError('file') ]; } else { $model->file->name = strtotime('now') . '_' . Yii::$app->getSecurity()->generateRandomString(6) . '.' . $model->file->extension; if ($model->file->saveAs($dir . $model->file->name)) { $imag = Yii::$app->image->load($dir . $model->file->name); $imag->resize(100, NULL, Yii\image\drivers\Image::PRECISE) ->save($dir . $model->file->name, 85); $result = ['filelink' => $result_link . $model->file->name, 'filename' => $model->file->name]; } else { $result = [ 'error' => Yii::t('vova07/imperavi', 'ERROR_CAN_NOT_UPLOAD_FILE') ]; } Yii::$app->response->format = Response::FORMAT_JSON; return $result; } } else { throw new BadRequestHttpException('Only Post is allowed'); } }
По материалам видео: