https://github.com/johnitvn/yii2-ajaxcrud
которое в свою очередь использует расширения kartik-a
http://demos.krajee.com/grid-demo
Так вот, всё это очень хорошо и красиво работает с использованием pjax и модальных окон, пока мне не потребовалось добавить загрузку файла. Для начала сделал модель формы для загрузки фото в модальном окне:
Код: Выделить всё
<?php
namespace app\models;
use Yii;
/**
* This is the model class for table "photo".
*
* @property string $id
* @property string $file_name
* @property string $name
* @property string $description
*/
class UploadPhotoForm extends \yii\db\ActiveRecord
{
public $image;
/**
* @inheritdoc
*/
public static function tableName()
{
return 'photo';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['file_name', 'description'], 'string', 'max' => 32],
[['name'], 'string', 'max' => 50],
[['image','description','name'], 'safe'],
[['image'], 'file', 'extensions'=>'jpg, gif, png'],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'file_name' => 'File Name',
'name' => 'Name',
'description' => 'Description',
];
}
}
Дальше сделал представление:
Код: Выделить всё
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use kartik\widgets\FileInput;
/* @var $this yii\web\View */
/* @var $model app\models\Photo */
?>
<div class="photo-create">
<div class="photo-form">
<?php $form = ActiveForm::begin(['options'=>['enctype'=>'multipart/form-data']]); ?>
<?php
// your fileinput widget for single file upload
echo $form->field($model, 'image')->widget(FileInput::classname(), [
'options'=>['accept'=>'image/*'],
'pluginOptions'=>['allowedFileExtensions'=>['jpg','gif','png']
]]);
?>
<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'description')->textInput(['maxlength' => true]) ?>
<?php if (!Yii::$app->request->isAjax){ ?>
<div class="form-group">
<?= Html::submitButton('Create', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php } ?>
<?php ActiveForm::end(); ?>
</div>
</div>
Код: Выделить всё
/**
* Creates a new Photo model.
* For ajax request will return json object
* and for non-ajax request if creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$request = Yii::$app->request;
$model = new UploadPhotoForm();
if($request->isAjax) {
/*
* Process for ajax request
*/
Yii::$app->response->format = Response::FORMAT_JSON;
if ($request->isGet) {
return [
'title' => "Create new Photo",
'content' => $this->renderAjax('create', [
'model' => $model,
]),
'footer' => Html::button('Close', ['class' => 'btn btn-default pull-left', 'data-dismiss' => "modal"]) .
Html::button('Save', ['class' => 'btn btn-primary', 'type' => "submit"])
];
} else if ($model->load($request->post()) && $model->validate()) {
$image = UploadedFile::getInstance($model, 'image');
ob_start();
var_dump($model);
var_dump($image);
$result = ob_get_clean();
// $photo = new Photo();
// $photo->save();
//
// $photo->file_name = 'img/photo/' .
// $photo->id . '.'
// . $image->extension;
//
// $path = Yii::$app->basePath . '/web/' . $photo->file_name;
// $image->saveAs($path);
//
// $photo->name = $model->name;
// $photo->description = $model->description;
// $photo->save();
return [
'forceReload' => '#crud-datatable-pjax',
'title' => "Create new Photo",
'content' => '<span class="text-success">Create Photo success</span>'.$result,
'footer' => Html::button('Close', ['class' => 'btn btn-default pull-left', 'data-dismiss' => "modal"]) .
Html::a('Create More', ['create'], ['class' => 'btn btn-primary', 'role' => 'modal-remote'])
];
} else {
return [
'title' => "Create new Photo",
'content' => $this->renderAjax('create', [
'model' => $model,
]),
'footer' => Html::button('Close', ['class' => 'btn btn-default pull-left', 'data-dismiss' => "modal"]) .
Html::button('Save', ['class' => 'btn btn-primary', 'type' => "submit"])
];
}
} else {
/*
* Process for non-ajax request
*/
if ($model->load($request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
}
В итоге ничего не загружается, в моделе формы на месте картинки пусто:
В чем проблема, что делать?