Yii2 сохранение связанных данных

Короче, есть 3 таблицы в бд.
Таблица хранящая название тем S_QUIZ_TOPIC с полями:

Код: Выделить всё

integer $ID_REC string $NAME_TOPIC integer $RANDOM integer $MAX_TIME string $DT_UP integer $STATUS Таблица хранящая вопросы S_QUIZ_QUESTION с полями:

Код: Выделить всё

integer $ID_REC string $NAME_QUEST string $TEXT_QUEST string $MSG_QUEST integer $RANDOM string $DT_UP integer $STATUS И связывающая эти 2 таблицы S_QUIZ_TQ:

Код: Выделить всё

integer $ID_REC integer $ID_TOPIC integer $ID_QUESTION string $DT_UP integer $STATUS Для каждой таблицы сгенерированы модели.
Для S_QUIZ_TOPIC и S_QUIZ_QUESTION сгенерированы контроллеры и представления в CRUD.
Суть задания:
При создании новой темы (представление create модели S_QUIZ_TOPIC) и при редактировании существующей темы (предстевление update модели S_QUIZ_TOPIC) создать 2 таблицы, в 1-й должны выводится список всех вопросов, которые не включены в данную тему, и во 2-й таблице список всех вопросов, которые включены в данную таблицу. Должна быть возможность переноса данных между этими таблицами и сохранение данных после нажатия на клавишу "Добавить" (представление create модели S_QUIZ_TOPIC) или "Применить изменения" (предстевление update модели S_QUIZ_TOPIC).
Таблицы реализованы, перенос данных между ними работает.
Вот фото как это выглядит:
Изображение
Вот код формы с таблицами:

Код: Выделить всё

<?php use yii\helpers\Html; use yii\widgets\ActiveForm; use yii\widgets\Pjax;?> <div class="squiz-topic-form"> <?php $form = ActiveForm::begin();?> <?= $form->field($model, 'NAME_TOPIC')->textInput(['maxlength' => связанных true])?> <?= $form->field($model, 'MAX_TIME')->input('number', ['min' => 0, 'max' => 10])?> <?= $form->field($model, 'RANDOM')->checkbox()?> <div> <!-- Навигация --> <ul class="nav nav-pills nav-justified panel panel-primary" role="tablist"> <li class="active"> <a href="#questionintopik" aria-controls="questionintopik" role="tab" data-toggle="tab">Вопросы входящие в эту тему</a> </li> <li> <a href="#questioninexam" aria-controls="questioninexam" role="tab" data-toggle="tab">Экзамены, в которые входит эта тема</a> </li> </ul> <!-- Содержимое вкладок --> <div class="tab-content"> <!--Вопросы входящие в эту тему--> <div role="tabpanel" class="tab-pane active panel panel-primary" id="questionintopik"> <div class="row"> <!-- Таблица №1 --> <div class="col-lg-5"> <?php Pjax::begin();?> <h4>Вопросы не входящие в эту тему</h4> <input id="search-avaliable"> <a href="#" id="btn-refresh"> <span class="glyphicon glyphicon-refresh"></span> </a> <br> <?= Html::activeListBox($model, 'ID_REC', $LeftItems, ['multiple' => true, 'size' => 20, 'style' => 'width: 100%', 'id' => 'first'])?> <?php Pjax::end();?> </div> <!-- Кнопки --> <div class="col-lg-1"> <br><br><br><br><br><br><br><br><br><br> <a id="btn-add" class="btn btn-success">&gt;&gt;</a><br> <a id="btn-remove" class="btn btn-danger">&lt;&lt;</a> <!-- Скрипты для кнопок --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script> $(function() { $(document).on('click', '#btn-add', function(event) { event.preventDefault(); var selected = $(document).find('#first option:selected'); if (selected.length > 0) { selected.appendTo('#second'); } }); $(document).on('click', '#btn-remove', function(event) { event.preventDefault(); var selected = $(document).find('#second option:selected'); if (selected.length > 0) { selected.appendTo('#first'); } }); }); </script> </div> <!-- Таблица №2 --> <div class="col-lg-5"> <?php Pjax::begin();?> <h4>Вопросы входящие в эту тему</h4> <input id="search-assigned"><br> <?= Html::activeListBox($model, 'ID_REC', $RightItems, ['multiple' => true, 'size' => 20, 'style' => 'width: 100%', 'id' => 'second'])?> <?php Pjax::end();?> </div> </div> </div> <!--Экзамены, в которые входит эта тема--> <div role="tabpanel" class="tab-pane panel panel-primary" id="questioninexam"> <div class="squiztopic-update"> <div class="container"> <div class="col-sm-5"> <?php Pjax::begin();?> <?php Pjax::end();?> </div> <div class="col-sm-5"> <?php Pjax::begin();?> <?php Pjax::end();?> </div> </div> </div> </div> </div> </div> <div class="form-group"> <?= Html::submitButton($model->isNewRecord? 'Добавить' : 'Применить изменения', ['class' => $model->isNewRecord? 'btn btn-success' : 'btn btn-primary'])?> </div> <?php ActiveForm::end();?> </div> Код контроллера (На примере представления view, где описаны все нужные переменные):

