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

I have a table called persons with id and name fields.

I have a create.php view that loads the model called Persons and now I want to add a checkbox called hasCar to show if a person has a car (so it is a boolean condition).

Then I have the send button that send the $model array of the form to the controller so I need to add the hasCar variable to $model array.

But the checkbox is not a column of the persons table so I got some errors because it is not part of the model.

I added the checkbox in this way but it is not working, of course.

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

Is it possible to send the hasCar variable inside the $model array? I mean, how can I send the hasCar variable to the controller when the send button is pressed?

展开翻译

译文

我有一个名为人</ strong>的表, id </ strong>和< strong>名称</ strong>字段。</ p>

我有一个 create.php </ strong>视图,可以加载名为人员</ strong>的模型,现在我 想要添加一个名为 hasCar </ strong>的复选框来显示一个人是否有车(因此它是一个布尔条件)。</ p>

然后我有发送 </ strong>按钮,将表单</ strong>的 $ model </ strong>数组发送到控制器,因此我需要将 hasCar </ strong>变量添加到 $ model </ strong>数组。 </ p>

但是复选框不是人员</ strong>表的列,所以我遇到了一些错误,因为它不是模型的一部分。</ p>
\ n

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

 &lt;?= $ form-&gt; field($ model,'hasCar  “) - &GT;复选框();  ?&gt; 
</ code> </ pre>

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

dongshi7350
dongshi7350 在yii2视图中添加自定义字段的可能重复,该视图不在模型中
2 年多之前 回复

2个回答

You can't pass the variable to the $model object orbit is affiliated with a db table, you are right about this. You need to pass the variable to the controller via a request method (GET, POST).

Try :

Yii::$app->request->post()

for POST, and :

Yii::$app->request->get()

for GET.

Also on the form add the checkbox as an HTML class component.

EXAMPLE:

CONTROLLER:

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

VIEW:

...
// 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']) ?>
...

More on ActiveFormJS: enter link description here

I hope this answer covered you.

Damian

展开翻译

译文



你不能将变量传递给$ model对象轨道附属于db表,你是对的。 您需要通过请求方法(GET,POST)将变量传递给控制器​​。</ p>

尝试:</ p>

  Yii :: $ 用于POST的app-&gt; request-&gt; post()
</ code> </ pre>

,并且:</ p>

  Yii ::  GET的$ app-&gt; request-&gt; get()
</ code> </ pre>

。</ p>

同样在表单上添加复选框 作为HTML类组件。</ p>

示例:</ p>

CONTROLLER:</ p>

  ... \  n $ hasCar = Yii :: $ app-&gt; request-&gt; post('hasCar'); 
....
</ code> </ pre>

视图:</ p>

  ... 
//我们在这里使用ActiveFormJS
$ this-&gt; registerJs(
$('#my-form')。on('beforeSubmit', function(e){
if(typeof $('#hasCar-checkbox')。prop('value')!=='undefined'){
return false; // false取消提交
}
return true; // true继续提交
});
$ this :: POS_READY,
'form-b​​efore-submit-handler'
);
...
&lt;?= HTML :: 复选框('hasCar',false,['id'=&gt;'hasCar-checkbox','class'=&gt;'form-control'])?&gt;
...
</ code> </ 预>

更多 在ActiveFormJS上:
在此输入链接说明 </ p>

我希望这个答案能够覆盖你。</ p>

Damian </ p>
</ div>

doxqszx09742
doxqszx09742 您无法使用后端验证。 Yii2有关于此问题的已知错误,但尚未解决。 您可以使用前端验证。 至少我就是这样做的。 首先将处理程序附加到activeform submit事件。 我将以一个例子来更新我的答案。
2 年多之前 回复
dongtuo0828
dongtuo0828 应该需要hasCar变量。 我该如何验证呢? 我可以在模型文件中执行此操作,但我不想使用该模型。
2 年多之前 回复

Create a new model extending Person that contains hasCar member, and load the model from PersonForm class, such as:

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',
        ]);
    }      
}

展开翻译

译文



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

 类PersonForm扩展Person 
{
public $ hasCar;

公共函数规则()
{
返回array_merge(parent :: rules(),[
[[ 'hasCar'],'safe'],
]);
}

公共函数attributeLabels()
{
返回array_merge(parent :: attributeLabels(),[
'hasCar'=&gt; ;'有车',
]);
}
}
</ code> </ pre>
</ div>

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问