Php Yii2:如何将新变量从视图发送到控制器?

Php Yii2:如何将新变量从视图发送到控制器?,php,model-view-controller,yii2,yii2-advanced-app,Php,Model View Controller,Yii2,Yii2 Advanced App,我有一个名为persons的表,其中包含id和name字段 我有一个create.php视图,加载名为Persons的模型,现在我想添加一个名为hasCar的复选框来显示一个人是否有车(因此这是一个布尔条件) 然后我有发送按钮,该按钮将表单的$model数组发送到控制器,因此我需要将hasCar变量添加到$model数组中 但是复选框不是persons表的一列,因此我得到了一些错误,因为它不是模型的一部分 我以这种方式添加了复选框,但它当然不起作用 <?= $form->field(

我有一个名为persons的表,其中包含idname字段

我有一个create.php视图,加载名为Persons的模型,现在我想添加一个名为hasCar的复选框来显示一个人是否有车(因此这是一个布尔条件)

然后我有发送按钮,该按钮将表单的$model数组发送到控制器,因此我需要将hasCar变量添加到$model数组中

但是复选框不是persons表的一列,因此我得到了一些错误,因为它不是模型的一部分

我以这种方式添加了复选框,但它当然不起作用

<?= $form->field($model, 'hasCar')->checkbox(); ?>


是否可以在$model数组中发送hasCar变量?我的意思是,当按下发送按钮时,如何将hasCar变量发送到控制器?

创建一个包含hasCar成员的新模型扩展Person,并从PersonForm类加载模型,例如:

class PersonForm extends Person
{
    public $hasCar;

    public function rules()
    {
        return array_merge(parent::rules(), [
            [['hasCar'], 'safe'],
        ]);
    }   

    public function attributeLabels()
    {
        return array_merge(parent::attributeLabels(), [
            'hasCar' => 'Has car',
        ]);
    }      
}

您不能将变量传递给$model对象,因为orbit与db表关联,这一点您是对的。您需要通过请求方法(GET、POST)将变量传递给控制器

尝试:

就职位而言,以及:

Yii::$app->request->get()
为了得到

另外,在表单上添加复选框作为HTML类组件

例如:

控制器:

...
$hasCar = Yii::$app->request->post('hasCar');
....
视图:

。。。
//我们在这里使用ActiveFormJS
$this->registerJs(
$(“#我的表格”)。关于('beforesmit',函数(e){
if(typeof$(“#hasCar复选框”).prop('value')!='undefined'){
返回false;//false取消提交
}
返回true;//为true继续提交
});
$this::POS_就绪,
'提交处理程序之前的表单'
);
...
...
有关ActiveFormJS的更多信息:

我希望这个答案涵盖了你


Damian

可能需要hasCar变量的副本。我如何验证它?我可以在模型文件中执行此操作,但我不希望使用该模型。您不能使用后端验证。Yii2有一个已知的关于这个问题的bug,它还没有被解决。您可以使用前端验证。至少我是这样做的。首先将处理程序附加到activeform提交事件。我将用一个例子更新我的答案。
...
$hasCar = Yii::$app->request->post('hasCar');
....
...
// We use ActiveFormJS here
$this->registerJs(
    $('#my-form').on('beforeSubmit', function (e) {
        if (typeof $('#hasCar-checkbox').prop('value') !== 'undefined') {
            return false; // false to cancel submit
        }
    return true; // true to continue submit
});
$this::POS_READY,
'form-before-submit-handler'
);
...
<?= HTML::checkbox('hasCar', false, ['id' => 'hasCar-checkbox', 'class' => 'form-control']) ?>
...