From c4d35ace8651300c33f12bb9f53326f2792c0252 Mon Sep 17 00:00:00 2001 From: iironside Date: Wed, 9 Mar 2022 19:10:44 +0300 Subject: [PATCH] add module test task --- backend/modules/test/Test.php | 24 ++++ .../test/controllers/TestTaskController.php | 127 ++++++++++++++++++ backend/modules/test/models/TestTask.php | 8 ++ .../modules/test/models/TestTaskSearch.php | 71 ++++++++++ .../modules/test/views/test-task/_form.php | 38 ++++++ .../modules/test/views/test-task/_search.php | 35 +++++ .../modules/test/views/test-task/create.php | 18 +++ .../modules/test/views/test-task/index.php | 57 ++++++++ .../modules/test/views/test-task/update.php | 19 +++ backend/modules/test/views/test-task/view.php | 70 ++++++++++ backend/views/layouts/left.php | 2 + common/models/TestTask.php | 75 +++++++++++ .../m220309_134047_create_test_task_table.php | 31 +++++ 13 files changed, 575 insertions(+) create mode 100644 backend/modules/test/Test.php create mode 100644 backend/modules/test/controllers/TestTaskController.php create mode 100644 backend/modules/test/models/TestTask.php create mode 100644 backend/modules/test/models/TestTaskSearch.php create mode 100644 backend/modules/test/views/test-task/_form.php create mode 100644 backend/modules/test/views/test-task/_search.php create mode 100644 backend/modules/test/views/test-task/create.php create mode 100644 backend/modules/test/views/test-task/index.php create mode 100644 backend/modules/test/views/test-task/update.php create mode 100644 backend/modules/test/views/test-task/view.php create mode 100644 common/models/TestTask.php create mode 100644 console/migrations/m220309_134047_create_test_task_table.php diff --git a/backend/modules/test/Test.php b/backend/modules/test/Test.php new file mode 100644 index 0000000..e4fc6f7 --- /dev/null +++ b/backend/modules/test/Test.php @@ -0,0 +1,24 @@ + [ + 'class' => VerbFilter::className(), + 'actions' => [ + 'delete' => ['POST'], + ], + ], + ]; + } + + /** + * Lists all TestTask models. + * @return mixed + */ + public function actionIndex() + { + $searchModel = new TestTaskSearch(); + $dataProvider = $searchModel->search(Yii::$app->request->queryParams); + + return $this->render('index', [ + 'searchModel' => $searchModel, + 'dataProvider' => $dataProvider, + ]); + } + + /** + * Displays a single TestTask model. + * @param integer $id + * @return mixed + * @throws NotFoundHttpException if the model cannot be found + */ + public function actionView($id) + { + return $this->render('view', [ + 'model' => $this->findModel($id), + ]); + } + + /** + * Creates a new TestTask model. + * If creation is successful, the browser will be redirected to the 'view' page. + * @return mixed + */ + public function actionCreate() + { + $model = new TestTask(); + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + return $this->redirect(['view', 'id' => $model->id]); + } + + return $this->render('create', [ + 'model' => $model, + ]); + } + + /** + * Updates an existing TestTask model. + * If update is successful, the browser will be redirected to the 'view' page. + * @param integer $id + * @return mixed + * @throws NotFoundHttpException if the model cannot be found + */ + public function actionUpdate($id) + { + $model = $this->findModel($id); + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + return $this->redirect(['view', 'id' => $model->id]); + } + + return $this->render('update', [ + 'model' => $model, + ]); + } + + /** + * Deletes an existing TestTask model. + * If deletion is successful, the browser will be redirected to the 'index' page. + * @param integer $id + * @return mixed + * @throws NotFoundHttpException if the model cannot be found + */ + public function actionDelete($id) + { + $this->findModel($id)->delete(); + + return $this->redirect(['index']); + } + + /** + * Finds the TestTask model based on its primary key value. + * If the model is not found, a 404 HTTP exception will be thrown. + * @param integer $id + * @return TestTask the loaded model + * @throws NotFoundHttpException if the model cannot be found + */ + protected function findModel($id) + { + if (($model = TestTask::findOne($id)) !== null) { + return $model; + } + + throw new NotFoundHttpException('The requested page does not exist.'); + } +} diff --git a/backend/modules/test/models/TestTask.php b/backend/modules/test/models/TestTask.php new file mode 100644 index 0000000..a30a8eb --- /dev/null +++ b/backend/modules/test/models/TestTask.php @@ -0,0 +1,8 @@ + $query, + ]); + + $this->load($params); + + if (!$this->validate()) { + // uncomment the following line if you do not want to return any records when validation fails + // $query->where('0=1'); + return $dataProvider; + } + + // grid filtering conditions + $query->andFilterWhere([ + 'id' => $this->id, + 'level' => $this->level, + 'status' => $this->status, + ]); + + $query->andFilterWhere(['like', 'description', $this->description]) + ->andFilterWhere(['like', 'link', $this->link]); + + return $dataProvider; + } +} diff --git a/backend/modules/test/views/test-task/_form.php b/backend/modules/test/views/test-task/_form.php new file mode 100644 index 0000000..3d884ca --- /dev/null +++ b/backend/modules/test/views/test-task/_form.php @@ -0,0 +1,38 @@ + + +
+ + + + field($model, 'description')->textarea(['rows' => 4]) ?> + + field($model, 'link')->textInput(['maxlength' => true]) ?> + + field($model, 'level')->dropDownList( + backend\modules\test\models\TestTask::getLevelList(), + ['prompt' => '...'] + ) ?> + + field($model, 'status')->dropDownList( + StatusHelper::statusList(), + [ + 'prompt' => 'Выберите' + ] + ) ?> + +
+ 'btn btn-success']) ?> +
+ + + +
diff --git a/backend/modules/test/views/test-task/_search.php b/backend/modules/test/views/test-task/_search.php new file mode 100644 index 0000000..a571dcc --- /dev/null +++ b/backend/modules/test/views/test-task/_search.php @@ -0,0 +1,35 @@ + + + diff --git a/backend/modules/test/views/test-task/create.php b/backend/modules/test/views/test-task/create.php new file mode 100644 index 0000000..94f1fa6 --- /dev/null +++ b/backend/modules/test/views/test-task/create.php @@ -0,0 +1,18 @@ +title = 'Добавить тестовое задание'; +$this->params['breadcrumbs'][] = ['label' => 'Test Tasks', 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; +?> +
+ + render('_form', [ + 'model' => $model, + ]) ?> + +
diff --git a/backend/modules/test/views/test-task/index.php b/backend/modules/test/views/test-task/index.php new file mode 100644 index 0000000..1434f32 --- /dev/null +++ b/backend/modules/test/views/test-task/index.php @@ -0,0 +1,57 @@ +title = 'Тестовые задания'; +$this->params['breadcrumbs'][] = $this->title; +?> +
+ +

+ 'btn btn-success']) ?> +

