Yii2-yii \ grid \ CheckboxColumn-批量更新并将选定的行插入到另一个表中

时间:2018-11-13 14:58:08

标签: javascript yii2 yii2-advanced-app

我有一个包含以下字段的表格:

aca_class_subjects: 
                    class_subject_id, class_subject_subject_id, 
                    class_subject_class_group_id, class_subject_class_id

class_subject_id是主键,它是auto_incrementclass_subject_class_idclass_subject_class_group_id形成从属下拉列表。

class_subject_subject_id来自名为aca_subjects的表,它将形成复选框。

checkedboxlist

控制器:AcaClassSubjectsController

public function actionCreate()
{
    $model = new AcaClassSubjects();

    $searchModel = new AcaSubjectsSearch();
    $searchModel->is_status = 0 ;
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    return $this->render('create', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
        'model'=> $model,
    ]);
}    

public function actionUpdate($id)
{
    $model = $this->findModel($id);

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->class_subject_id]);
    } else {
        return $this->render('update', [
            'model' => $model,
        ]);
    }
}

型号:AcaClassSubjects

    public function attributeLabels()
{
    return [
        'class_subject_id' => Yii::t('aca', 'ID'),
        'class_subject_subject_id' => Yii::t('aca', 'Subject'),
        'class_subject_class_id' => Yii::t('aca', 'Class'),
        'class_subject_class_group_id' => Yii::t('aca', 'Class Group'),      
         ];
}

AcaSubjectsSearch

    public function search($params)
{
    $query = AcaSubjects::find()->where(['<>', 'is_status', 2]);

    $dataProvider = new ActiveDataProvider([
        'query' => $query, 'sort'=> ['defaultOrder' => ['subject_id'=>SORT_DESC]],
        'pagination' => [ 'pageSize' => 5 ]
    ]);

    $this->load($params);

    if (!$this->validate()) {
        // uncomment the following line if you do not want to any records when validation fails
        // $query->where('0=1');
        return $dataProvider;
    }

    $query->andFilterWhere([
        'subject_id' => $this->subject_id,
    ]);

    $query->andFilterWhere(['like', 'subject_name', $this->subject_name])
        ->andFilterWhere(['like', 'subject_code', $this->subject_code]);         

    return $dataProvider;
}

查看

<div class="col-xs-12" style="padding-top: 10px;">
    <div class="box">

		    <?php $form = ActiveForm::begin([
					'id' => 'academic-level-form',
					'enableAjaxValidation' => false,
					'fieldConfig' => [
					    'template' => "{label}{input}{error}",
					],
		    ]); ?>            
		    <div class="col-xs-12 col-lg-12 no-padding">  
		        <div class="col-xs-12 col-sm-6 col-lg-6">    

            <?= $form->field($model, 'class_subject_class_group_id')->widget(Select2::classname(), [
                'data' => ArrayHelper::map(\app\modules\academic\models\AcaClassGroups::find()->where(['is_status' => 0])->all(),'class_group_id','class_group_name'),
                'language' => 'en',
                'options' => ['placeholder' => '--- Select Class Group ---', 
                    'onchange'=>'
                        $.get( "'.Url::toRoute('dependent/getclassmaster').'", { id: $(this).val() } )
                            .done(function( data ) {
                                $( "#'.Html::getInputId($model, 'class_subject_class_id').'" ).html( data );
                            }
                        );' 
                ],
             //   'disabled'=>'true',
                'pluginOptions' => [
                    'allowClear' => true
                ],
            ]); ?>                         
		        </div>
		        <div class="col-xs-12 col-sm-6 col-lg-6">
		            <?= $form->field($model, 'class_subject_class_id')->widget(Select2::classname(), [
		            'data' => ArrayHelper::map(\app\modules\academic\models\AcaClassMaster::findAll(['class_id' => $model->class_subject_class_id]),'class_id','class_name'),
		                'language' => 'en',
		                'options' => ['placeholder' => '--- Select Class ---'],
		                'pluginOptions' => [
		                    'allowClear' => true
		                ],
		            ]); ?>                          	        
                </div>
		    </div> 

        <div class="box-body table-responsive">
           
                <h4><strong><u>Select Subject(s)</u></strong></h4>
                     
            <div class="course-master-index">
    <?= GridView::widget([
        'id'=>'grid',
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            [
            'class' => 'yii\grid\CheckboxColumn',
            'header' => Html::checkBox('selection_all', false, [    
            'class' => 'select-on-check-all',
            'label' => 'All',
                ]),
            'visible'=> true,
            'contentOptions' =>['style' => 'vertical-align:middle;width:30px'],

                'checkboxOptions' => function($model, $key, $index, $column) {
                    return ['value' => $model->subject_id];
                }
             ],
            ['class' => 'yii\grid\SerialColumn'],

           // 'id',
            'subject_name',

                                 ],
    ]); ?>
    <?= Html::input('hidden','keylists',$value='', $options=['id'=>'keylist'])  ?>
    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' =>'btn btn-success btn-block btn-lg','id'=>"button123"]) ?>
    </div>
	</div>
      </div>
      <?php ActiveForm::end(); ?>
    </div>
</div>  

我的问题是

使用表subject_id中的复选框选择特定的行(aca_subjects)之后,还如图所示选择下拉列表

  1. 如何将它们(class_subject_subject_idclass_subject_class_idclass_subject_class_group_id)插入表aca_class_subjects中?
  2. 如何将它们(class_subject_subject_idclass_subject_class_idclass_subject_class_group_id)更新到表aca_class_subjects
  3. 未选择任何内容时如何显示对话框?

