@kirzzzz

Почему не отправляется форма в Yii2 при редактировании?

Имеется форма в панели администратора для создания пользователя. В этой же форме заполняются услуги пользователя и рабочие часы. Услуги используют табличный ввод, рабочие часы - аналогично.
При создании все заполняется корректно, но при попытке отредактировать пользователя ( Все данные также выводятся корректно ) кнопка submit "неактивна" - клик происходит, функция в js submit срабатывает, но форма не отправляется ( не происходит переадресации по текущему action формы).

Код страницы:
<?php $form = ActiveForm::begin([
        'options' => ['data-validate'=>'timesinterval'],
    ])?>
    <div class="card shadow mb-4">
        <div class="card-header py-3">
            <h6 class="m-0 font-weight-bold text-primary">Основная информация</h6>
        </div>
        <div class="card-body">
            <div class="user">
                <div class="form-group row">
                    <div class="col-sm-6 mb-3 mb-sm-0">
                        <?= Html::activeTextInput($model, 'name', ['class'=>'form-control form-control-user','placeholder' => 'Введите Имя']); ?>
                    </div>
                </div>
                <div class="form-group">
                    <?= Html::activeTextInput($model, 'tel', ['class'=>'form-control form-control-user','placeholder' => 'Введите телефон','data-mask'=>'tel','readonly'=>isset($model->id)]); ?>
                </div>
            </div>
        </div>
    </div>
    <div class="card shadow mb-4">
        <div class="card-header py-3">
            <h6 class="m-0 font-weight-bold text-primary">Услуги</h6>
        </div>
        <div class="card-body">
            <div class="user">
                <?php if(isset($modelSer) and isset($service)):for($i = 0; $i < count($modelSer); $i++):?><?=
                Html::activeInput('hidden', $modelSer[$i], "[$i]service_id", ['value'=>$service[$i]['id']]).'
                <div class="form-group row">
                    <div class="col-sm-6 mb-3 mb-sm-0">
                        <div class="custom-control custom-checkbox mr-3">
                            '.Html::activeInput('checkbox', $modelSer[$i], "[$i]status",
                            ['id'=>'service'.$i,'class'=>'custom-control-input', 'checked'=>isset( $modelSer[$i]->status)?( $modelSer[$i]->status=='active'):false]).'
                            <label class="custom-control-label" for="service'.$i.'">'.$service[$i]['service_name'].'</label>
                        </div>
                    </div>
                    <div class="col-sm-6">
                        '.Html::activeInput('text', $modelSer[$i], "[$i]time", ['class'=>'form-control form-control-user','placeholder' => 'Время','data-mask'=>'time']).'
                    </div>
                </div>'?>
                <?php endfor; endif;?>
            </div>
        </div>
    </div>
    <div class="card shadow mb-4">
        <div class="card-header py-3">
            <h6 class="m-0 font-weight-bold text-primary">Часы</h6>
        </div>
        <div class="card-body">
            <div class="user">
                <div class="form-group">
                    <div class="input-group input-group-joined">
                        <input type="text" id="timesinterval-time-main" class="form-control form-control-user" placeholder="Время" data-mask="time" inputmode="text">
                        <div class="input-group-append">
                            <span class="d-flex align-items-center px-3">
                                <button class="btn btn-teal" type="button" id="add_time">
                                    <i class="fad fa-calendar-plus"></i>
                                </button>
                            </span>
                        </div>
                    </div>
                </div>
                <div class="form-group row flex-wrap" id="add_time_container">
                    <?php if(isset($timeInterval) and isset($timeInterval[0]['id'])):?>
                    <?php foreach ($timeInterval as $inT=>$time):?>
                            <div class="col-sm-4 mb-2" data-delete-time-c="">
                                <div class="input-group input-group-joined">
                                    <?= Html::activeTextInput($time, "[$inT]time", ['class'=>'form-control form-control-user','placeholder' => 'Время','data-mask'=>'time','readonly'=>true]);?>
                                    <div class="input-group-append">
                                        <span class="d-flex align-items-center px-3">
                                            <button class="btn btn-red" type="button" data-delete-time="">
                                                <i class="fad fa-calendar-times"></i>
                                            </button>
                                        </span>
                                    </div>
                                </div>
                            </div>
                    <?php endforeach; endif; ?>
                </div>
            </div>
        </div>
    </div>
    <?= Html::submitButton('Сохранить',['class'=>'btn btn-primary btn-user btn-block']); ?>
    <?php ActiveForm::end() ?>