+ + $dataProvider, + 'filterModel' => $searchModel, + 'columns' => [ + ['class' => 'yii\grid\SerialColumn'], + +// 'id', + 'description', + [ + 'attribute' => 'link', + 'value' => function ($model) { + return Html::a(Html::encode($model->link), Url::to($model->link)); + }, + 'format' => 'raw', + ], + [ + 'attribute' => 'level', + 'format' => 'raw', + 'filter' => TestTask::getLevelList(), + 'value' => function($model){ + return TestTask::getLevelLabel($model->level); + } + ], + [ + 'attribute' => 'status', + 'format' => 'raw', + 'filter' => StatusHelper::statusList(), + 'value' => function($model){ + return StatusHelper::statusLabel($model->status); + } + ], + + ['class' => 'yii\grid\ActionColumn'], + ], + ]); ?> +
diff --git a/backend/modules/test/views/test-task/update.php b/backend/modules/test/views/test-task/update.php new file mode 100644 index 0000000..69e9952 --- /dev/null +++ b/backend/modules/test/views/test-task/update.php @@ -0,0 +1,19 @@ +title = 'Изменить тестовое задание'; +$this->params['breadcrumbs'][] = ['label' => 'Test Tasks', 'url' => ['index']]; +$this->params['breadcrumbs'][] = ['label' => $model->id, 'url' => ['view', 'id' => $model->id]]; +$this->params['breadcrumbs'][] = 'Update'; +?> +
+ + render('_form', [ + 'model' => $model, + ]) ?> + +
diff --git a/backend/modules/test/views/test-task/view.php b/backend/modules/test/views/test-task/view.php new file mode 100644 index 0000000..6b5f2dc --- /dev/null +++ b/backend/modules/test/views/test-task/view.php @@ -0,0 +1,70 @@ +title = cut_title($model->description); +$this->params['breadcrumbs'][] = ['label' => 'Test Tasks', 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; +\yii\web\YiiAsset::register($this); + +function cut_title($str) +{ + if(strlen($str) > 35){ + return mb_substr($str, 0, 35, 'UTF-8') . '...'; + } + return $str; +} +?> +
+ +

+ $model->id], ['class' => 'btn btn-primary']) ?> + $model->id], ['class' => 'btn btn-primary']) ?> + $model->id], [ + 'class' => 'btn btn-danger', + 'data' => [ + 'confirm' => 'Are you sure you want to delete this item?', + 'method' => 'post', + ], + ]) ?> +

