Проблемы с Ajax валидацией на уникальность

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
fenzom
Сообщения: 14
Зарегистрирован: 2019.02.15, 18:36

Проблемы с Ajax валидацией на уникальность

Сообщение fenzom »

День добрый. Прошу помощи с проблемой: пытаюсь отредактировать запись из бд, форма подгружается с помощью ajax в модальном окне, но сохранить не удаётся потому что появляется ошибка что запись не уникальна.

Код формы

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

<?php Modal::begin([
    'id' => 'modal',
    'title' => $settings_modal['title'],
    'size' => 'modal-xl',
]);
?>
<?php $form = ActiveForm::begin([
    'id' => 'form--updateMenu',
    'enableAjaxValidation' => true,
    'validationUrl' => Yii::$app->urlManager->createUrl('site/menu-validate'),
]); ?>

<div class="row">
    <div class="col-md-4">
        <?=
        $form->field($model, 'short_name')->textInput(['maxlength' => true])
            ->hint(Yii::t('site', 'short_name_description'))
        ?>
        <?=
        $form->field($model, 'full_name')->textInput(['maxlength' => true])
            ->hint(Yii::t('site', 'full_name_description'))
        ?>
        <?=
        $form->field($model, 'url')->textInput(['maxlength' => true])
            ->hint(Yii::t('site', 'url_description'))
        ?>
    </div>

    <div class="col-md-4">
        <?=
        $form->field($model, 'icon')->textInput(['maxlength' => true])
            ->hint(Yii::t('site', 'icon_description'))
        ?>
        <?= $form->field($model, 'sort_order')->textInput() ?>
    </div>
    <div class="col-md-4 d-flex">
        <div class="mt-4 mx-auto">

            <?= $form->field($model, 'navbar_view', ['template' => "<div class=\"checkbox\">\n{input}
{beginLabel}\n{labelTitle}\n{endLabel}\n{error}\n{hint}\n</div>"])->checkbox(['value' => true]) ?>

            <?= $form->field($model, 'sidebar_view', ['template' => "<div class=\"checkbox\">\n{input}
{beginLabel}\n{labelTitle}\n{endLabel}\n{error}\n{hint}\n</div>"])->checkbox(['value' => true]) ?>

            <?= $form->field($model, 'main_view', ['template' => "<div class=\"checkbox\">\n{input}
{beginLabel}\n{labelTitle}\n{endLabel}\n{error}\n{hint}\n</div>"])->checkbox(['value' => true]) ?>

            <?= $form->field($model, 'status', ['template' => "<div class=\"checkbox\">\n{input}
{beginLabel}\n{labelTitle}\n{endLabel}\n{error}\n{hint}\n</div>"])->checkbox(['value' => true]) ?>

        </div>
    </div>

    <div class="col-md-12">
        <?=
        $form->field($model, 'description')->textarea(['rows' => 5])
            ->hint(Yii::t('site', 'description_description'))
        ?>
    </div>
</div>
<div class="form-group text-center">

        <?= Html::submitButton(Yii::t('app', 'save'), [
            'class' => 'btn btn-success',
            'data' => [
                'type' => 'form--updateMenu',
                'art' => 'system-menu-Menu-control',
                'id' => $model->id,
            ],
            'name' => 'add-edit-menu-button',
        ]) ?>

</div>


<?php ActiveForm::end(); ?>
<?php Modal::end();
Код контролера формы

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

    public function actionMenuControl($id = null): string
    {
        if (Yii::$app->request->isAjax) {

            if ($id) {
                $model_menu = $this->findModelMenu($id);

                $settings = [
                    'title' => Yii::t('site', 'item_menu_update',
                        ['menu_item' => $model_menu->short_name]),
                    'id_modal' => 'modalEditNotebook',
                ];
            } 

            return $this->renderAjax('menu/menu_form', [
                'model' => $model_menu,
                'settings_modal' => $settings
            ]);
        }

        throw new NotFoundHttpException('The requested page does not exist.');
    }
Код контролера валидации

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

    public function actionMenuValidate()
    {
        $model = new Menu();
        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {

            \Yii::$app->response->format = Response::FORMAT_JSON;
            return ActiveForm::validate($model);
        }
        return false;
    }
Js код отправки формы

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

$this->registerJs(
    "
$(document).on('beforeSubmit', '#{$id_form}', function () {

    let form = $('#{$id_form}').serialize();

    $.ajax({
        url: '/ajax/',
        type: 'POST',
        data: form,

        success: function (data) {

                console.log(result);
       
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log(jqXHR.responseText);
            console.log(textStatus);
            console.log(errorThrown);
        }
    });
	
return false;
});
"
);
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Проблемы с Ajax валидацией на уникальность

Сообщение ElisDN »

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

<?php $form = ActiveForm::begin([
    'id' => 'form--updateMenu',
    'enableAjaxValidation' => true,
    'validationUrl' => ['menu-validate', 'id' => $model->id],
]); ?>

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

public function actionMenuValidate($id = null)
{
    if ($id) {
        $model = $this->findModelMenu($id);
    } else {
        $model = new Menu();
    }
    ...
}
fenzom
Сообщения: 14
Зарегистрирован: 2019.02.15, 18:36

Re: Проблемы с Ajax валидацией на уникальность

Сообщение fenzom »

Большое спасибо за помощь. Помогло
Ответить