Код контроллера:
public function actionCreate()
    {
        $model = new SignupForm();
        $timeInterval = new TimesInterval();
        $service = Service::find()->all();
        $modelSer = [new ServiceTime()];
        for($i = 1; $i < count($service); $i++) {
            $modelSer[] = new ServiceTime();
        }
        $post = Yii::$app->request->post();
        $get = Yii::$app->request->get();

        if(isset($get['id'])){
            $model = $model->findModel($get['id']);
            $modelSer = ServiceTime::findByMaster($get['id']);
            $timeInterval = $timeInterval->findByMaster($get['id']);
        }

        if ($model->load($post) and !isset($model->id)) {
            if ($user = $model->signup('personal')) {
                $auth = Yii::$app->authManager;
                $role = $auth->getRole('personal');
                $auth->assign($role, $user->id);
                if(isset($post['ServiceTime'])){
                    $modelSer = [new ServiceTime()];
                    for($i = 1; $i < count($post['ServiceTime']); $i++) {
                        $modelSer[] = new ServiceTime();
                    }
                    if (ServiceTime::loadMultiple($modelSer, Yii::$app->request->post())) {
                        foreach ($modelSer as $ser) {
                            $ser->status = isset($ser->status)?"active":"passive";
                            $ser->master_id = $user->id;
                            $ser->save(true);
                        }
                    }
                }
                if(isset($post['TimesInterval'])){
                    $timeInterval = [new TimesInterval()];
                    for($i = 1; $i < count($post['TimesInterval']); $i++) {
                        $timeInterval[] = new TimesInterval();
                    }
                    if (TimesInterval::loadMultiple($timeInterval, Yii::$app->request->post())) {
                        foreach ($timeInterval as $item) {
                            $item->master_id = $user->id;
                            $item->save(true);
                        }
                    }
                }
            } 
        }elseif (isset($model->id)){
            if($model->load($post)){
                if($model->update()){
                    Yii::$app->session->setFlash('success', 'Пользователь успешно обновлен! :)');
                }
            }
            $modelSer = ServiceTime::findByMaster($model->id);
            if (ServiceTime::loadMultiple($modelSer, Yii::$app->request->post())) {
                foreach ($modelSer as $ser) {
                    $ser->status = isset($ser->status)?"active":"passive";
                    $ser->save(true);
                }
            }
        }
        return $this->render('create',['model'=>$model,'modelSer'=>$modelSer,'service'=>$service,'timeInterval'=>$timeInterval]);
    }


Код JS:
$("#add_time").click(function () {
        $inp = $('#timesinterval-time-main').clone();
        let name = $inp.attr('name','TimesInterval[0][time]').attr('readonly',true);
        let id = $inp.removeAttr('id');
        let div = $('<div class="col-sm-4 mb-2" data-delete-time-c><div class="input-group input-group-joined"></div></div>').children('div')
            .append($inp)
            .append('<div class="input-group-append"><span class="d-flex align-items-center px-3"><button class="btn btn-red" type="button" data-delete-time><i class="fad fa-calendar-times"></i></button></span></div>').end();
        $("#add_time_container").append(div);
        $('#timesinterval-time-main').val('').focus();
    });

    $(document).on('click','[data-delete-time]',function () {
        $(this).closest('[data-delete-time-c]').remove();
    })
$('form[data-validate]').submit(function () {
        let valid = $(this).attr('data-validate');
        $('input[data-inp-validate-'+valid+']').each(function (index,elem) {
            let name = $(this).attr('name').split(/\d+/);
            $(this).attr('name',name[0]+index+name[1]);
        })
        console.log("AAAAAAAAAAAA");
    })


Дабы не захламлять вопрос код трех моделей добавлять не стал, если будет нужно - добавлю в последствии.
Также кусок кода по обновлению "Рабочих часов" в контроллере на данный момент не дописан, но не думаю что yii2 настолько умный, что не хочет отправлять форму без этого куска...

Заранее благодарю за ответ! Надеюсь, ошибка не в моей глупости.
  • Вопрос задан
  • 307 просмотров
Пригласить эксперта
Ответы на вопрос 1
@kirzzzz Автор вопроса
Потратив кучу часов, я понял, что ошибка была вовсе не со стороны Yii2.
Жадная библиотека
inputmask
не позволяет отправлять форму в случае если маска установлена на поля readonly\disabled(Это баг).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы