从由YII2 ActiveForm生成的表单中删除字段


Removing a field from a form generated by YII2 ActiveForm

我有一个使用YII2 ActiveForm生成的表单。有一些领域,我需要是在如果我选择某些选项,或需要有他们删除,如果我选择一些其他选项。

例如,我有一个下拉帐户类型,有两个选项"个人"answers"公司"。如果用户选择"个人",则表单上的一些字段(如公司名称)需要消失,而其他一些字段(如名、姓)需要出现。最初当显示表单时,只有Account Type字段在那里。

下面是我现在的代码

<?php 
 $form = ActiveForm::begin(['id' => 'account-setup-form']); ?>
 echo $form->field($modelAccMain, 'account_type')
           ->widget(Select2::classname(), [
            'data' => $accountTypeArray,
            'options' => ['placeholder' => 'Select account type'],
            ]);         
  echo $form->field($modelUsers, 'firstname')->textInput()
            ->hint('')->label('First Name');
  echo $form->field($modelUsers, 'lastname')->textInput()
            ->hint('')->label('Last Name');
<?php ActiveForm::end(); ?> 

非常感谢任何帮助。

你可以使用场景,首先在你的模型中定义它们,然后你可以在你的视图中使用if语句

if ($model->isAttributeActive('attribute_name')) {

但是就像@nterms写的那样,如果你想让用户能够在客户端切换,javascript会更好。

定义场景还有助于验证(只有活动属性将被验证)。

注。不要忘记在控制器

中设置场景。
$model = new MyModel(['scenario'=>'my_scenario']);

我将使用jquery隐藏和显示的方式使用下拉菜单的更改事件,

javascript

假设select 2小部件中的数据是数组形式如:

[1=>"first-item",2=>"second-item",...]
$(document).ready(function(){
var id= //check the id of the select2

使用chrome查看元素id;

$("#id").on("change", function(){
    if(id.value==1){
     //show a div
    }else{
     //hide a div
    }
   //for multiple values better use switch
 like this
   switch(id){
    case 1:{
       $("#divid").show();
       ......
       }
       }
})
})

我希望你能明白,

对于select 2 id,可以通过

设置
echo $form->field($modelAccMain, 'account_type')
       ->widget(Select2::classname(), [
        'data' => $accountTypeArray,
        'options' => ['placeholder' => 'Select account type',"id"=>"mypreffereid"],
        ]);