yii2 условная проверка на стороне сервера

У меня есть одна форма, в которой есть поля ниже

i)Книга ii)Сумма

Действие контроллера:

public function actionBook()
{   
    $model = new Book();
    if ($model->load(Yii::$app->request->post()) && $model->validate()){ 
        print_r($model);exit;
        return $this->redirect('/Book');
    }
    $model->getBook();
    return $this->render('BookForm', ['model' => $model]);
}

Всякий раз, когда эта страница загружается, я по умолчанию вызываю одну функцию модели, это функция getBook().

Модель:

public book;
public amount;
public showAmountField;

public function rules()
{   
 return [
  [['book'], 'required'],
  ['amount', 'required', 'when' => function($model) {
        return $model->showAmountField == true;
    }],
 ];
}

public function getBook()
{
 if(some condition here){
  $this->showAmountField = true;
 }
}

поэтому всякий раз, когда showAmountField имеет значение true в то время, когда требуется поле суммы, в противном случае оно не потребуется, здесь все работает нормально, и проверка на стороне клиента также работает нормально, но когда я изменяю идентификатор поля суммы с помощью консоли (f12) в то время проверка на стороне сервера не работает, и форма просто отправляется с пустым полем суммы, так что здесь не так. Пожалуйста, объясните кто-нибудь.

ОБНОВЛЕНИЕ

Вид

<?php
 use yii\helpers\Html;
 use yii\bootstrap\ActiveForm;
 $this->params['breadcrumb'] = $model->breadCrumbs;
?>

<?php $form = ActiveForm::begin([
  'id' => 'book-form',  
  'options' => ['class' => 'form-horizontal'],
  ]); 
 ?>
<?= $form->field($model, 'book')->textInput()->label("Book"); ?>
<?php if($model->showAmountField): ?>      
  <?= $form->field($model, 'amount')->textInput()->label("Amount"); ?>
<?php endif; ?>  
<?= $form->errorSummary($model, ['header' => '']); ?>
<?php ActiveForm::end(); ?>

person Vishva G    schedule 13.06.2017    source источник
comment
вам нужно отобразить ту же страницу формы, чтобы увидеть ошибку проверки, кроме того, вы останавливаете скрипт, добавляя выход.   -  person Rajesh Pradhan    schedule 13.06.2017


Ответы (2)


$model = new Book();
if ($model->load(Yii::$app->request->post()) && $model->validate()){ 
    print_r($model);exit;
    return $this->redirect('/Book');
}
$model->getBook();

здесь вы инициализируете $model->getBook(); после блока if, поэтому модель переопределяется в почтовом запросе с новым экземпляром, и, следовательно, проверка на стороне сервера не выполняется для условия when.

    $model = new Book();
    $model->getBook();
    if ($model->load(Yii::$app->request->post()) && $model->validate()){ 
        print_r($model);exit;
        return $this->redirect('/Book');
    }

это должно быть до пост загрузки

person Kandarp Patel    schedule 13.06.2017
comment
я хочу еще раз повторно инициализировать модель с помощью этой функции, чтобы только поставить ниже, в любом случае спасибо за ваш ответ. я сделаю альтернативу для этого. - person Vishva G; 16.06.2017

Валидация происходит по ID поля, если менять через консоль, модель не понимает, что нужно валидировать

person Sersh    schedule 13.06.2017
comment
Покажи файл просмотра - person Sersh; 13.06.2017
comment
@VishvaG, он только что сказал тебе. При изменении элемента с помощью консоли сервер не связывает его с моделью. Попробуйте повторить значения шаг за шагом, чтобы понять, что происходит. - person walther; 13.06.2017
comment
да, я понимаю, очевидно, что проверка на стороне клиента не работает, но я не знаю, почему проверка на стороне сервера не работает, это происходит только при условной проверке, а не при обычной обязательной проверке. - person Vishva G; 13.06.2017