YiiFramework Как динамически менять сценарий валидации?

ilya12345

Новичок
Здравствуйте!
Есть форма, у которой меняются input-ы, в зависимости от того, какой способ доставки выберет пользователь


как в зависимости от выбора пользователя можно динамически менять сценарий валидации?
Код контроллера:
Код:
class ApplicationController extends Controller
{
    public function actionNewApplication1()
    {
        $model = new Application1();
        $model->scenario = Application1::SCENARIO_CAR;
        $model->load(Yii::$app->request->post());

        return $this->render('new-application1', compact('model'));
    }
}
Код модели:
Код:
class Application1 extends Model
{
    const SCENARIO_CAR = 'car';
    const SCENARIO_TRAIN = 'train';
    public $customer;
    public $delivery_method;
    public $plant;
    public $station;
    public $oil_base;
    public $numberDrivers;

    public function scenarios()
    {
        return [
            self::SCENARIO_CAR => [
                'customer',
                'delivery_method',
                'oil_base',
                'numberDrivers',
            ],
            self::SCENARIO_TRAIN => [
                'customer',
                'delivery_method',
                'plant',
                'station',
            ],
        ];
    }
   
    public function rules()
    {
        return [
            [['customer',
              'delivery_method',
            ], 'required',], 
            [[
                'oil_base',
                'numberDrivers',
            ], 'required','on' => self::SCENARIO_CAR], 
            [[
                'plant',
                'station',
            ], 'required','on' => self::SCENARIO_TRAIN],
           
        ];
    }
}
Код вьюхи:
Код:
<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
?>
<?php $form = ActiveForm::begin(['id' => 'registration-form', 'enableAjaxValidation' => true]);
echo $form->field($model, 'customer');
echo $form->field($model, 'delivery_method')->dropDownList([0 => 'Не выбрано', 1 => 'ЖД ТРАНСПОРТ', 2 => 'АВТОТРАНСПОРТ']);
echo $form->field($model, 'plant');
echo $form->field($model, 'station');
echo $form->field($model, 'oil_base',['options' => ['class' => 'hidden']]);
echo $form->field($model, 'numberDrivers',['options' => ['class' => 'hidden']]);

echo Html::submitButton('Сформировать', ['class' => 'btn btn-default']);
ActiveForm::end();
?>
JS код:
Код:
$('#application1-delivery_method').change(function () {
        var id = $(this).val();
        var plant = $('.field-application1-plant');
        var station = $('.field-application1-station');
        var oil_base = $('.field-application1-oil_base');
        var numberDrivers = $('.field-application1-numberdrivers');

        if (id == 2) {
            oil_base.removeClass('hidden');
            numberDrivers.removeClass('hidden');
            plant.addClass('hidden');
            station.addClass('hidden');
        } else {
            oil_base.addClass('hidden');
            numberDrivers.addClass('hidden');
            plant.removeClass('hidden');
            station.removeClass('hidden');
        }
});
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Я бы сделал набор из нескольких валидаторов. Паттерн "стратегия".
 

ivanov77

Новичок
для показа формы сценарий не надо устанавливать, т.к. раз пользователь видит и использует все поля, то это у вас один сценарий.
А уже при аякс валидации в зависимости от поля delivery_method устанавливаете что у вас за сценарий
 
Сверху