У меня такой вопрос - на каком уровне можно перехватить 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>