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

Проверенные VDS на SSD в Европе от $4 и России: Датацентр №1 от 199руб

Тема в разделе "Yii Framework", создана пользователем ilya12345, 10 ноя 2017.

  1. ilya12345

    ilya12345 Новичок

    Сообщения:
    1
    Ваш город:
    Moskva, Москва, Россия
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Здравствуйте!
    Есть форма, у которой меняются input-ы, в зависимости от того, какой способ доставки выберет пользователь
    [​IMG]

    как в зависимости от выбора пользователя можно динамически менять сценарий валидации?
    Код контроллера:
    Код:
    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');
            }
    });
    
     
  2. grigori

    grigori ( ͡° ͜ʖ ͡°) Команда форума

    Сообщения:
    6.739
    Ваш город:
    Stormwind
    Address:
    Scottsdale, United States
    Country:
    Location on Map:
    Я бы сделал набор из нескольких валидаторов. Паттерн "стратегия".
     
  3. ivanov77

    ivanov77 Новичок

    Сообщения:
    57
    Ваш город:
    South Pole
    Address:
    Fort Lee, United States
    Country:
    Location on Map:
    для показа формы сценарий не надо устанавливать, т.к. раз пользователь видит и использует все поля, то это у вас один сценарий.
    А уже при аякс валидации в зависимости от поля delivery_method устанавливаете что у вас за сценарий