注意:class_subject_subject_id(网格视图中的复选框),class_subject_class_id(下拉列表),class_subject_class_group_id(下拉列表)

当我单击提交时,没有任何内容进入数据库

1 个答案:

答案 0 :(得分:1)

好吧,问题有点广泛,因为您没有显示任何与解决问题相关的代码,因此我的猜测是您有一个基本的topstopper用于从gridview收集class_subject_subject_id。因此,我将在我的答案中建议javascript部分,该部分将使用ajax提交表单。

但是在我建议您一个解决方案之前,您有一个基本问题,就是使用将主题插入aca_class_subjects

的形式包装gridview。

为什么?

  • 因为如果用表格和Gridview过滤器包装Gridview,则GridView不会创建自己的隐藏表单,用于将过滤器输入提交给GridView进行搜索,因此,当您尝试通过键入进行搜索时GridView过滤器输入,它将提交给您在外部表单中指定的操作,该操作可以像您的情况一样具有不同的操作。

因此,如果您仍要使用ActiveForm,请不要将Gridview包裹在窗体内,请使其分开,并在调用GridView::widget()之前将其关闭,但是将按钮放在{{1 }},并且您不想更改设计,因此可以将按钮的代码从Gridview更改为Html::submitButton(),并将其保留在您创建的Html::button()之外。您可以使用javascript提交表单。

因此您的查看代码应如下所示

ActiveForm

现在要保存记录。

通过使用以下javascript代码,您可以在网格视图中获取所有选定的主题,在这些代码中,您可以选中所有名称为<div class="col-xs-12" style="padding-top: 10px;"> <div class="box"> <?php $form = ActiveForm::begin([ 'id' => 'academic-level-form', 'enableAjaxValidation' => false, 'action'=>\yii\helpers\Url::to(['assign-subjects']) 'fieldConfig' => [ 'template' => "{label}{input}{error}", ], ]); ?> <div class="col-xs-12 col-lg-12 no-padding"> <div class="col-xs-12 col-sm-6 col-lg-6"> <?= $form->field($model, 'class_subject_class_group_id')->widget(Select2::classname(), [ 'data' => ArrayHelper::map(\app\modules\academic\models\AcaClassGroups::find()->where(['is_status' => 0])->all(), 'class_group_id', 'class_group_name'), 'language' => 'en', 'options' => ['placeholder' => '--- Select Class Group ---', 'onchange' => ' $.get( "' . Url::toRoute('dependent/getclassmaster') . '", { id: $(this).val() } ) .done(function( data ) { $( "#' . Html::getInputId($model, 'class_subject_class_id') . '" ).html( data ); } );' ], // 'disabled'=>'true', 'pluginOptions' => [ 'allowClear' => true ], ]); ?> </div> <div class="col-xs-12 col-sm-6 col-lg-6"> <?= $form->field($model, 'class_subject_class_id')->widget(Select2::classname(), [ 'data' => ArrayHelper::map(\app\modules\academic\models\AcaClassMaster::findAll(['class_id' => $model->class_subject_class_id]), 'class_id', 'class_name'), 'language' => 'en', 'options' => ['placeholder' => '--- Select Class ---'], 'pluginOptions' => [ 'allowClear' => true ], ]); ?> </div> </div> <?=Html::input('hidden', 'keylists', $value = '', $options = ['id' => 'keylist']) ?> <?php ActiveForm::end(); ?> <div class="box-body table-responsive"> <h4><strong><u>Select Subject(s)</u></strong></h4> <div class="course-master-index"> <?= GridView::widget([ 'id' => 'grid', 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ [ 'class' => 'yii\grid\CheckboxColumn', 'header' => Html::checkBox('selection_all', false, [ 'class' => 'select-on-check-all', 'label' => 'All', ]), 'visible' => true, 'contentOptions' => ['style' => 'vertical-align:middle;width:30px'], 'checkboxOptions' => function($model, $key, $index, $column){ return ['value' => $model->subject_id]; } ], ['class' => 'yii\grid\SerialColumn'], // 'id', 'subject_name', ], ]); ?> <div class="form-group"> <?=Html::button('Submit', ['class' => 'btn btn-success btn-block btn-lg', 'id' => "button123"]) ?> </div> </div> </div> </div> </div> 的复选框。在您的视图顶部添加以下代码

selection[]

现在,如果您在提交表单的控制器的$reflect = new ReflectionClass($model); $subjectId = $reflect->getShortName() . '[class_subject_subject_id][]'; $js = <<<JS $("#button123").on('click',function(e){ e.preventDefault(); $("#academic-level-form").yiiActiveForm('submitForm'); }); $("#academic-level-form").on('beforeSubmit',function(e){ e.preventDefault(); // yii.getCsrfParam(),yii.getCsrfToken(), let subjects=$("input[name='selection[]']:checked"); let subjectsSelected=subjects.length; if(!subjectsSelected){ alert('select some subjects first'); }else{ let data=$(this).serializeArray(); $.each(subjects,function(index,elem){ data.push({name:"$subjectId",value:$(elem).val()}) }); let url=$(this).attr('action'); $.ajax({ url:url, data:data, type:'POST', }).done(function(data){ alert(data); }).fail(function(jqxhr,text,error){ alert(error); }); } return false; }); JS; $this->registerJs($js, \yii\web\View::POS_READY); 中有print_r(Yii::$app->request->post()),您将看到发布的变量的输出,并且您的主题将位于您使用的同一模型数组下用于使用名称actionAssignSubjects()填充下拉列表,所有选定的主题将在此数组下。您可以将它们循环以保存到所需的模型。

我将剩下的工作留给您自己完成,如果遇到任何问题,您应该用目标代码发布一个单独的问题。