fix

parent 2855140f
...@@ -6,6 +6,7 @@ use Yii; ...@@ -6,6 +6,7 @@ use Yii;
use common\components\AdminController; use common\components\AdminController;
use yii\web\NotFoundHttpException; use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter; use yii\filters\VerbFilter;
use yii\web\UploadedFile;
use common\modules\testings\models\TestingTest; use common\modules\testings\models\TestingTest;
use common\modules\testings\models\SearchTestingTest; use common\modules\testings\models\SearchTestingTest;
...@@ -20,7 +21,7 @@ class TestingTestAdminController extends AdminController ...@@ -20,7 +21,7 @@ class TestingTestAdminController extends AdminController
'Update' => 'Редактирование теста', 'Update' => 'Редактирование теста',
'Delete' => 'Удаление теста', 'Delete' => 'Удаление теста',
'Manage' => 'Управление тестами', 'Manage' => 'Управление тестами',
'ImportTests' => 'Импорт вопросов и ответов к ним', 'Import-tests' => 'Импорт вопросов и ответов к ним',
); );
} }
...@@ -113,119 +114,131 @@ class TestingTestAdminController extends AdminController ...@@ -113,119 +114,131 @@ class TestingTestAdminController extends AdminController
public function actionImportTests($id) public function actionImportTests($id)
{ {
$model = $this->findModel($id); $model = new TestingTest;
$form = new \common\components\BaseForm('/common/modules/testings/forms/TestingImportCSVForm', $model);
$params = ['form' => $form, 'model' => $model];
if($model->load(Yii::$app->request->post()))
{
$csv_file = CUploadedFile::getInstance($model, 'csv_file');
$resource = CSVHelper::open($csv_file->tempName); $model->scenario = 'upload';
try { Yii::$app->controller->page_title = 'Импорт вопросов и ответов к ним';
$log = []; Yii::$app->controller->breadcrumbs = [
'Импорт вопросов и ответов к ним',
];
$params = ['model' => $model];
set_time_limit(60*3); // Максимальное время выполнения скрипта - 3 минуты if(Yii::$app->request->isPost && $model->load(Yii::$app->request->post()))
{
$model->csv_file = UploadedFile::getInstance($model, 'csv_file');
$questionsCount = 0; // Кол-во загруженных вопросов if ($model->upload())
$gammasCount = 0; // Кол-во гамм (не только созданных) {
$resource = CSVHelper::open($csv_file->tempName);
while ($data = CSVHelper::fgetcsv($resource)) try
{ {
// если в файле пошли пустые строки, то выходим из цикла $log = [];
if (count($data) < 2) break;
set_time_limit(60*3); // Максимальное время выполнения скрипта - 3 минуты
// извлечение переменных из CSV
$gamma_type = trim($data[0]); $questionsCount = 0; // Кол-во загруженных вопросов
// если первый столбец не указывает на цифры 1 или 2 (строительная и промышленная гаммы) - вся строка неправильная $gammasCount = 0; // Кол-во гамм (не только созданных)
if (($gamma_type <> '1') && ($gamma_type <> '2')) continue;
$gamma_name = trim(preg_replace('/\s+/', ' ',$data[1])); while ($data = CSVHelper::fgetcsv($resource))
$q_name = trim(preg_replace('/\s+/', ' ',$data[2])); {
$q_type = trim(preg_replace('/\s+/', ' ',$data[3])); // если в файле пошли пустые строки, то выходим из цикла
$a_name = trim(preg_replace('/\s+/', ' ',$data[4])); if (count($data) < 2) break;
$a_isright = trim($data[5]);
$author = trim($data[6]); // извлечение переменных из CSV
$gamma_type = trim($data[0]);
// поиск или создание гаммы // если первый столбец не указывает на цифры 1 или 2 (строительная и промышленная гаммы) - вся строка неправильная
if ($gamma_name <> '') { if (($gamma_type <> '1') && ($gamma_type <> '2')) continue;
$gamma_name = trim(preg_replace('/\s+/', ' ',$data[1]));
$gammasCount++; $q_name = trim(preg_replace('/\s+/', ' ',$data[2]));
$q_type = trim(preg_replace('/\s+/', ' ',$data[3]));
$cr1 = new CDbCriteria; $a_name = trim(preg_replace('/\s+/', ' ',$data[4]));
$a_isright = trim($data[5]);
$cr1->addCondition('type = :main_gamma'); $author = trim($data[6]);
$cr1->addCondition('name = :gamma');
// поиск или создание гаммы
$cr1->params = array( if ($gamma_name <> '') {
':main_gamma' => $gamma_type,
':gamma' => $gamma_name, $gammasCount++;
);
$cr1 = new CDbCriteria;
$gamma = TestingGamma::model()->find($cr1);
$cr1->addCondition('type = :main_gamma');
if ($gamma === null) { $cr1->addCondition('name = :gamma');
$gamma = new TestingGamma;
$gamma->name = $gamma_name; $cr1->params = array(
$gamma->type = $gamma_type; ':main_gamma' => $gamma_type,
//$log[] = 'Гамма '.$gamma_name.' создана.'; ':gamma' => $gamma_name,
} else { );
//$log[] = 'Гамма '.$gamma_name.' уже существует.';
$gamma = TestingGamma::model()->find($cr1);
if ($gamma === null) {
$gamma = new TestingGamma;
$gamma->name = $gamma_name;
$gamma->type = $gamma_type;
//$log[] = 'Гамма '.$gamma_name.' создана.';
} else {
//$log[] = 'Гамма '.$gamma_name.' уже существует.';
}
if ($gamma->save()) {
//$log[] = 'Гамма "'.$gamma_name.'" сохранена.';
} else {
$log[] = 'Ошибка при сохранении гаммы "'.$gamma_name.'"';
}
} }
if ($gamma->save()) { // создание вопроса
//$log[] = 'Гамма "'.$gamma_name.'" сохранена.'; if ($q_name <> '') {
} else {
$log[] = 'Ошибка при сохранении гаммы "'.$gamma_name.'"';
}
}
// создание вопроса $question = new TestingQuestion;
if ($q_name <> '') { $question->text = $q_name;
$question->type = $q_type;
$question->test_id = $model->id;
$question->gamma_id = $gamma->id;
$question->author = $author;
$question = new TestingQuestion; if ($question->save()) {
$question->text = $q_name; //$log[] = 'Вопрос "'.$q_name.'" сохранен.';
$question->type = $q_type; $questionsCount++;
$question->test_id = $model->id; } else {
$question->gamma_id = $gamma->id; $log[] = 'Ошибка при сохранении вопроса "'.$q_name.'"';
$question->author = $author; }
if ($question->save()) { }
//$log[] = 'Вопрос "'.$q_name.'" сохранен.';
$questionsCount++; // создание ответа
$answer = new TestingAnswer;
$answer->text = $a_name;
if (($a_isright == 'да') || ($a_isright == 'Да') || ($a_isright == 'ДА') || ($a_isright == 'y') || ($a_isright == 'yes') || ($a_isright == 'Y')) {
$answer->is_right = TestingAnswer::IS_RIGHT;
} else { } else {
$log[] = 'Ошибка при сохранении вопроса "'.$q_name.'"'; $answer->is_right = TestingAnswer::IS_NOT_RIGHT;
} }
$answer->question_id = $question->id;
if ($answer->save()) {
//$log[] = 'Ответ "'.$a_name.'" сохранен.';
} else {
$log[] = 'Ошибка при сохранении ответа "'.$a_name.'"';
}
} }
// создание ответа // добавляем отчёт о кол-ве добавленных вопросов и гамм
$answer = new TestingAnswer; Yii::app()->user->setFlash('flash', '<i>Всего добавлено <b>' .$questionsCount. '</b> вопросов в <b>'.$gammasCount. '</b> гаммах. Перейти к '.CHtml::link('списку загруженных вопросов',array('/testings/testingQuestionAdmin/manage','test'=>$model->id)).'.</i>');
$answer->text = $a_name;
if (($a_isright == 'да') || ($a_isright == 'Да') || ($a_isright == 'ДА') || ($a_isright == 'y') || ($a_isright == 'yes') || ($a_isright == 'Y')) {
$answer->is_right = TestingAnswer::IS_RIGHT;
} else {
$answer->is_right = TestingAnswer::IS_NOT_RIGHT;
}
$answer->question_id = $question->id;
if ($answer->save()) { $params['log'] = '<p>' . implode('</p><p>',$log) . '</p>';
//$log[] = 'Ответ "'.$a_name.'" сохранен.';
} else {
$log[] = 'Ошибка при сохранении ответа "'.$a_name.'"';
}
} }
else
// добавляем отчёт о кол-ве добавленных вопросов и гамм {
Yii::app()->user->setFlash('flash', '<i>Всего добавлено <b>' .$questionsCount. '</b> вопросов в <b>'.$gammasCount. '</b> гаммах. Перейти к '.CHtml::link('списку загруженных вопросов',array('/testings/testingQuestionAdmin/manage','test'=>$model->id)).'.</i>'); Yii::$app()->session->setFlash('flash', 'Произошла ошибка при загрузке файла. Обратитесь к администратору!');
}
$params = array( }
'model' => $model, catch (Exception $e)
'form' => $form, {
'log' => '<p>'.implode('</p><p>',$log).'</p>',
);
} catch (Exception $e){
$params['log'] = 'Импорт прошел неудачно: ' . $e->getMessage(); $params['log'] = 'Импорт прошел неудачно: ' . $e->getMessage();
} }
} }
......
...@@ -49,6 +49,7 @@ class TestingTest extends \common\components\ActiveRecordModel ...@@ -49,6 +49,7 @@ class TestingTest extends \common\components\ActiveRecordModel
[['minutes', 'questions', 'pass_percent', 'attempt'], 'requiredNotMix'], [['minutes', 'questions', 'pass_percent', 'attempt'], 'requiredNotMix'],
[['session_id', 'minutes', 'questions', 'pass_percent', 'attempt', 'mix'], 'integer'], [['session_id', 'minutes', 'questions', 'pass_percent', 'attempt', 'mix'], 'integer'],
[['name'], 'string', 'max' => 200], [['name'], 'string', 'max' => 200],
[['csv_file'], 'file', 'skipOnEmpty' => false, 'extensions' => 'xls, xlsx', 'on' => 'upload'],
[['mix'], 'safe'], [['mix'], 'safe'],
]; ];
} }
...@@ -126,4 +127,17 @@ class TestingTest extends \common\components\ActiveRecordModel ...@@ -126,4 +127,17 @@ class TestingTest extends \common\components\ActiveRecordModel
{ {
return ArrayHelper::map(self::find()->where(['session_id' => $session_id]), 'id', 'name'); return ArrayHelper::map(self::find()->where(['session_id' => $session_id]), 'id', 'name');
} }
public function upload()
{
if ($this->validate())
{
$this->csv_file->saveAs('uploads/' . date('dmYHiS_') . uniqid() . '.' . $this->imageFile->extension);
return true;
}
else
{
return false;
}
}
} }
...@@ -13,13 +13,13 @@ use common\modules\testings\models\TestingQuestion; ...@@ -13,13 +13,13 @@ use common\modules\testings\models\TestingQuestion;
<p> <p>
<?= Html::a(Yii::t('content', 'Update'), ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?> <?= Html::a(Yii::t('content', 'Update'), ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?>
<!-- <?= Html::a(Yii::t('content', 'Delete'), ['delete', 'id' => $model->id], [ <?= Html::a(Yii::t('content', 'Delete'), ['delete', 'id' => $model->id], [
'class' => 'btn btn-danger', 'class' => 'btn btn-danger',
'data' => [ 'data' => [
'confirm' => Yii::t('content', 'Are you sure you want to delete this item?'), 'confirm' => Yii::t('content', 'Are you sure you want to delete this item?'),
'method' => 'post', 'method' => 'post',
], ],
]) ?> --> ]) ?>
</p> </p>
<?= DetailView::widget([ <?= DetailView::widget([
......
<?php <?php
$this->tabs = array( use yii\widgets\ActiveForm;
'просмотреть сессию' => $this->createUrl('/testings/testingPassingAdmin/manage',array('session'=>$model->session->id)), use yii\helpers\Html;
);
$this->page_title = 'Импорт вопросов в тест из CSV-файла';
$this->crumbs = array(
'Список сессий' => array('/testings/testingSessionAdmin/manage'),
'Сессия "'.$model->session->name.'"' => array('/testings/testingSessionAdmin/view','id'=>$model->session->id),
'Список тестов' => array('/testings/testingTestAdmin/manage','session'=>$model->session->id),
$model->name => array('/testings/testingTestAdmin/view','id'=>$model->id),
'Импорт вопросов из CSV-Файла'
);
?> ?>
<?php if (Yii::app()->user->hasFlash('flash')): ?>
<?php echo $this->msg(Yii::app()->user->getFlash('flash'), 'ok'); ?> <?php if (\Yii::$app->session->hasFlash('flash')): ?>
<div class="alert alert-success fade in m-b-15">
<?php echo $this->msg(\Yii::$app->session->getFlash('flash'), 'ok'); ?>
<span class="close" data-dismiss="alert">×</span>
</div>
<?php endif ?> <?php endif ?>
<?php if (isset($log)) : ?> <?php if (isset($log)) : ?>
<?php $this->tabs['загрузить ещё вопросов из CSV-файла'] = $this->createUrl('/testings/testingTestAdmin/importTests',array('id'=>$model->id)); ?>
<div id="log_box"><?php echo $log; ?></div> <div id="log_box"><?php echo $log; ?></div>
<script type="text/javascript"> <script type="text/javascript">
...@@ -33,14 +25,30 @@ $this->crumbs = array( ...@@ -33,14 +25,30 @@ $this->crumbs = array(
</script> </script>
<?php endif; ?> <?php endif; ?>
<span style="font-size: 14px; color: #008C66;">Краткая инструкция по файла реестра вопросов и ответов в тест.</span><br /><br /> <span style="font-size: 14px; color: #008C66;">Краткая инструкция по файла реестра вопросов и ответов в тест.</span>
<div>
<br /><br />
Для загрузки реестра вопросов на сайт необходимо: Для загрузки реестра вопросов на сайт необходимо:
<ol> <ol>
<li>Заполнить <a href="/upload/users/Questions_example_table.xls">шаблон</a> в формате MS Excel.</li> <li>Заполнить <a href="/upload/users/Questions_example_table.xls">шаблон</a> в формате MS Excel.</li>
<li>Сохранить файл как CSV (разделители-запятые).</li> <li>Сохранить файл как XLS или XLSX.</li>
<li>Загрузить файл на сайт c помощью кнопки ниже.</li> <li>Загрузить файл на сайт c помощью кнопки ниже.</li>
</ol> </ol>
<span style="color: red;">Важно!</span>Не используйте клавишу ENTER для перевода строки при заполнении шаблона. Если это необходимо, пользуйтесь вместо этого тегом <strong><span style="color: red">&lt;br&gt;</span></strong>.
<div class="message info">Внимание! Для правильной работы модуля CSV-импорта необходимо корректно заполнять шаблон. Любое отхождение от шаблона (пустая строка, добавленный столбец) может нарушить работу данной системы.</div> <span style="color: red;">Важно!</span> Не используйте клавишу ENTER для перевода строки при заполнении шаблона. Если это необходимо, пользуйтесь вместо этого тегом <strong><span style="color: red">&lt;br&gt;</span></strong>.
<?php echo $form; ?>
<br /><br />
<div class="alert alert-info">Внимание! Для правильной работы модуля XLS-импорта необходимо корректно заполнять шаблон. Любое отхождение от шаблона (пустая строка, добавленный столбец) может нарушить работу данной системы.</div>
<hr>
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
<?= $form->field($model, 'csv_file')->fileInput() ?>
<?= Html::submitButton('Загрузить', ['class' => 'btn btn-success']); ?>
<?php ActiveForm::end() ?>
...@@ -14,13 +14,7 @@ use yii\widgets\DetailView; ...@@ -14,13 +14,7 @@ use yii\widgets\DetailView;
<p> <p>
<?= Html::a(Yii::t('content', 'Update'), ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?> <?= Html::a(Yii::t('content', 'Update'), ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?>
<?= Html::a(Yii::t('content', 'Delete'), ['delete', 'id' => $model->id], [ <?= Html::a('Импорт вопросов из CSV-файла', ['import-tests', 'id' => $model->id], ['class' => 'btn btn-info']) ?>
'class' => 'btn btn-danger',
'data' => [
'confirm' => Yii::t('content', 'Are you sure you want to delete this item?'),
'method' => 'post',
],
]) ?>
</p> </p>
<?= DetailView::widget([ <?= DetailView::widget([
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment