Перехват и определение action для последующей валидации

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
zhe17065564
Сообщения: 63
Зарегистрирован: 2016.06.09, 10:46
Откуда: Украина
Контактная информация:

Перехват и определение action для последующей валидации

Сообщение zhe17065564 »

Здравствуйте!
У меня такой вопрос - на каком уровне можно перехватить action и как, чтобы валидация проходила только по нему?
У меня просто много всего от ajax validation до ajax submit без перезагрузки формы и форма вызывается в модалке при создании нового автора. Естественно стандартный механизм - форма одна, а вызывается она и при create и при update и валидация по unique получается и там и там включается, пробовал переопределять через сценарии - не работает, видимо из-за моих конструкций с AjaxSubmitButton, но их не выкинуть из-за специфики работы с данными. Я понимаю, что какае-то мелочь лежит на поверхности, но не знаю где, чтоб вырубить эту валидацию на update ибо 'validationUrl' формы всегда же будет подтягивать метод validate для всего. Как в нем указать для какого экшена работать - сценарии на работают в моём случае, говорю сразу?
Экшены контролера:

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


 public function actionList_department($id)
    {
        
        $countdepartment = Departments::find()->where(['fac_id' => $id])->count();

        $department = Departments::find()->where(['fac_id' => $id])->orderBy('id DESC')->all();
        if($countdepartment > 0)
        {
            foreach($department as $result) echo "<option value='".$result->id."'>".$result->department."</option>";
        } else {
            echo "<option>-</option>";
        }

        
    }
    
/**
     * Creates a new Authors model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Authors();
        
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
           // return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->renderAjax('create', [
                'model' => $model,
            ]);
        }
    }

    public function actionValidation()
    {
     
           if($model = new Authors)
           {
                if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) 
            {
                Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
                return \yii\widgets\ActiveForm::validate($model);
            }
           }
        

    }
    
    /**
     * Updates an existing Authors model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }
И сама форма собственно:

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

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use app\modules\authors\models\Faculty;
use app\modules\authors\models\Departments; 
use yii\helpers\ArrayHelper;
use demogorgorn\ajax\AjaxSubmitButton;
use kartik\date\DatePicker;
use yii\helpers\Url;

/* @var $this yii\web\View */
/* @var $model app\modules\authors\models\Authors */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="ssu-staff-authors-form">

    <?php $form = ActiveForm::begin(
        [
        'id' => 'authors', 
        'enableAjaxValidation' => true, 
        'validationUrl'=>Url::toRoute('default/validation')
        //'enableClientValidation' => true
        ]
        ); ?>

    <?= $form->field($model, 'stgroup')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'pib')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'position')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'birthyear')->widget(DatePicker::className(),[
                                            'type' => DatePicker::TYPE_INPUT,
                                            'options' => ['placeholder' => 'Формат ввода 0000'],
                                            'pluginOptions' => [
                                            'autoclose'=>true,
                                            'format' => 'yyyy'
                                            ]
                                            ]) ?>

    <?= $form->field($model, 'fac_id')->dropDownList(Faculty::dropdown(), 
                [
                //'style' => 'width:500px',
                'prompt' => '-- Факультеты --',
                'onchange' =>'$.post("'.Yii::$app->urlManager->createUrl('moderator/authors/default/list_department?id=').'"+$(this).val(),{_csrf: yii.getCsrfToken()},
                    function(data){$("select#dep_id").html(data);});'
                ]
                ); ?>

    <?= $form->field($model, 'dep_id')->dropDownList(Departments::dropdown(),['prompt' => '-- Кафедры --', 'id'=>'dep_id',]) ?>

    <?= $form->field($model, 'foreigner')->dropDownList([ 'Нет' => 'Нет','Иностранец'=>'Иностранец' ]) ?>

    <div class="form-group">
    <?php    AjaxSubmitButton::begin([
            'label' => 'Зберегти',
            'useWithActiveForm' => 'authors',
            'ajaxOptions' => [
                'type' => 'POST',
                'success' => new \yii\web\JsExpression('function(html){
                            $("#output").html("Данные отправлено");

                            setTimeout(function() 
                            { 
                                $("#authors").trigger("reset");
                                
                            }, 100); 

                            setTimeout(function()
                            {
                                $("#output").fadeOut()
                            }, 1000); 

                            $(".close").click(function()
                            {
                                location.reload();
                            })
                        }'),
            ],
            'options' => ['class' => 'btn btn-primary', 'type' => 'submit', 'id' =>'add-button'],
        ]);
        AjaxSubmitButton::end();
         ?>
         <center><div id="output" class="btn-success"></div></center></br>

        </div>

        </div>
    </div>

    <?php ActiveForm::end(); ?>