Код: Выделить всё

public function actionView($id) { $model = $this->findModel($id); $searchModel = new SQuizQuestionSearch(); $dataProviderLeft = $searchModel->search(Yii::$app->request->queryParams); $dataProviderRight = new ActiveDataProvider([ 'query' => $model->getQuestions(), 'pagination' => [ 'pageSize' => 1000, ], ]); $LeftItems = ArrayHelper::map($dataProviderLeft->getModels(),'ID_REC','NAME_QUEST'); $RightItems = ArrayHelper::map($dataProviderRight->getModels(), 'ID_REC', 'NAME_QUEST'); return $this->render('view', [ 'model' => $model, 'searchModel' => $searchModel, 'dataProviderLeft' => $dataProviderLeft, 'LeftItems' => $LeftItems, 'dataProviderRight' => $dataProviderRight, 'RightItems' => $RightItems, ]); План действий такой:
1) Пока что таблицы реализованы в представлении view модели S_QUIZ_TOPIC. Мне нужно их перенести в форму (_form) что бы эти таблицы одинаково отображались в представлениях create и update. Я попробовал их перенести в форму, но мне пишет

Код: Выделить всё

"Undefined variable: LeftItems" "Undefined variable: RightItems" Как передать эти переменные в саму форму, что бы все заработало? Или мне нужно не в форме описывать данные таблицы а в каждом из представлений? РЕШЕНО
2) После того как таблицы будут отображаться. В каждой из этих таблиц выводится максимум по 20 значений. Я так понимаю что проблема в этом: 'size' => 20. Как сделать так что бы там отображались все вопросы в данных таблицах? Может вместо activeListBox нужно использовать dropDownList? РЕШЕНО
3) После решения проблемы с количеством отображаемых данных. На данный момент у меня в левой таблице выводятся абсолютно все вопросы, в правую - только те вопросы, которые принадлежат этой теме. Как сделать так что бы в левой таблице отображались только те вопросы, которых нету в правой? Данные между таблицами переносятся. Если я создаю новую тему, то после нажатия на клавишу "добавить" все выбранные вопросы (Правая таблица) должны сохранится в бд. Как это реализовать?
4) Если я редактирую существующую тему, то при переходи в представление "update" нужно что бы сразу подгрузились данные из бд в эти таблицы. Напомню, левая таблица - список всех вопросов не вошедших в данную тему, правая - список всех вопросов вошедших в эту тему. РЕШЕНО
Помогите пожалуйста со всем этим.

Последний раз редактировалось Sanvirtus 2017.05.15, 13:30, всего редактировалось 10 раз.


Источник: http://yiiframework.ru/forum/viewtopic.php?t=43492&start=20



Рекомендуем посмотреть ещё:


Закрыть ... [X]

Пошаговое руководство сохранения связанных данных Yii / Хабрахабр Делаем ободок ручной работы

Yii2 сохранение связанных данных Yii2 сохранение связанных данных Yii2 сохранение связанных данных Yii2 сохранение связанных данных Yii2 сохранение связанных данных Yii2 сохранение связанных данных Yii2 сохранение связанных данных Yii2 сохранение связанных данных Yii2 сохранение связанных данных

ШОКИРУЮЩИЕ НОВОСТИ