Загрузка изображений в 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');
}
}
По материалам видео: