异步向控制器提交值? yii2

时间:2017-11-27 07:37:21

标签: php validation yii2 rules scenarios

所以这是交易。下面的ActiveForm应该接收两个变量:$ tt(radio)和$ value(字符串数字输入)并将它们发送到控制器。

$ value需要根据InputField模型中定义的不同规则和方案进行验证。 $ tt是无线电值,所以我现在还没有为它定义规则。

诀窍是,我希望对$ value进行某种输入验证,并且它的规则应该根据用户设置的$ tt值而改变。有了这种配置,控制器既不会收到$ tt,也不会收到$ value,我认为其原因是规则相互冲突。

理想情况下,我希望我的视图将已检查的radio $ tt值(使用jQuery或smthng)发送到控制器,然后为控制器设置模型的场景,以便设置适当的验证规则,输入字段为$视图中的值将继续运行。

Yii2专家:1)你能解释一下为什么我的控制器没有收到任何价值。 2)为我计划做的事情提出建议?

`

//查看片段     

       $valueForm = ActiveForm::begin([ 
              'id' => 'input-field', 
          'action' => ['value-search/index'], 
          'method' => 'post', 
         'options' => ['class' => 'form-horizontal'] ]); ?>

<?= $valueForm->field($valueModel, 'tt')
              ->radioList(['P_sat'=>'Sat. Pressure', 'T_sat'=>'Sat. Temperature'])
              ->label('Select table type'); ?> 
<?= $valueForm->field($valueModel, 'value')
              ->textInput(['options' => ['type'=>'number', 'name'=>'value','id'=>'value']]); ?> 
<?php ActiveForm::end() ?>

//模型

class InputField extends \yii\base\Model

{

const SCENARIO_PSAT = 'P_sat';
const SCENARIO_TSAT = 'T_sat';
public $tt;
public $value;


public function scenarios() {
    return [
        self::SCENARIO_PSAT => ['tt','value'],
        self::SCENARIO_TSAT => ['tt','value'],
    ];
}

public function rules() {
    return [
        ['tt','safe'],
        ['value', 'double', 'numberPattern' => '/[0-9]+?(\.[0-9]{0,5})?/', 'min' => 0, 'max' => 22064, 
        'on' => self::SCENARIO_PSAT],
        ['value', 'double', 'numberPattern' => '/[0-9]+?(\.[0-9]{0,5})?/', 'min' => 0, 'max' => 373.95, 
        'on' => self::SCENARIO_TSAT],
    ];
}

//来自控制器的操作动作

public function actionIndex()
{   
    $inputModel = new InputField;

    $inputModel->load(\Yii::$app->request->post());

    $tt = $inputModel->tt;


    switch($tt) {
        case 'P_sat': $inputModel->scenario = $inputModel::SCENARIO_PSAT;
                     break;
        case 'T_sat': $inputModel->scenario = $inputModel::SCENARIO_TSAT;
                     break;
        default: throw new UserException('setTableType is not returning shit');
    }


    if ($inputModel->validate('value')) { 
        $searchValue = $inputModel->value;
        $this->test = $inputModel->tt;
        $this->test2 = $inputModel->value;

    }  else {
        throw new UserException('Input is not validated');
    }

    return $this->render('index', [
        //'provider' => $provider,
        'array' => $this->test,
        'array2' => $this->test2
    ]);
}

`

test和test2,它们应该从模型接收$ tt和$ value,都是NULL :(

1 个答案:

答案 0 :(得分:0)

在加载值

之前必须设置场景
public function actionIndex()
{   
    $inputModel = new InputField;

    $inputModel->load(\Yii::$app->request->post());

    $tt = $inputModel->tt;


    switch($tt) {
        case 'P_sat': $inputModel->scenario = $inputModel::SCENARIO_PSAT;
                 break;
        case 'T_sat': $inputModel->scenario = $inputModel::SCENARIO_TSAT;
                 break;
        default: throw new UserException('setTableType is not returning shit');
    }


    if ($inputModel->load(\Yii::$app->request->post()) && $inputModel->validate('value')) { 
        $searchValue = $inputModel->value;
        $this->test = $inputModel->tt;
        $this->test2 = $inputModel->value;

    }  else {
        throw new UserException('Input is not validated');
    }

    return $this->render('index', [
        //'provider' => $provider,
        'array' => $this->test,
        'array2' => $this->test2
    ]);
}