+ + $model, + 'attributes' => [ + 'id', + 'description', + [ + 'attribute' => 'link', + 'value' => function ($model) { + return Html::a(Html::encode($model->link), Url::to($model->link)); + }, + 'format' => 'raw', + ], + [ + 'attribute' => 'level', + 'format' => 'raw', + 'filter' => TestTask::getLevelList(), + 'value' => function($model){ + return TestTask::getLevelLabel($model->level); + } + ], + [ + 'attribute' => 'status', + 'format' => 'raw', + 'filter' => StatusHelper::statusList(), + 'value' => function($model){ + return StatusHelper::statusLabel($model->status); + } + ], + ], + ]) ?> + +
diff --git a/backend/views/layouts/left.php b/backend/views/layouts/left.php index c099cb8..1467354 100755 --- a/backend/views/layouts/left.php +++ b/backend/views/layouts/left.php @@ -110,6 +110,8 @@ ], 'visible' => Yii::$app->user->can('confidential_information') ], + ['label' => 'Тестовые задания', 'icon' => 'file-text-o', 'url' => ['/test/test-task'], 'active' => \Yii::$app->controller->id == 'options', 'visible' => Yii::$app->user->can('confidential_information')], + /*['label' => 'Gii', 'icon' => 'file-code-o', 'url' => ['/gii']], ['label' => 'Debug', 'icon' => 'dashboard', 'url' => ['/debug']], diff --git a/common/models/TestTask.php b/common/models/TestTask.php new file mode 100644 index 0000000..d931c98 --- /dev/null +++ b/common/models/TestTask.php @@ -0,0 +1,75 @@ + 'Junior', + self::LEVEL_MIDDLE => 'Middle', + self::LEVEL_MIDDLE_PLUS => 'Middle+', + self::LEVEL_SENIOR => 'Senior', + ]; + } + + public static function getLevelLabel(int $level): string + { + return self::getLevelList()[$level]; + } + + /** + * {@inheritdoc} + */ + public static function tableName() + { + return 'test_task'; + } + + /** + * {@inheritdoc} + */ + public function rules() + { + return [ + [['level', 'status', 'description', 'link'], 'required'], + [['level', 'status'], 'integer'], + [['description'], 'string', 'max' => 500], + [['link'], 'string', 'max' => 255], + ]; + } + + /** + * {@inheritdoc} + */ + public function attributeLabels() + { + return [ + 'id' => 'ID', + 'description' => 'Описание', + 'link' => 'Ссылка', + 'level' => 'Уровень', + 'status' => 'Статус', + ]; + } +} diff --git a/console/migrations/m220309_134047_create_test_task_table.php b/console/migrations/m220309_134047_create_test_task_table.php new file mode 100644 index 0000000..24f98af --- /dev/null +++ b/console/migrations/m220309_134047_create_test_task_table.php @@ -0,0 +1,31 @@ +createTable('{{%test_task}}', [ + 'id' => $this->primaryKey(), + 'description' => $this->string(500), + 'link' => $this->string(255), + 'level' => $this->integer(1)->defaultValue(1), + 'status' => $this->integer(1), + ]); + } + + /** + * {@inheritdoc} + */ + public function safeDown() + { + $this->dropTable('{{%test_task}}'); + } +}