Yii framework - различные правила проверки в зависимости от выбранных параметров - PullRequest
1 голос
/ 01 августа 2011

Можно ли создать модельные правила, которые зависят от выбора?

У меня есть модель "Депозит", которая используется для ввода данных о переводе денег. У меня есть выпадающий список с двумя возможными вариантами выбора "Денежный перевод »,« Чековый перевод », и у меня есть поля cash_deposit_date, bank_name .., которые требуются только для перевода наличных, и cheque_date, cheque_no и in_favour_of .., которые требуются только во время чекового перевода .. как я могу это сделать..?

Я знаю, что могу использовать такие сценарии, как

$model=new Deposit("cash_transfer");

или

$model=new Deposit("cheque_transfer");

, но как я могу изменить сценарий в зависимости от значения, выбранного в раскрывающемся списке?список

Ответы [ 4 ]

2 голосов
/ 01 августа 2011

Не могли бы вы просто сделать это:

Сгенерированный HTML:

<form>
....
<select name="scenario">
    <option value="cash_transfer">Cash Transfer</option>
    <option value="cheque_transfer">Checque Transfer</option>
</select>
....
</form>

Код:

// allow only lowercase letters and underscore
$scenario = preg_replace('/[^a-z_]/', '', $_POST['scenario']);

if (!empty($scenario)) {
    $model = new Deposit($scenario);
} else {
    die('Missing scenario!');
}
1 голос
/ 10 августа 2011

Отстраняясь от ответа jupaju,

Этот выпадающий список также является полем модели (тип_трансфера), поэтому я сделал что-то вроде этого .. После проверки значений POST я использую $model->scenario = $model->transfer_type==1 ? 'cash_transfer':'cheque_transfer', чтобы изменить сценарий.

Мой код

$model=new Deposit;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Deposit']))
{
    $model->attributes=$_POST['Deposit'];
    $model->scenario = $model->transfer_type==1 ? 'cash_transfer':'cheque_transfer';    
    if($model->save())
        $this->redirect(array('admin'));
}
$this->render('create',array('model'=>$model));

Теперь это работает ..

0 голосов
/ 24 июля 2014

Это более простая форма меня

В вашей модели введите:

public $pay_type;
/**
 * @return array validation rules for model attributes.
 */
public function rules()
{
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.
    return array(
        ...
        array('pay_type', 'required'),
        array('cash_deposit_date', 'validationTransfer'),
        ...

    );
}

public function validationTransfer($attribute,$params)
{
     // this a sample, put all your need
     if($this->pay_type=='cash_transfer' and $this->cash_deposit_date==='')
          $this->addError('cash_deposit_date','If you will pay to Cash Transfer, enter your cahs deposit date');

     // this a sample, put all your need
     if($this->pay_type=='cheque_transfer' and $this->cheque_date==='')
          $this->addError('cheque_date','If you will pay to Cheque Transfer, enter your cheque date');

     // this a sample, put all your need
     if($this->pay_type=='cheque_transfer' and $this->cheque_no==='')
          $this->addError('cheque_no','If you will pay to Cheque Transfer, enter your Cheque No');

}

В виде в форму вашего виджета

<?php echo $form->labelEx($model,'pay_type',array('class'=>'control-label')); ?>
<?php echo $form->dropDownList($model,'pay_type',array("cash_transfer"=>"Cash Transfer","cheque_transfer"=>"Cheque Transfer"),array('class'=>'form-control','empty'=>'Pay Type...')); ?>
<?php echo $form->error($model,'pay_type',array('class'=>'help-block')); ?>

Примечание: класс css, такой как "help-block", "control-label", "form-control" в форме witget, является необязательным, возможно, вы используете Bootstrap 3, и он будет хорошо выглядеть

0 голосов
/ 01 августа 2011

Я думаю, что лучшим способом было бы использовать персонализированное правило проверки в вашей модели, а затем проверить, установлено ли для свойства "сценария" модели ту или иную опцию.

Подробнее о пользовательских правилах проверки вы можете прочитать в здесь

Надеюсь, это поможет. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...