changing foreign key in user_response from id to uuid, completed add greedy loading, some refactoring

This commit is contained in:
iIronside
2021-11-09 17:41:44 +03:00
parent de90b3178e
commit 560de1c05e
29 changed files with 3539 additions and 202 deletions

View File

@ -81,7 +81,7 @@ return [
'components' => [
'request' => [
'csrfParam' => '_csrf-backend',
'baseUrl' => '/secure', // /secure
'baseUrl' => '', // /secure
'parsers' => [
'application/json' => 'yii\web\JsonParser',
'text/xml' => 'yii/web/XmlParser',

View File

@ -57,7 +57,7 @@ class QuestionnaireCategoryController extends Controller
$model = $this->findModel($id);
$questionnaireSearchModel = new QuestionnaireSearch();
$questionnaireDataProvider = new ActiveDataProvider([
'query' => $model->getQuestionnaires(),
'query' => $model->getQuestionnaires()->with('category'),
'pagination' => [
'pageSize' => 20,
],

View File

@ -58,7 +58,7 @@ class QuestionnaireController extends Controller
$model = $this->findModel($id);
$questionSearchModel = new QuestionSearch();
$questionDataProvider = new ActiveDataProvider([
'query' => $model->getQuestions(),
'query' => $model->getQuestions()->with('questionType'),
'pagination' => [
'pageSize' => 20,
],

View File

@ -60,7 +60,7 @@ class UserQuestionnaireController extends Controller
{
$model = $this->findModel($id);
$responseDataProvider = new ActiveDataProvider([
'query' => $model->getUserResponses(),
'query' => $model->getUserResponses()->with('question', 'questionType'),
'pagination' => [
'pageSize' => 20,
],

View File

@ -7,6 +7,7 @@ use backend\modules\questionnaire\models\UserQuestionnaire;
use Yii;
use backend\modules\questionnaire\models\UserResponse;
use backend\modules\questionnaire\models\UserResponseSearch;
use yii\helpers\ArrayHelper;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
@ -37,18 +38,12 @@ class UserResponseController extends Controller
*/
public function actionIndex()
{
$questionnaire = new Questionnaire();
$model = new UserResponse();
$searchModel = new UserResponseSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'model' => $model,
'questionnaire' => $questionnaire
]);
}
@ -90,16 +85,15 @@ class UserResponseController extends Controller
* @return mixed
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionUpdate(int $id, $user_questionnaire_id = null)
public function actionUpdate($id, $user_questionnaire_uuid = null)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
if ($user_questionnaire_id !== null)
if ($user_questionnaire_uuid !== null)
{
return $this->redirect(['user-questionnaire/view', 'id' => $user_questionnaire_id]);
return $this->redirect(['user-questionnaire/view', 'id' => $this->findQuestionnaireId($model),]);
}
return $this->redirect(['view', 'id' => $model->id]);
}
@ -115,8 +109,18 @@ class UserResponseController extends Controller
* @return mixed
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionDelete($id)
public function actionDelete($id, $user_questionnaire_uuid = null)
{
if ($user_questionnaire_uuid !== null)
{
$model = $this->findModel($id);
$questionnaireId = $this->findQuestionnaireId($model);
$model->delete();
return $this->redirect(['user-questionnaire/view', 'id' => $questionnaireId]);
}
$this->findModel($id)->delete();
return $this->redirect(['index']);
@ -138,27 +142,8 @@ class UserResponseController extends Controller
throw new NotFoundHttpException('The requested page does not exist.');
}
public function actionQuestionnaire()
protected function findQuestionnaireId($model)
{
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
if (isset($_POST['depdrop_parents'])) {
$parents = $_POST['depdrop_parents'];
if ($parents != null) {
$user_id = $parents[0];
$questionnairesArr = UserQuestionnaire::getQuestionnaireByUser($user_id);
return ['output'=>$questionnairesArr, 'selected'=>''];
}
}
return ['output'=>'', 'selected'=>''];
}
public function actionTest()
{
return $this->render('update', [
'model' => new UserQuestionnaire(),
]);
return ArrayHelper::getValue($model, 'questionnaire.id');
}
}

View File

@ -41,7 +41,7 @@ class UserQuestionnaireSearch extends UserQuestionnaire
*/
public function search($params)
{
$query = UserQuestionnaire::find()->with('questionnaire')->joinWith('user');
$query = UserQuestionnaire::find()->with('questionnaire', 'user');
// add conditions that should always apply here

View File

@ -17,8 +17,8 @@ class UserResponseSearch extends UserResponse
public function rules()
{
return [
[['id', 'user_id', 'question_id', 'user_questionnaire_id'], 'integer'],
[['response_body', 'created_at', 'updated_at'], 'safe'],
[['id', 'user_id', 'question_id'], 'integer'],
[['response_body', 'created_at', 'updated_at', 'user_questionnaire_uuid'], 'safe'],
[['answer_flag'], 'number'],
];
}
@ -41,7 +41,7 @@ class UserResponseSearch extends UserResponse
*/
public function search($params)
{
$query = UserResponse::find()->with('user');
$query = UserResponse::find()->with(['user', 'question', 'questionnaire']);
// add conditions that should always apply here
@ -65,10 +65,10 @@ class UserResponseSearch extends UserResponse
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
'answer_flag' => $this->answer_flag,
'user_questionnaire_id' => $this->user_questionnaire_id,
]);
$query->andFilterWhere(['like', 'response_body', $this->response_body]);
$query->andFilterWhere(['like', 'response_body', $this->response_body])
->andFilterWhere(['like', 'user_questionnaire_uuid', $this->user_questionnaire_uuid]);
return $dataProvider;
}

View File

@ -3,8 +3,10 @@
use backend\modules\questionnaire\models\Question;
use common\helpers\AnswerHelper;
use common\helpers\StatusHelper;
use kartik\select2\Select2;
use yii\helpers\Html;
use yii\grid\GridView;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $searchModel backend\modules\questionnaire\models\AnswerSearch */
@ -21,6 +23,20 @@ $this->params['breadcrumbs'][] = $this->title;
<?= Html::a('Создать новый ответ', ['create'], ['class' => 'btn btn-success']) ?>
</p>
<!-- --><?php
//
// echo Select2::widget([
// 'model' => \backend\modules\questionnaire\models\Questionnaire::findOne()->where(['id'=>1]),
// 'attribute' => 'state_2',
// 'data' => 1,
// 'options' => ['placeholder' => 'Select a state ...'],
// 'pluginOptions' => [
// 'allowClear' => true
// ],
// ]);
//
// ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
@ -37,7 +53,7 @@ $this->params['breadcrumbs'][] = $this->title;
'format' => 'raw',
'filter' => AnswerHelper::answerFlagsList(),
'value' => function ($model) {
return AnswerHelper::answerStatusLabel($model->answer_flag);
return AnswerHelper::answerFlagLabel($model->answer_flag);
},
],
[

View File

@ -48,7 +48,7 @@ function cut_title($str)
'attribute' => 'answer_flag',
'format' => 'raw',
'filter' => AnswerHelper::answerFlagsList(),
'value' => AnswerHelper::answerStatusLabel($model->answer_flag),
'value' => AnswerHelper::answerFlagLabel($model->answer_flag),
],
[
'attribute' => 'status',

View File

@ -81,7 +81,7 @@ $this->params['breadcrumbs'][] = $this->title;
'format' => 'raw',
'filter' => AnswerHelper::answerFlagsList(),
'value' => function ($model) {
return AnswerHelper::answerStatusLabel($model->answer_flag);
return AnswerHelper::answerFlagLabel($model->answer_flag);
},
],
[

View File

@ -41,9 +41,7 @@ YiiAsset::register($this);
'attribute' => 'status',
'format' => 'raw',
'filter' => StatusHelper::statusList(),
'value' => function($model) {
return StatusHelper::statusLabel($model->status);
},
'value' => StatusHelper::statusLabel($model->status),
],
'created_at',
'updated_at',

View File

@ -16,9 +16,9 @@ use yii\widgets\Pjax;
/* @var $responseDataProvider yii\data\ActiveDataProvider */
$user = $model->getUserName();
$questionnaire = $model->getQuestionnaireTitle();
$questionnaire_title = $model->getQuestionnaireTitle();
$this->title = $user . ": " . $questionnaire;
$this->title = $user . ": " . $questionnaire_title;
$this->params['breadcrumbs'][] = ['label' => 'User Questionnaires', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
YiiAsset::register($this);
@ -85,7 +85,7 @@ YiiAsset::register($this);
<?= Html::a('Проверить ответы', ['rate-responses', 'id' => $model->id], [
'class' => 'btn btn-primary',
'data' => [
'confirm' => 'Проверка ответов пользователя: ' . $user . ". Категория: " . $questionnaire,
'confirm' => 'Проверка ответов пользователя: ' . $user . ". Категория: " . $questionnaire_title,
// 'method' => 'post',
],
]) ?>
@ -135,15 +135,13 @@ YiiAsset::register($this);
],
[
'attribute' => 'Тип вопроса',
'value' => function($model) {
return $model->getQuestionType();
}
'value' => 'questionType.question_type',
],
[
'attribute' => 'answer_flag',
'format' => 'raw',
'value' => function ($model) {
return AnswerHelper::answerFlagLable($model->answer_flag);
return AnswerHelper::answerStatusLabel($model->answer_flag);
},
],
@ -156,7 +154,14 @@ YiiAsset::register($this);
'update' => function ($url,$model) {
return Html::a(
'<span class="glyphicon glyphicon-pencil"></span>',
['user-response/update', 'id' => $model['id'], 'user_questionnaire_id' => $model['user_questionnaire_id']]);
['user-response/update', 'id' => $model['id'], 'user_questionnaire_uuid' => $model['user_questionnaire_uuid']]);
},
'delete' => function ($url,$model) {
return Html::a(
'<span class="glyphicon glyphicon-trash"></span>',
['user-response/delete', 'id' => $model['id'], 'user_questionnaire_uuid' => $model['user_questionnaire_uuid']],
['data' => ['confirm' => 'Вы уверены, что хотите удалить этот вопрос?', 'method' => 'post']]
);
},
],
],

View File

@ -1,7 +1,8 @@
<?php
use backend\modules\questionnaire\models\Question;
use backend\modules\questionnaire\models\UserQuestionnaire;
use common\helpers\AnswerHelper;
use common\models\User;
use kartik\select2\Select2;
use yii\helpers\Html;
use yii\widgets\ActiveForm;
@ -15,47 +16,36 @@ use yii\widgets\ActiveForm;
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'answer_flag')->dropDownList(
<?= $form->field($model, 'user_id')->widget(Select2::className(),
[
'' => 'Не задано',
'0.1' => '10%',
'0.2' => '20%',
'0.3' => '30%',
'0.5' => '50%',
'0.7' => '70%',
'0.8' => '80%',
'0.85' => '85%',
'0.9' => '90%',
'1' => '100%',
'data' => User::find()->select(['username', 'id'])->indexBy('id')->column(),
'options' => ['placeholder' => 'Выберите пользователя','class' => 'form-control'],
'pluginOptions' => [
'placeholder' => 'Выберите',
'allowClear' => true
],
]) ?>
<?= $form->field($model, 'question_id')->widget(Select2::className(),
[
'data' => Question::find()->select(['question_body', 'id'])->indexBy('id')->column(),
'options' => ['placeholder' => 'Выберите пользователя','class' => 'form-control'],
'pluginOptions' => [
'placeholder' => 'Выберите',
'allowClear' => true
],
]) ?>
<?= $form->field($model, 'response_body')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'answer_flag')->dropDownList(
AnswerHelper::answerFlagsList(),
[
'prompt' => 'Выберите'
]
) ?>
<?= $form->field($model, 'user_id')->widget(Select2::class, [
'data' => \common\models\User::find()->select(['username','id'] )->indexBy('id')->column(),
'options' => ['placeholder' => '...','class' => 'form-control'],
'pluginOptions' => [
'allowClear' => true
],
]); ?>
<?= $form->field($model, 'question_id')->widget(Select2::class,[
'data' => Question::find()->select(['question_body', 'id'])->indexBy('id')->column(),
'pluginOptions' => [
'allowClear' => true // 'id != :id', ['id'=>1]
],
])?>
<?= $form->field($model, 'user_questionnaire_id')->widget(Select2::class,[
'data' => UserQuestionnaire::find()->select(['id', 'id'])->indexBy('id')->column(),
'options' => ['placeholder' => '...','class' => 'form-control'],
'pluginOptions' => [
'allowClear' => true
],
])?>
<?= $form->field($model, 'response_body')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'user_questionnaire_uuid')->textInput(['maxlength' => true]) ?>
<div class="form-group">
<?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>

