kartik-v yii2-widget-fileinput добавление изображений

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
valerii
Сообщения: 11
Зарегистрирован: 2017.10.07, 19:55

kartik-v yii2-widget-fileinput добавление изображений

Сообщение valerii »

Приветствую всех!
Собственно задача - прикрепление изображений к анкете используя kartik-v yii2-widget-fileinput. Если выбираются несколько изображений одновременно, то их загрузка происходит без проблем. Но если изображения добавляются по очереди, то загружается только одно. Из документации понятно, что нужно использовать ajax, но не понимаю, как реализовать. Помогите разобраться, пожалуйста.

Модель:

Код: Выделить всё

namespace frontend\models;

use common\models\Questionnaire;
use yii\base\Model;
use Yii;

/**
 * QuestionnaireForm is the model behind the questionnaire form.
 */
class QuestionnaireForm extends Model
{
    public $name;
    public $surname;
    public $sex;
    public $email;
    public $phone;
    
    ...
    
    public $image_id;

    /**
     * @var UploadedFile[]
     */
    public $imageFiles;

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
//            [['name', 'email', 'phone', 'age'], 'required'],
//            [['sex', 'partner_sex'], 'required', 'message' => t('Необходимо выбрать «Пол».')],
//            ['imageFiles', 'required', 'message' => t('Необходимо добавить фотографии.')],
            [['name', 'surname', 'email', 'phone', 'age', 'income'], 'trim'],
            [['name', 'surname',  'email', 'phone', 'location', 'marital_status', 'occupation', 'income', 'hobby', 'advantage', 'official_marriage', 'sexual_orientation', 'leadership', 'partner_goal', 'partner_age', 'partner_marital_status', 'partner_occupation', 'partner_income', 'partner_advantage', 'partner_sexual_orientation', 'partner_leadership', 'image_id'], 'string', 'max' => 255],
            ['message', 'string'],
            [['sex', 'age', 'children', 'partner_children'], 'integer'],
            ['age', 'integer', 'max' => 100, 'min' => 18],
            ['email', 'email'],
            ['imageFiles', 'file', 'extensions' => 'png, jpg, jpeg', 'maxFiles' => 3, 'checkExtensionByMimeType' => false],
        ];
    }

    /**
     *
     * @return Questionnaire|null the saved model or null if saving fails
     */
    public function questionnaire()
    {
        if (!$this->validate()) {
            return null;
        }

        $questionnaire = new Questionnaire();

        $questionnaire->name = $this->name;
        $questionnaire->surname = $this->surname;
        $questionnaire->sex = $this->sex;
        $questionnaire->email = $this->email;
        $questionnaire->phone = $this->phone;
        
        ...
        
        $questionnaire->image_id = $this->image_id;

        return $questionnaire->save() ? $questionnaire : null;
    }

    public function upload()
    {
        if ($this->validate()) {
            foreach ($this->imageFiles as $key => $file) {
                $file->saveAs(Yii::getAlias('@storage') . '/questionnaire/' . $this->image_id . '_' . $key . '.' . $file->extension);
            }
            return true;
        } else {
            return false;
        }
    }
    
     ...

Контроллер:

Код: Выделить всё

    public function actionQuestionnaire()
    {
        $model = new QuestionnaireForm();

        if ($model->load(Yii::$app->request->post()) && $model->questionnaire()) {

            $model->imageFiles = UploadedFile::getInstances($model, 'imageFiles');

            var_dump($model->imageFiles);
            if ($model->upload()) {
                Yii::$app->session->setFlash('success', t('Спасибо!<br> Ваши данные успешно отправлены. В ближайшее время мы с Вами свяжемся!'));
            }
        }

        return $this->render('questionnaire', [
            'model' => $model,
        ]);
    }
Представление:

Код: Выделить всё

... 

<?= \kartik\file\FileInput::widget([
       'model' => $model,
        'attribute' => 'imageFiles[]',
        'name' => 'imageFiles[]',
        'options'=>[
               'multiple'=>true,
               'accept' => 'image/*'
        ],
        'pluginOptions' => [
        'uploadUrl' => Url::to(['/site/questionnaire']),
        'initialPreviewAsData'=>true,
        'maxFileSize'=>2800
                        ]
]); ?>

<?= $form->field($model, 'image_id', ['errorOptions' => ['class' => 'questionnaire__form-help']])->hiddenInput(['value'=> substr(md5(microtime() . rand(0, 9999)), 0, 10)])->label(false); ?>

...
Ответить