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