Yii2 - yii \ grid \ CheckboxColumn - Массовое обновление и вставка выбранных строк в другую таблицу - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть таблица с этими полями:

aca_class_subjects: 
                    class_subject_id, class_subject_subject_id, 
                    class_subject_class_group_id, class_subject_class_id

class_subject_id - это первичный ключ, и он auto_increment. class_subject_class_id и class_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;
}

View

<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_id, class_subject_class_id, class_subject_class_group_id) в таблицу aca_class_subjects?
  2. Как мне обновить их (class_subject_subject_id, class_subject_class_id, class_subject_class_group_id) в таблице aca_class_subjects?
  3. Как отобразить диалоговое окно, когда ничего не выбрано?

Примечание: class_subject_subject_id (флажок в виде таблицы), class_subject_class_id (раскрывающийся список), class_subject_class_group_id (раскрывающийся список)

Когда я нажимал на кнопку отправить, в базу данных ничего не попадает

1 Ответ

0 голосов
/ 14 ноября 2018

Ну, вопрос немного шире, поскольку вы не показали ни одного кода, связанного с решением вашей проблемы, поэтому я предпочитаю, что у вас есть базовый showtopper для сбора class_subject_subject_id из сетки.поэтому я предложу часть javascript в своем ответе, где она отправляет форму с помощью ajax.

Но прежде чем я предложу вам решение, у вас есть основная проблема, заключающаяся в том, что вы оборачиваете gridview в форму, которую вы используете для вставкисубъекты в aca_class_subjects

Почему?

  • Поскольку, если вы оберните Gridview формой вместе с фильтрами gridview, GridView не создаст свою собственную скрытую форму, которую используетдля отправки входных данных фильтра для поиска в GridView, и, следовательно, когда вы попытаетесь выполнить поиск, введя входные данные фильтра GridView, он отправит его в действие, указанное во внешней форме, которое может иметь другое действие, как в вашем случае.

Так что, если вы все еще хотите использовать ActiveForm, не оборачивайте Gridview внутри формы, держите его отдельно и закройте, прежде чем вызывать GridView::widget(), но у вас есть кнопка, помещенная в конце Gridview и вы не хотите менять дизайн, поэтому измените код кнопки с Html::submitButton() на Html::button()держите его за пределами 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>  

Теперь о сохранении записей.

Вы можете получить все выбранные объекты, которые находятся в виде сетки, используя следующий код JavaScript, где вы выбираете все отмеченные флажки, которые имеют имя 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() в вашем контроллере, куда отправляется форма, вы можете увидеть вывод опубликованных переменных и ваших тем.будет находиться в том же массиве моделей, который вы используете для заполнения раскрывающихся списков с именем class_subject_subject_id, и все выбранные объекты будут в этом массиве.Вы можете зациклить их, чтобы сохранить желаемую модель.

Я оставляю оставшуюся часть работы на вас, и если у вас возникнут какие-либо проблемы, вы должны написать отдельный вопрос с целевым кодом.

...