View File

@ -25,11 +25,11 @@ use yii\widgets\ActiveForm;
<?= $form->field($model, 'created_at') ?>
<?php // echo $form->field($model, 'answer_flag') ?>
<?php // echo $form->field($model, 'updated_at') ?>
<?php // echo $form->field($model, 'user_questionnaire_id') ?>
<?php // echo $form->field($model, 'answer_flag') ?>
<?php // echo $form->field($model, 'user_questionnaire_uuid') ?>
<div class="form-group">
<?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>

View File

@ -5,7 +5,7 @@ use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $model backend\modules\questionnaire\models\UserResponse */
$this->title = 'Создать ответ пользователя';
$this->title = 'Новый ответ пользователя';
$this->params['breadcrumbs'][] = ['label' => 'User Responses', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>

View File

@ -1,29 +1,23 @@
<?php
use backend\modules\questionnaire\models\Questionnaire;
use backend\modules\questionnaire\models\Question;
use backend\modules\questionnaire\models\UserQuestionnaire;
use common\helpers\AnswerHelper;
use common\models\User;
use kartik\depdrop\DepDrop;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\grid\GridView;
use yii\helpers\Url;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $searchModel backend\modules\questionnaire\models\UserResponseSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
/* @var $model backend\modules\questionnaire\models\UserResponse */
/* @var $questionnaire backend\modules\questionnaire\models\Questionnaire */
$this->title = 'Ответы пользователей';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="user-responses-index">
<div class="user-response-index">
<p>
<?= Html::a('Создать новый ответ пользователя', ['create'], ['class' => 'btn btn-success']) ?>
<?= Html::a('Новый ответ пользователя', ['create'], ['class' => 'btn btn-success']) ?>
</p>
<?= GridView::widget([
@ -31,39 +25,34 @@ $this->params['breadcrumbs'][] = $this->title;
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
[
'attribute' => 'user_questionnaire_id',
'filter' => Questionnaire::find()->select(['title', 'id'])->indexBy('id')->column(),
'value' => function($model){
return $model->getQuestionnaireTitle();
}
],
[
'attribute' => 'user_id',
'filter' => User::find()->select(['username', 'id'])->indexBy('id')->column(),
'value' => 'user.username',
],
[
'attribute' => 'question_id',
'filter' => Question::find()->select(['question_body', 'id'])->indexBy('id')->column(),
'value' => 'question.question_body',
],
'response_body',
'created_at',
'updated_at',
[
'attribute' => 'Тип вопроса',
'value' => function($model){
return $model->getQuestionType();
}
],
[
'attribute' => 'answer_flag',
'filter' => AnswerHelper::answerFlagsList(),
'attribute' =>'answer_flag',
'format' => 'raw',
'filter' => AnswerHelper::answerFlagsList(),
'value' => function ($model) {
return AnswerHelper::answerFlagLable($model->answer_flag);
return AnswerHelper::answerStatusLabel($model->answer_flag);
},
],
[
'attribute' => 'user_questionnaire_uuid',
'filter' => UserQuestionnaire::find()->select(['uuid', 'id'])->indexBy('id')->column(),
'value' => 'questionnaire.title',
],
['class' => 'yii\grid\ActionColumn'],
],
]); ?>