</div>

Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Перехват и определение action для последующей валидации

Сообщение Nex-Otaku »

не знаю где, чтоб вырубить эту валидацию на update
Валидация происходит в методе "save", передаёшь параметр "false" и валидация отключается.

Вместо

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

$model->save()
пишешь

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

$model->save(false)
Аватара пользователя
zhe17065564
Сообщения: 63
Зарегистрирован: 2016.06.09, 10:46
Откуда: Украина
Контактная информация:

Re: Перехват и определение action для последующей валидации

Сообщение zhe17065564 »

Nex-Otaku писал(а): 2017.11.22, 14:12
не знаю где, чтоб вырубить эту валидацию на update
Валидация происходит в методе "save", передаёшь параметр "false" и валидация отключается.

Вместо

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

$model->save()
пишешь

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

$model->save(false)
Не поможет, пробовал - форма одна и на обновление и на добавление валидатор подключается для ajax валидации.
Я не знаю, как можно вытащить, чтоб Validation отрабатывал на actionCreate, что-то типа такого сделать бы, но не знаю как правильно.

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

public function actionValidation()
    {
If( $action === 'create') {
$model = new Authors
           {
                if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) 
            {
                Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
                return \yii\widgets\ActiveForm::validate($model);
            }
           }
	}
}
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Перехват и определение action для последующей валидации

Сообщение Nex-Otaku »

То есть тебе на update не серверную нужно валидацию вырубить, а клиентскую?
Аватара пользователя
zhe17065564
Сообщения: 63
Зарегистрирован: 2016.06.09, 10:46
Откуда: Украина
Контактная информация:

Re: Перехват и определение action для последующей валидации

Сообщение zhe17065564 »

Nex-Otaku писал(а): 2017.11.22, 14:24 То есть тебе на update не серверную нужно валидацию вырубить, а клиентскую?
Клиентская и так выключена, подключена серверная через ajax - я ж написал. Не работает, если на update вешать false на save. Форма сначала идет на метод Validation 'validationUrl'=>Url::toRoute('default/validation') при нажатии на кнопку уже возвращает провалидированную форму, а потом через update уже идет и само собой оно не сохраняет обновления. Меня интересует как переписать метод валидации под 1 экшен.
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Перехват и определение action для последующей валидации

Сообщение Nex-Otaku »

Во вьюшке формы:

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

$formParams = [
        'id' => 'authors', 
];
$isCreate = Yii::$app->controller->action->id === 'create';
if ($isCreate) {
        $formParams['enableAjaxValidation'] = true;
        $formParams['validationUrl'] = Url::toRoute('default/validation');
}

$form = ActiveForm::begin($formParams);
Аватара пользователя
zhe17065564
Сообщения: 63
Зарегистрирован: 2016.06.09, 10:46
Откуда: Украина
Контактная информация:

Re: Перехват и определение action для последующей валидации

Сообщение zhe17065564 »

О благодарю, спасибо большое, теперь запомню на каком уровне подобные задачи обрабатывать. Отрефакторил под себя - заработало всё наконец-то. Если кому-нибудь нужно будет:

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

<?php  
    $isCreate = Yii::$app->controller->action->id === 'create';
      if ($isCreate) 
        {
            $form = ActiveForm::begin(
                [
                    'id' => 'authors',
                    'enableAjaxValidation' => true,
                    'validationUrl' => Url::toRoute('default/validation')
                ]
            );  
        }
        else
        {
            $form = ActiveForm::begin(
                [
                    'id' => 'authors',
                ]
            );  
        }
    ?>
Ответить