Для загрузки через ajax пишем следующий код:
View — дописываем Javascript для отправки данных по ajax
<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\helpers\Url;
/* @var $this yii\web\View */
/* @var $model app\models\Krujki */
$this->title = $model->name;
$this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Моя страница'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
$script = "
$('form').submit(function(e){
var formData = new FormData($(this)[0]);
$.ajax({
type: 'post',
url:'". Url::to(['myFunction'])."',
data: formData,
cache: false,
contentType: false,
processData: false,
success: function(data) {
}
})
e.preventDefault();
return false;
});
";
$this->registerJs($script);
?>
<form id="myForm">
<input id="idmodel" type="hidden" name="idmodel" value="<?=$model->id;?>" />
<input id="myFiles" type="file" name="myFiles"/>
<input type="submit" value="Загрузить">
</form>
Controller — в контроллере необходимо отключить проверку CSRF для вашего action куда будет посылаться обработка данных через ajax
<?php
namespace backend\controllers;
use Yii;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\web\UploadedFile;
class MyController extends Controller
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
];
}
// ОТКЛЮЧАЕМ CSRF
public function beforeAction($action)
{
if ($action->id === 'myFunction') {
$this->enableCsrfValidation = false;
}
return parent::beforeAction($action);
}
// AJAX ЗАГРУЗКА
public function actionMyFunction()
{
$key = Yii::$app->request->post();
$file = $_FILES;
$id = $key['idmodel'];
$model = $this->findModel($id);
$model->myFiles = UploadedFile::getInstanceByName('myFiles');
if ($model->myUpload()) {
$model->save(false);
}
}
}
Model — в модель дописываем функцию для сохранения файла
public function myUpload()
{
if ($this->validate()) {
$names='';
$filename = Yii::$app->getSecurity()->generateRandomString(15);// Генерируем название файла при сохранение
$file = $this->myFiles;
$file->saveAs('uploads/' . $filename . '.' . $file->extension);
$names.= $filename . '.' . $file->extension;
$this->path=$names;//Поле в базе куда сохраняем название
return true;
} else {
return false;
}
}

Добавить комментарий