View File

@ -5,7 +5,7 @@ use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $model backend\modules\questionnaire\models\UserResponse */
$this->title = 'Изменение ответа: ' . $model->response_body;
$this->title = 'Изменение ответа пользователя';
$this->params['breadcrumbs'][] = ['label' => 'User Responses', 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => $model->id, 'url' => ['view', 'id' => $model->id]];
$this->params['breadcrumbs'][] = 'Update';

View File

@ -8,20 +8,11 @@ use yii\widgets\DetailView;
/* @var $this yii\web\View */
/* @var $model backend\modules\questionnaire\models\UserResponse */
/* @var $responseDataProvider yii\data\ActiveDataProvider */
$this->title =cut_title($model->response_body);
$this->title = $model->response_body;
$this->params['breadcrumbs'][] = ['label' => 'User Responses', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
YiiAsset::register($this);
function cut_title($str)
{
if(strlen($str) > 40){
return mb_substr($str, 0, 40, 'UTF-8') . '...';
}
return $str;
}
?>
<div class="user-response-view">
@ -42,22 +33,20 @@ function cut_title($str)
'attributes' => [
'id',
[
'attribute' => 'Пользователь',
'value' => ArrayHelper::getValue($model,'user.username'),
'attribute' => 'user_id',
'value' => ArrayHelper::getValue($model, 'user.username'),
],
[
'attribute' => 'Вопрос',
'value' => ArrayHelper::getValue($model,'question.question_body'),
'attribute' => 'question_id',
'value' => ArrayHelper::getValue($model, 'question.question_body'),
],
'response_body',
'created_at',
'updated_at',
[
'attribute' => 'answer_flag',
'format' => 'raw',
'value' => AnswerHelper::answerFlagLable($model->answer_flag),
'value' => AnswerHelper::answerFlagLabel($model->answer_flag),
],
'user_questionnaires_uuid',
'user_questionnaire_uuid',
],
]) ?>