Commit ac79fe2c authored by Shakarim Sapa's avatar Shakarim Sapa

Merge remote-tracking branch 'origin/master'

parents 74e43f9b 6382034e
...@@ -10,7 +10,9 @@ use yii\grid; ...@@ -10,7 +10,9 @@ use yii\grid;
class ColorActionColumn extends \yii\grid\ActionColumn class ColorActionColumn extends \yii\grid\ActionColumn
{ {
public $contentOptions = [ public $contentOptions = [
'class' => 'color-column' 'class' => 'color-column',
'style' => 'white-space: nowrap;',
'align' => 'center'
]; ];
protected function initDefaultButtons() protected function initDefaultButtons()
......
<?php
namespace common\modules\testings\components;
use yii\helpers\Json;
class MarkBoxAction extends \yii\base\Action
{
public function run($session)
{
if(isset($_POST['reset']) && $_POST['reset'])
{
\Yii::$app->controller->setMarked($session, []);
echo Json::encode(array(
'qty' => 0,
'title' => "Разослать выделенным",
));
return;
}
if(!isset($_POST['data']) || !is_array($_POST['data']))
{
return;
}
$toggle = $_POST['data'];
$data = \Yii::$app->controller->getMarked($session);
$remove = []; $append = [];
foreach($toggle as $key => $value)
{
if($value)
{
$append[] = $key;
}
else
{
$remove[] = $key;
}
}
if(!empty($append))
{
$data = array_merge($data, $append);
}
$data = array_unique($data);
if(!empty($remove))
{
$data = array_diff($data, $remove);
}
\Yii::$app->controller->setMarked($session, $data);
$qty = count($data);
echo Json::encode([
'qty' => $qty,
'title' => "Разослать выделенным ($qty)",
]);
}
}
\ No newline at end of file
<?php
namespace common\modules\testings\components;
use Yii;
use yii\base\Behavior;
class MarkBoxBehavior extends Behavior
{
public $session_key = 'notify_session';
private $_marked;
public function getMarked($session)
{
$session = intval($session);
if(!isset($this->_marked[$session]))
{
$session_key = $this->session_key . '_' . $session;
if(isset(Yii::$app->session[$session_key]))
{
$data = unserialize(Yii::$app->session[$session_key]);
if($data === FALSE)
{
$data = [];
}
}
else
{
$data = [];
}
$this->_marked[$session] = $data;
}
return $this->_marked[$session];
}
public function setMarked($session, $data)
{
$session = intval($session);
$session_key = $this->session_key . '_' . $session;
$this->_marked[$session] = $data;
Yii::$app->session[$session_key] = serialize($data);
}
public function checkMark($data, $row)
{
return in_array($data->id, $this->getMarked());
}
}
\ No newline at end of file
<?php <?php
Yii::import('zii.widgets.grid.CGridColumn'); namespace common\modules\testings\components;
class MarkBoxColumn extends CGridColumn use Closure;
use yii\base\InvalidConfigException;
use yii\helpers\Html;
class MarkBoxColumn extends \yii\grid\CheckboxColumn
{ {
public $checked; public $checked;
/**
* @var array the HTML options for the data cell tags. public $contentOptions = ['class'=>'checkbox-column'];
*/
public $htmlOptions=array('class'=>'checkbox-column'); public $headerOptions = ['class'=>'checkbox-column'];
/**
* @var array the HTML options for the header cell tag. public $footerOptions = ['class'=>'checkbox-column'];
*/
public $headerHtmlOptions=array('class'=>'checkbox-column');
/**
* @var array the HTML options for the footer cell tag.
*/
public $footerHtmlOptions=array('class'=>'checkbox-column');
/**
* @var array the HTML options for the checkboxes.
*/
public $checkBoxHtmlOptions=array();
/**
* @var string the template to be used to control the layout of the header cell.
* The token "{item}" is recognized and it will be replaced with a "check all" checkbox.
* By default if in multiple checking mode, the header cell will display an additional checkbox,
* clicking on which will check or uncheck all of the checkboxes in the data cells.
* See {@link selectableRows} for more details.
* @since 1.1.11
*/
public $headerTemplate='{item}';
public $updateUrl; public $updateUrl;
/**
* Initializes the column. public $name = 'selection';
* This method registers necessary client script for the checkbox column.
*/ public $checkboxOptions = [];
public function init()
{ public $multiple = true;
if(isset($this->checkBoxHtmlOptions['name']))
$name=$this->checkBoxHtmlOptions['name']; public function init()
else {
{ parent::init();
$name=$this->id; if (empty($this->name))
if(substr($name,-2)!=='[]') {
$name.='[]'; throw new InvalidConfigException('The "name" property must be set.');
$this->checkBoxHtmlOptions['name']=$name; }
}
$name=strtr($name,array('['=>"\\[",']'=>"\\]")); if (substr_compare($this->name, '[]', -2, 2))
{
$this->name .= '[]';
$js=<<<CBALL // $this->checkBoxOptions['name'] = $name;
$(document).delegate('#{$this->id}_all','click',function() { }
//групповой выбор/сброс
var th = this, checked=this.checked, data = {}; // $name = strtr($name, ['['=>"\\[",']'=>"\\]"]);
th.disabled = true;
$("input[name='$name']:not(:disabled)").each(function() { $js = <<<EOD
$(document).delegate('.select-on-check-all','click',function() {
//групповой выбор/сброс
var th = this, checked=this.checked, data = {};
th.disabled = true;
$("input[name='{$this->name}']:not(:disabled)").each(function() {
data[this.value] =checked ? 1:0;
this.checked=checked;
this.disabled = true;
});
$.ajax({
type: 'POST',
url: '{$this->updateUrl}',
data: {data: data},
dataType: 'json',
success: function(data){
var el = $("#sendMarkup").html(data.title);
if(data.qty) {
el.show();
$("#resetMarkup").show();
} else {
el.hide();
$("#resetMarkup").hide();
}
},
complete: function(){
th.disabled = false;
$("input[name='{$this->name}']").each(function() {
this.disabled = false;
});
}
});
});
$(document).delegate("input[name='$this->name']", 'click',function() {
var checked=this.checked, data = {}, th = this;
$('.select-on-check-all').prop('checked', $("input[name='{$this->name}']").length==$("input[name='{$this->name}']:checked").length);
th.disabled = true;
data[this.value] =checked ? 1:0; data[this.value] =checked ? 1:0;
this.checked=checked;
this.disabled = true; $.ajax({
type: 'POST',
url: '{$this->updateUrl}',
data: {data: data},
dataType: 'json',
success: function(data){
var el = $("#sendMarkup").html(data.title);
if(data.qty) {
el.show();
$("#resetMarkup").show();
} else {
el.hide();
$("#resetMarkup").hide();
}
},
complete: function(){
th.disabled = false;
}
});
});
$(document).delegate("#resetMarkup", 'click', function(){
$(".select-on-check-all, input[name='{$this->name}']").prop('checked', false);
$("#sendMarkup").hide();
$("#resetMarkup").hide();
$.ajax({
type: 'POST',
data: {reset:true},
url: $(this).attr('href')
});
return false;
}); });
$.ajax({ EOD;
type: 'POST',
url: '{$this->updateUrl}', \Yii::$app->controller->view->registerJS($js, \yii\web\View::POS_END, __CLASS__);
data: {data: data}, }
dataType: 'json',
success: function(data){
var el = $("#sendMarkup").html(data.title); // if(trim($this->headerTemplate)==='')
// {
if(data.qty) { // //echo $this->grid->blankDisplay;
el.show(); // return;
$("#resetMarkup").show(); // }
} else {
el.hide(); // $item = CHtml::checkBox($this->id.'_all',false);
$("#resetMarkup").hide();
} // echo strtr($this->headerTemplate,array(
}, // '{item}'=>$item,
complete: function(){ // ));
th.disabled = false;
$("input[name='$name']").each(function() { protected function renderHeaderCellContent()
this.disabled = false; {
}); $name = $this->name;
if (substr_compare($name, '[]', -2, 2) === 0)
{
$name = substr($name, 0, -2);
}
if (substr_compare($name, ']', -1, 1) === 0)
{
$name = substr($name, 0, -1) . '_all]';
}
else
{
$name .= '_all';
} }
});
});
$id = $this->grid->options['id'];
$(document).delegate("input[name='$name']", 'click',function() { $options = json_encode([
var checked=this.checked, data = {}, th = this; 'name' => $this->name,
'multiple' => $this->multiple,
$('#{$this->id}_all').prop('checked', $("input[name='$name']").length==$("input[name='$name']:checked").length); 'checkAll' => $name,
th.disabled = true; ], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
data[this.value] =checked ? 1:0;
$this->grid->getView()->registerJs("jQuery('#$id').yiiGridView('setSelectionColumn', $options);");
$.ajax({
type: 'POST', if ($this->header !== null || !$this->multiple)
url: '{$this->updateUrl}', {
data: {data: data}, return parent::renderHeaderCellContent();
dataType: 'json', }
success: function(data){ else
var el = $("#sendMarkup").html(data.title); {
if(data.qty) { return Html::checkBox($name, false, ['class' => 'select-on-check-all']);
el.show(); }
$("#resetMarkup").show(); }
} else {
el.hide(); protected function renderDataCellContent($model, $key, $index)
$("#resetMarkup").hide(); {
} if ($this->checkboxOptions instanceof Closure)
}, {
complete: function(){ $options = call_user_func($this->checkboxOptions, $model, $key, $index, $this);
th.disabled = false; }
else
{
$options = $this->checkboxOptions;
if (!isset($options['value']))
{
$options['value'] = is_array($key) ? json_encode($key, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) : $key;
}
}
if(\Yii::$app->request->get('session'))
{
$marked = \Yii::$app->controller->getMarked(\Yii::$app->request->get('session'));
$checked = in_array($model->id, $marked);
return Html::checkbox($this->name, $checked, $options);
}
else
{
return Html::checkbox($this->name, !empty($options['checked']), $options);
}
} }
});
});
$(document).delegate("#resetMarkup", 'click', function(){
$("#{$this->id}_all, input[name='$name']").prop('checked', false);
$("#sendMarkup").hide();
$("#resetMarkup").hide();
$.ajax({
type: 'POST',
url: $(this).attr('href')
});
return false;
});
CBALL;
Yii::app()->getClientScript()->registerScript(__CLASS__.'#'.$this->id,$js);
}
/**
* Renders the header cell content.
* This method will render a checkbox in the header when {@link selectableRows} is greater than 1
* or in case {@link selectableRows} is null when {@link CGridView::selectableRows} is greater than 1.
*/
protected function renderHeaderCellContent()
{
if(trim($this->headerTemplate)==='')
{
//echo $this->grid->blankDisplay;
return;
}
$item = CHtml::checkBox($this->id.'_all',false);
echo strtr($this->headerTemplate,array(
'{item}'=>$item,
));
}
/**
* Renders the data cell content.
* This method renders a checkbox in the data cell.
* @param integer $row the row number (zero-based)
* @param mixed $data the data associated with the row
*/
protected function renderDataCellContent($row,$data)
{
$value=$this->grid->dataProvider->keys[$row];
/*
$checked = false;
if($this->checked!==null)
$checked=$this->evaluateExpression($this->checked,array('data'=>$data,'row'=>$row));
*/
$marked = $this->grid->controller->getMarked(Yii::app()->request->getQuery('session'));
$checked = in_array($data->id, $marked);
$options=$this->checkBoxHtmlOptions;
$name=$options['name'];
unset($options['name']);
$options['value']=$value;
$options['id']=$this->id.'_'.$row;
echo CHtml::checkBox($name,$checked,$options);
}
} }
\ No newline at end of file
<?php <?php
namespace common\modules\testings\controllers;
use Yii;
use common\components\AdminController;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use common\modules\testings\models\SearchTestingSendHistory;
class TestingSendHistoryAdminController extends AdminController class TestingSendHistoryAdminController extends AdminController
{ {
public static function actionsTitles() public static function actionsTitles()
{ {
return array( return array(
'Manage' => 'Управление пользователями', 'Manage' => 'Управление пользователями',
'ResendDublicates' => '', 'Resend-dublicates' => '',
); );
} }
public function actionManage() public function actionManage($session)
{ {
if(!Yii::app()->request->getQuery('session')) $searchModel = new SearchTestingSendHistory();
{ $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
$this->pageNotFound();
}
$model=new TestingSendHistory('search'); Yii::$app->controller->page_title = 'История отправки дубликатов';
$model->unsetAttributes(); Yii::$app->controller->breadcrumbs = [
if(isset($_GET['TestingSendHistory'])) 'История отправки дубликатов',
{ ];
$model->attributes = $_GET['TestingSendHistory'];
}
$this->render('manage', array( return $this->render('manage', [
'model' => $model, 'searchModel' => $searchModel,
'session_id' => Yii::app()->request->getQuery('session') 'dataProvider' => $dataProvider,
)); 'session_id' => $session
]);
} }
public function actionResendDublicates() public function actionResendDublicates()
...@@ -83,23 +89,19 @@ class TestingSendHistoryAdminController extends AdminController ...@@ -83,23 +89,19 @@ class TestingSendHistoryAdminController extends AdminController
} }
public function loadModel($id) /**
{ * Finds the Faq model based on its primary key value.
$model = TestingSendHistory::model()->findByPk((int) $id); * If the model is not found, a 404 HTTP exception will be thrown.
if($model === null) * @param integer $id
{ * @return Faq the loaded model
$this->pageNotFound(); * @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = TestingUser::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
} }
}
return $model;
}
protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax'] === 'testing-sendhistory-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}
} }
...@@ -6,11 +6,17 @@ use Yii; ...@@ -6,11 +6,17 @@ 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 yii\helpers\ArrayHelper;
use yii\helpers\Html;
use common\modules\testings\models\TestingSession; use common\modules\testings\models\TestingSession;
use common\modules\testings\models\SearchTestingSession; use common\modules\testings\models\SearchTestingSession;
use common\modules\testings\models\TestingPassing; use common\modules\testings\models\TestingPassing;
use common\modules\testings\models\TestingTest; use common\modules\testings\models\TestingTest;
use common\modules\testings\models\TestingUser;
use common\modules\testings\models\TestingUserGroup;
use common\modules\testings\models\TestingUserGroupAssign;
class TestingSessionAdminController extends AdminController class TestingSessionAdminController extends AdminController
{ {
...@@ -24,7 +30,7 @@ class TestingSessionAdminController extends AdminController ...@@ -24,7 +30,7 @@ class TestingSessionAdminController extends AdminController
'Extend1' => 'Продление сессии для компании', 'Extend1' => 'Продление сессии для компании',
'Delete' => 'Удаление сессии', 'Delete' => 'Удаление сессии',
'Manage' => 'Управление сессиями', 'Manage' => 'Управление сессиями',
'ImportPassings' => 'Импорт пользователей для прохождения тестирования', 'Import-passings' => 'Импорт пользователей для прохождения тестирования',
'ExportSessionResult' => 'Экспорт результата сессии', 'ExportSessionResult' => 'Экспорт результата сессии',
'SendMessage' => 'Отправить пользователю сообщение о назначенных тестах', 'SendMessage' => 'Отправить пользователю сообщение о назначенных тестах',
'SendMessageToAll' => 'Отправить сообщения о назначенных тестах всем пользователям', 'SendMessageToAll' => 'Отправить сообщения о назначенных тестах всем пользователям',
...@@ -194,6 +200,215 @@ class TestingSessionAdminController extends AdminController ...@@ -194,6 +200,215 @@ class TestingSessionAdminController extends AdminController
)); ));
} }
public function actionImportPassings($id)
{
$model = $this->findModel($id);
$group = new TestingUserGroup;
$params = ['model' => $model, 'group' => $group];
if (Yii::$app->request->isPost)
{
$model->attributes = Yii::$app->request->post('TestingSession');
$group->attributes = Yii::$app->request->post('TestingUserGroup');
$group->session_id = $model->id;
if($model->validate() && $group->validate())
{
$group->save(false);
$model->csv_file = UploadedFile::getInstance($model, 'csv_file');
if($model->upload())
{
try
{
$log = [];
set_time_limit(60*5); // Максимальное время выполнения скрипта - 5 минуты
$usersCount = 0; // кол-во загруженных пользователей
$passingsCount = 0; // кол-во назначенных тестов
$assigned = []; //Для проверки на дубликаты
$test_ids = array_keys(ArrayHelper::map(TestingTest::find()->where(['session_id' => $model->id])->all(), 'id', 'name'));
if(!empty($test_ids))
{
$passings = TestingPassing::find()->where(['test_id' => $test_ids])->all();
foreach($passings as $passing)
{
$assigned[$passing->user_id][] = $passing->test_id;
}
}
$inputFileType = \PHPExcel_IOFactory::identify($model->file);
$objReader = \PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($model->file);
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
$mixCreate = true;
for ($i = 3; $i <= $sheet->getHighestRow(); $i++)
{
// извлечение переменных из XLS
$sex = trim($sheet->getCell('A' . $i)->getValue());
$last_name = trim($sheet->getCell('B' . $i)->getValue());
$first_name = trim($sheet->getCell('C' . $i)->getValue());
$patronymic = trim($sheet->getCell('D' . $i)->getValue());
$company_name = trim(preg_replace('/\s+/', ' ', $sheet->getCell('E' . $i)->getValue()));
$city = trim($sheet->getCell('F' . $i)->getValue());
$email = trim($sheet->getCell('G' . $i)->getValue());
$login = trim($sheet->getCell('H' . $i)->getValue());
$password = trim($sheet->getCell('I' . $i)->getValue());
// Извлеченние данных о назначенных тестах
$usertests = [];
for ($j = 10; $j <= $sheet->getHighestColumn(); $j++)
{
$testName = trim($sheet->getCellByColumnAndRow($j, 2)->getValue());
$test = trim($sheet->getCellByColumnAndRow($j, $i)->getValue());
if(in_array($testName, TestingTest::$mix_test_titles) && $mixCreate)
{
$mixModel = TestingTest::model()->findByAttributes(array('name'=>'Комбинированный тест', 'session_id'=>$model->id));
if(!$mixModel)
{
$mixModel = new TestingTest;
$mixModel->session_id = $model->id;
$mixModel->name = 'Комбинированный тест';
$mixModel->mix = true;
$mixModel->save();
}
$mixCreate = false;
}
$usertests[] = $test;
}
// если первый столбец не указывает на пол - вся строка неправильная
if (($sex <> 'м') && ($sex <> 'ж') && ($sex <> 'М') && ($sex <> 'Ж')) continue;
$usersCount++;
// поиск или создание пользователя
$user = TestingUser::find()->where([
'first_name' => $first_name,
'last_name' => $last_name,
'patronymic' => $patronymic,
'company_name' => $company_name,
])->one();
if (!$user)
{
$user = new TestingUser;
$user->attributes = [
'last_name' => $last_name,
'first_name' => $first_name,
'patronymic' => $patronymic,
'company_name' => $company_name,
'sex' => (($sex == 'Ж') || ($sex == 'ж')) ? 0 : 1,
];
}
$user->email = $email;
$user->manager_id = Yii::$app->user->id;
$user->city = $city;
$user->login = $login;
$user->password = $password;
if($user->save())
{
$user_group_assign = new TestingUserGroupAssign;
$user_group_assign->attributes = [
'user_id' => $user->id,
'group_id' => $group->id,
'session_id' => $model->id
];
}
else
{
$log[] = 'Ошибка при сохранении пользователя '.$last_name.' '.$first_name.' '.$patronymic.' ["'.$company_name.'"]!';
break;
}
// назначение тестов
$testings = TestingTest::find()->where(['session_id' => $model->id]);
// проверка на то, создано ли достаточное кол-во тестов в пределах текущей сессии
if (count($usertests) > count($testings))
{
throw new NotFoundHttpException('Загружено недостаточное количество тестов в пределах текущей сессии!');
}
foreach ($usertests as $index => $test)
{
if(in_array($test, array('да','Да','ДА','y','yes','1','Y')))
{
if(!isset($testings[$index]))
{
continue;
}
if(isset($assigned[$user->id]) && in_array($testings[$index]->id, $assigned[$user->id]))
{
$log[] = "Пользователю {$user->id} уже назначен тест № {$testings[$index]->id}";
continue;
}
$pass = new TestingPassing;
$pass->user_id = $user->id;
$pass->percent_rights = 0;
$pass->test_id = $testings[$index]->id;
if ($pass->save())
{
$passingsCount++;
$assigned[$user->id][$index] = $testings[$index]->id;
}
else
{
$log[] = 'Ошибка при назначении теста "'.$testings[$index]->name.'"';
}
}
}
}
// добавляем отчёт о кол-ве назначенных тестов
Yii::$app->session->setFlash('flash', '<i>Всего назначено <b>' .$passingsCount. '</b> тестов <b>'.$usersCount. '</b> пользователям. Перейти к '.Html::a('списку назначенных тестов', ['/testings/testing-user-admin/manage', 'session'=>$model->id]).'.</i>');
$params = array(
'model' => $model,
'group' => $group,
'log' => implode('<br />',$log),
);
}
catch (Exception $e)
{
$params['log'] = 'Импорт прошел неудачно: ' . $e->getMessage();
}
}
else
{
Yii::$app->session->setFlash('flash', 'Произошла ошибка при загрузке файла. Обратитесь к администратору!');
}
}
}
return $this->render('import-passings', $params);
}
public function actionExportSessionResult($id) public function actionExportSessionResult($id)
{ {
$letters = array(); $letters = array();
...@@ -527,236 +742,6 @@ class TestingSessionAdminController extends AdminController ...@@ -527,236 +742,6 @@ class TestingSessionAdminController extends AdminController
Yii::app()->end(); Yii::app()->end();
} }
public function actionImportPassings($id)
{
$model = $this->loadModel($id);
$group = new TestingUserGroup;
$params = array('model' => $model, 'group' => $group);
if (Yii::app()->request->isPostRequest)
{
$model->attributes = $_POST['TestingSession'];
$group->attributes = $_POST['TestingUserGroup'];
$group->session_id = $model->id;
if($model->validate() && $group->validate())
{
$group->save(false);
$csv_file = CUploadedFile::getInstance($model, 'csv_file');
$resource = CSVHelper::open($csv_file->tempName);
try {
$log = array();
set_time_limit(60*5); // Максимальное время выполнения скрипта - 5 минуты
$usersCount = 0; // кол-во загруженных пользователей
$passingsCount = 0; // кол-во назначенных тестов
$assigned = array();//Для проверки на дубликаты
$test_ids = Yii::app()->db->createCommand('SELECT id FROM testings_tests WHERE session_id = :session_id')
->queryColumn(array('session_id' => $model->id));
if(!empty($test_ids)) {
$sql = 'SELECT user_id, test_id FROM testings_passings WHERE test_id IN ('.implode(', ', $test_ids).')';
$rows = Yii::app()->db->createCommand($sql)->queryAll();
foreach($rows as $row) {
$assigned[$row['user_id']][] = $row['test_id'];
}
}
while ($data = CSVHelper::fgetcsv($resource))
{
// если в файле пошли пустые строки, то выходим из цикла
if (count($data) < 2) break;
// извлечение переменных из CSV
$sex = trim($data[0]);
$last_name = trim($data[1]);
$first_name = trim($data[2]);
$patronymic = trim($data[3]);
$company_name = trim(preg_replace('/\s+/', ' ',$data[4]));
$city = trim($data[5]);
$email = trim($data[6]);
$login = trim($data[7]);
$password = trim($data[8]);
$tki = trim($data[9]);
$region = trim($data[10]);
// удаляем уже извлечённые данные; остальные, стало быть, сведения о назначенных тестах
array_shift($data);
array_shift($data);
array_shift($data);
array_shift($data);
array_shift($data);
array_shift($data);
array_shift($data);
array_shift($data);
array_shift($data);
array_shift($data);
array_shift($data);
$usertests = array();
foreach ($data as $test)
{
$test = trim($test);
if(in_array($test, array('Комбинированный тест','комбинированный тест','Комбинированный','комбинированный')))
{
$mixModel = TestingTest::model()->findByAttributes(array('name'=>'Комбинированный тест','session_id'=>$model->id));
if(!$mixModel)
{
$mixModel = new TestingTest();
$mixModel->session_id = $model->id;
$mixModel->name = 'Комбинированный тест';
$mixModel->mix = true;
$mixModel->save();
}
}
$usertests[] = $test;
}
if(isset($usertests[0]) && $usertests[0] == 'Вид тестирования') continue;
// если первый столбец не указывает на пол - вся строка неправильная
if (($sex <> 'м') && ($sex <> 'ж') && ($sex <> 'М') && ($sex <> 'Ж')) continue;
$usersCount++;
// поиск или создание пользователя
$cr1 = new CDbCriteria;
$cr1->addCondition('first_name = :first_name');
$cr1->addCondition('last_name = :last_name');
$cr1->addCondition('patronymic = :patronymic');
$cr1->addCondition('company_name = :company_name');
$cr1->params = array(
':first_name' => $first_name,
':last_name' => $last_name,
':patronymic' => $patronymic,
':company_name' => $company_name,
);
$user = TestingUser::model()->find($cr1);
if ($user === null)
{
$user = new TestingUser;
$user->last_name = $last_name;
$user->first_name = $first_name;
$user->patronymic = $patronymic;
$user->company_name = $company_name;
if(($sex == 'Ж') || ($sex == 'ж'))
{
$user->sex = 0;
}
else
{
$user->sex = 1;
}
//$log[] = 'Пользователь '.$last_name.' '.$first_name.' '.$patronymic.'["'.$company_name.'"] создан.';
}
else
{
//$log[] = 'Пользователь '.$last_name.' '.$first_name.' '.$patronymic.'["'.$company_name.'"] уже существует.';
}
$user->email = $email;
$user->manager_id = Yii::app()->user->id;
$user->tki = $tki;
$user->city = $city;
$user->region = $region;
$user->login = $login;
$user->password = $password;
if ($user->save())
{
$command = Yii::app()->db->createCommand();
$command->insert('testings_users_groups_assign', array(
'user_id' => $user->id,
'group_id' => $group->id,
'session_id' => $model->id
));
//$log[] = 'Пользователь '.$last_name.' '.$first_name.' '.$patronymic.' ["'.$company_name.'"] сохранён.';
}
else
{
$log[] = 'Ошибка при сохранении пользователя '.$last_name.' '.$first_name.' '.$patronymic.' ["'.$company_name.'"]!';
break;
}
// назначение тестов
$testings = TestingTest::model()->findAll('session_id = :session', array(':session'=>$model->id));
// проверка на то, создано ли достаточное кол-во тестов в пределах текущей сессии
if (count($usertests) > count($testings))
{
throw new Exception('Загружено недостаточное количество тестов в пределах текущей сессии!');
}
foreach ($usertests as $index => $test)
{
if(in_array($test, array('да','Да','ДА','y','yes','1','Y')))
{
if(!isset($testings[$index]))
{
continue;
}
if(isset($assigned[$user->id]) && in_array($testings[$index]->id, $assigned[$user->id]))
{
$log[] = "Пользователю {$user->id} уже назначен тест № {$testings[$index]->id}";
continue;
}
$pass = new TestingPassing;
$pass->user_id = $user->id;
$pass->percent_rights = 0;
$pass->test_id = $testings[$index]->id;
if ($pass->save())
{
//$log[] = 'Пользователю назначен тест "'.$testings[$index]->name.'"';
$passingsCount++;
$assigned[$user->id][$index] = $testings[$index]->id;
}
else
{
$log[] = 'Ошибка при назначении теста "'.$testings[$index]->name.'"';
}
}
else
{
//$log[] = 'Тест "'.$testings[$index]->name .'" пользователю не назначается.';
}
}
}
// добавляем отчёт о кол-ве назначенных тестов
Yii::app()->user->setFlash('flash', '<i>Всего назначено <b>' .$passingsCount. '</b> тестов <b>'.$usersCount. '</b> пользователям. Перейти к '.CHtml::link('списку назначенных тестов',array('/testings/testingUserAdmin/manage','session'=>$model->id)).'.</i>');
$params = array(
'model' => $model,
'group' => $group,
'log' => implode('<br />',$log),
);
} catch (Exception $e){
$params['log'] = 'Импорт прошел неудачно: ' . $e->getMessage();
}
}
}
$this->render('importPassings', $params);
}
public function actionSendMessageToAll($id) public function actionSendMessageToAll($id)
{ {
set_time_limit(0); set_time_limit(0);
......
...@@ -17,9 +17,6 @@ use common\modules\testings\models\TestingAnswer; ...@@ -17,9 +17,6 @@ use common\modules\testings\models\TestingAnswer;
class TestingTestAdminController extends AdminController class TestingTestAdminController extends AdminController
{ {
public $errorSummaryCssClass = 'error-summary';
public $encodeErrorSummary;
public static function actionsTitles() public static function actionsTitles()
{ {
return array( return array(
...@@ -151,11 +148,9 @@ class TestingTestAdminController extends AdminController ...@@ -151,11 +148,9 @@ class TestingTestAdminController extends AdminController
$objReader = \PHPExcel_IOFactory::createReader($inputFileType); $objReader = \PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($model->file); $objPHPExcel = $objReader->load($model->file);
$sheet = $objPHPExcel->getSheet(0); $sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
for ($i = 3; $i <= $highestRow; $i++) for ($i = 3; $i <= $sheet->getHighestRow(); $i++)
{ {
// извлечение переменных из XLS // извлечение переменных из XLS
$theme_name = trim(preg_replace('/\s+/', ' ', $sheet->getCell('A' . $i)->getValue())); $theme_name = trim(preg_replace('/\s+/', ' ', $sheet->getCell('A' . $i)->getValue()));
......
...@@ -6,16 +6,15 @@ use Yii; ...@@ -6,16 +6,15 @@ 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\helpers\Json;
use common\modules\testings\components\MarkBoxBehavior;
use common\modules\testings\models\TestingUser; use common\modules\testings\models\TestingUser;
use common\modules\testings\models\SearchTestingUser; use common\modules\testings\models\SearchTestingUser;
use common\modules\testings\models\SearchTestingUserGroup; use common\modules\testings\models\SearchTestingUserGroup;
class TestingUserAdminController extends AdminController class TestingUserAdminController extends AdminController
{ {
private $_marked;
public static function actionsTitles() public static function actionsTitles()
{ {
return array( return array(
...@@ -25,8 +24,8 @@ class TestingUserAdminController extends AdminController ...@@ -25,8 +24,8 @@ class TestingUserAdminController extends AdminController
'Delete' => 'Удаление пользователя', 'Delete' => 'Удаление пользователя',
'Manage' => 'Управление пользователями', 'Manage' => 'Управление пользователями',
'Manage-group' => 'Управление группами', 'Manage-group' => 'Управление группами',
'UpdateMark' => 'Пометка пользователй', 'Update-mark' => 'Пометка пользователй',
'ResetMark' => 'Сброс пометок', 'Reset-mark' => 'Сброс пометок',
); );
} }
...@@ -39,6 +38,19 @@ class TestingUserAdminController extends AdminController ...@@ -39,6 +38,19 @@ class TestingUserAdminController extends AdminController
'delete' => ['post'], 'delete' => ['post'],
], ],
], ],
'marked' => [
'class' => MarkBoxBehavior::className(),
'session_key' => 'user-admin',
]
];
}
public function actions()
{
return [
'update-mark' => [
'class' => \common\modules\testings\components\MarkBoxAction::className(),
]
]; ];
} }
...@@ -151,102 +163,6 @@ class TestingUserAdminController extends AdminController ...@@ -151,102 +163,6 @@ class TestingUserAdminController extends AdminController
]); ]);
} }
public function getMarked($session)
{
$session = intval($session);
if(!isset($this->_marked[$session]))
{
$session_key = 'notify_session_'.$session;
if(isset(Yii::$app->session[$session_key]))
{
$data = unserialize(Yii::$app->session[$session_key]);
if($data === FALSE)
{
$data = [];
}
}
else
{
$data = [];
}
$this->_marked[$session] = $data;
}
return $this->_marked[$session];
}
public function setMarked($session, $data)
{
$session = intval($session);
$session_key = 'notify_session_'.$session;
$this->_marked[$session] = $data;
Yii::$app->session[$session_key] = serialize($data);
}
public function checkMark($data, $row)
{
return in_array($data->id, $this->getMarked());
}
public function actionUpdateMark($session)
{
if(!isset($_POST['data']) || !is_array($_POST['data']))
{
return;
}
$toggle = $_POST['data'];
$data = $this->getMarked($session);
$remove = []; $append = [];
foreach($toggle as $key => $value)
{
if($value)
{
$append[] = $key;
}
else
{
$remove[] = $key;
}
}
if(!empty($append))
{
$data = array_merge($data, $append);
}
$data = array_unique($data);
if(!empty($remove))
{
$data = array_diff($data, $remove);
}
$this->setMarked($session, $data);
$qty = count($data);
echo Json::encode([
'qty' => $qty,
'title' => "Разослать выделенным ($qty)",
]);
}
public function actionResetMark($session)
{
$this->setMarked($session, []);
echo Json::encode(array(
'qty' => 0,
'title' => "Разослать выделенным",
));
}
/** /**
* Finds the Faq model based on its primary key value. * Finds the Faq model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown. * If the model is not found, a 404 HTTP exception will be thrown.
......
<?php
namespace common\modules\testings\models;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use common\modules\testings\models\TestingSendHistory;
class SearchTestingSendHistory extends TestingSendHistory
{
/**
* @inheritdoc
*/
public function rules()
{
return [
[['id', 'session_id', 'sended', 'user_id'], 'integer'],
[['id', 'email', 'session_id', 'file', 'sended', 'user_id'], 'safe'],
];
}
/**
* @inheritdoc
*/
public function scenarios()
{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}
/**
* Creates data provider instance with search query applied
*
* @param array $params
*
* @return ActiveDataProvider
*/
public function search($params, $order = null, $limit = null)
{
$query = TestingSendHistory::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => ['pageSize' => self::PAGE_SIZE],
'sort'=>array(
'defaultOrder'=>'sended DESC',
),
]);
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
'email' => $this->email,
'session_id' => Yii::$app->request->get('session'),
'file' => $this->file,
'sended' => $this->sended,
'user_id' => 0,
]);
if(!empty($order))
$query->orderBy($order);
if(!empty($limit))
$query->limit($limit);
return $dataProvider;
}
}
\ No newline at end of file
...@@ -5,12 +5,13 @@ namespace common\modules\testings\models; ...@@ -5,12 +5,13 @@ namespace common\modules\testings\models;
use Yii; use Yii;
use yii\behaviors\TimestampBehavior; use yii\behaviors\TimestampBehavior;
use yii\db\Expression; use yii\db\Expression;
use yii\helpers\Url;
class TestingSendHistory extends \common\components\ActiveRecordModel class TestingSendHistory extends \common\components\ActiveRecordModel
{ {
const PAGE_SIZE = 10; const PAGE_SIZE = 10;
const FOLDER_PATH = '/upload/dublicates/'; const FOLDER_PATH = '/uploads/dublicates/';
const OFFSET_EXCEL_ROWS = 3; const OFFSET_EXCEL_ROWS = 3;
...@@ -152,12 +153,12 @@ class TestingSendHistory extends \common\components\ActiveRecordModel ...@@ -152,12 +153,12 @@ class TestingSendHistory extends \common\components\ActiveRecordModel
public function getFilePath() public function getFilePath()
{ {
return Yii::getPathOfAlias('webroot') . self::FOLDER_PATH . $this->file; return Yii::getAlias('@webroot') . self::FOLDER_PATH . $this->file;
} }
public function getFileUrl() public function getFileUrl()
{ {
return Yii::app()->getBaseUrl(true) . self::FOLDER_PATH . $this->file; return Url::to([self::FOLDER_PATH . $this->file]);
} }
public function generateFile($users, $session_id) public function generateFile($users, $session_id)
......
...@@ -16,6 +16,11 @@ class TestingSession extends \common\components\ActiveRecordModel ...@@ -16,6 +16,11 @@ class TestingSession extends \common\components\ActiveRecordModel
const PAGE_SIZE = 10; const PAGE_SIZE = 10;
public $csv_file; public $csv_file;
public $file;
const TEMP_FOLDER = '/uploads/temp/';
const SCENARIO_UPLOAD = 'upload';
const IS_PRESENT = 0; const IS_PRESENT = 0;
const IS_PAST = 1; const IS_PAST = 1;
...@@ -55,8 +60,9 @@ class TestingSession extends \common\components\ActiveRecordModel ...@@ -55,8 +60,9 @@ class TestingSession extends \common\components\ActiveRecordModel
public function rules() public function rules()
{ {
return [ return [
[['name', 'start_date', 'end_date'], 'required'], [['name', 'start_date', 'end_date'], 'required', 'except' => self::SCENARIO_UPLOAD],
[['name'], 'string', 'max' => 80], [['name'], 'string', 'max' => 80, 'except' => self::SCENARIO_UPLOAD],
[['csv_file'], 'file', 'skipOnEmpty' => false, 'extensions' => 'xls, xlsx', 'on' => self::SCENARIO_UPLOAD],
]; ];
} }
...@@ -152,6 +158,38 @@ class TestingSession extends \common\components\ActiveRecordModel ...@@ -152,6 +158,38 @@ class TestingSession extends \common\components\ActiveRecordModel
return $query->all(); return $query->all();
} }
private function getPath()
{
return Yii::getAlias('@webroot') . self::TEMP_FOLDER;
}
public function upload()
{
if($this->validate())
{
if(!file_exists($this->getPath()))
{
mkdir($this->getPath(), 0777, true);
}
$this->file = $this->getPath() . date('dmYHis-') . uniqid() . '.' . $this->csv_file->extension;
$this->csv_file->saveAs($this->file);
return true;
}
else
{
return false;
}
}
public function deleteFile()
{
if(file_exists($this->file))
{
unlink($this->file);
}
}
public function sendMailByList($users) public function sendMailByList($users)
{ {
for ($i = 0; $i < count($users); $i++) for ($i = 0; $i < count($users); $i++)
......
...@@ -22,6 +22,13 @@ class TestingTest extends \common\components\ActiveRecordModel ...@@ -22,6 +22,13 @@ class TestingTest extends \common\components\ActiveRecordModel
public $csv_file; public $csv_file;
public $file; public $file;
public static $mix_test_titles = [
'Комбинированный тест',
'комбинированный тест',
'Комбинированный',
'комбинированный'
];
/** /**
* @inheritdoc * @inheritdoc
*/ */
......
...@@ -64,8 +64,6 @@ class TestingUser extends \common\components\ActiveRecordModel ...@@ -64,8 +64,6 @@ class TestingUser extends \common\components\ActiveRecordModel
'password' => 'Пароль', 'password' => 'Пароль',
'email' => 'Email', 'email' => 'Email',
'manager_id' => 'Ответственный менеджер', 'manager_id' => 'Ответственный менеджер',
'tki' => 'ТКИ',
'region' => 'Регион',
'create_date' => 'Время создания', 'create_date' => 'Время создания',
]; ];
} }
...@@ -78,11 +76,8 @@ class TestingUser extends \common\components\ActiveRecordModel ...@@ -78,11 +76,8 @@ class TestingUser extends \common\components\ActiveRecordModel
[['first_name', 'patronymic', 'last_name'], 'string', 'max' => 50], [['first_name', 'patronymic', 'last_name'], 'string', 'max' => 50],
[['company_name'], 'string', 'max' => 250], [['company_name'], 'string', 'max' => 250],
[['email'], 'string', 'max' => 150], [['email'], 'string', 'max' => 150],
[['tki', 'city', 'region'], 'string', 'max' => 100], [['city'], 'string', 'max' => 100],
[['manager_id'], 'string', 'max' => 11], [['manager_id'], 'string', 'max' => 11],
[['pass_date', 'pass_date_start', 'attempt'], 'safe'],
[['end_date'], 'required', 'on' => 'extend'],
]; ];
} }
......
...@@ -18,7 +18,7 @@ class TestingUserGroup extends \common\components\ActiveRecordModel ...@@ -18,7 +18,7 @@ class TestingUserGroup extends \common\components\ActiveRecordModel
return [ return [
[ [
'class' => TimestampBehavior::className(), 'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'create_date', 'createdAtAttribute' => 'created',
'updatedAtAttribute' => null, 'updatedAtAttribute' => null,
'value' => new Expression('NOW()'), 'value' => new Expression('NOW()'),
], ],
......
...@@ -57,7 +57,6 @@ if ($question) ...@@ -57,7 +57,6 @@ if ($question)
[ [
'class' => 'common\components\ColorActionColumn', 'class' => 'common\components\ColorActionColumn',
'template' => '{view} {update}', 'template' => '{view} {update}',
'contentOptions' => ['style' => 'width:60px;', 'align' => 'center'],
], ],
], ],
]); ?> ]); ?>
......
...@@ -131,7 +131,6 @@ use common\modules\testings\models\TestingPassing; ...@@ -131,7 +131,6 @@ use common\modules\testings\models\TestingPassing;
[ [
'class' => 'common\components\ColorActionColumn', 'class' => 'common\components\ColorActionColumn',
'template' => '{view} {delete}', 'template' => '{view} {delete}',
'contentOptions' => ['style' => 'width:60px;', 'align' => 'center'],
], ],
], ],
]); ?> ]); ?>
...@@ -205,7 +205,6 @@ use common\modules\testings\models\TestingPassing; ...@@ -205,7 +205,6 @@ use common\modules\testings\models\TestingPassing;
[ [
'class' => 'common\components\ColorActionColumn', 'class' => 'common\components\ColorActionColumn',
'template' => '{view} {delete}', 'template' => '{view} {delete}',
'contentOptions' => ['style' => 'width:60px;', 'align' => 'center'],
], ],
], ],
]); ?> ]); ?>
\ No newline at end of file
...@@ -155,7 +155,6 @@ $this->registerJs($js, yii\web\View::POS_READY, 'expnd.info'); ...@@ -155,7 +155,6 @@ $this->registerJs($js, yii\web\View::POS_READY, 'expnd.info');
[ [
'class' => 'common\components\ColorActionColumn', 'class' => 'common\components\ColorActionColumn',
'template' => '{view} {update}', 'template' => '{view} {update}',
'contentOptions' => ['style' => 'width:60px;', 'align' => 'center'],
], ],
], ],
]); ?> ]); ?>
\ No newline at end of file
<?php
use yii\helpers\Html;
use \common\components\zii\AdminGrid;
use yii\helpers\Url;
use common\modules\testings\models\TestingSendHistory;
/* @var $this yii\web\View */
/* @var $dataProvider yii\data\ActiveDataProvider */
?>
<?php echo AdminGrid::widget([
'dataProvider' => $dataProvider,
// 'filterModel' => $searchModel,
'columns' => [
// ['class' => 'yii\grid\SerialColumn'],
'email',
[
'attribute' => 'sended',
'value' => function($model)
{
return date("d.m.Y H:i:s", $model->sended);
}
],
[
'attribute' => 'unisender_status',
'value' => function($model)
{
return TestingSendHistory::getStatusTitle($model->unisender_status);
},
'filter' => TestingSendHistory::getStatusTitle(),
],
[
'class' => \common\components\ColorActionColumn::className(),
'template' => '{send} {file}',
'buttons' => [
'send' => function ($url, $model, $key)
{
if($model->file && file_exists($model->getFilePath()))
{
return Html::a('<i class="fa fa-envelope fa-lg"></i>', Url::to(['testings/testing-session-admin/send-message', 'id' => $session->id, 'user' => $model->id]), [
'title' => 'Уведомить о тестировании',
'data-toggle' => 'tooltip',
'data-pjax' => '0',
]);
}
},
'file' => function ($url, $model, $key)
{
if($model->file && file_exists($model->getFilePath()))
{
return Html::a('<i class="fa fa-file-text-o fa-lg"></i>', $model->getFileUrl(), [
'title' => 'Скачать список доступов',
'data-toggle' => 'tooltip',
'data-pjax' => '0',
]);
}
},
]
]
],
]); ?>
\ No newline at end of file
<?php <?php
$this->tabs = array(
'просмотреть сессию' => $this->createUrl('/testings/testingPassingAdmin/manage',array('session'=>$model->id)),
);
$this->page_title = 'Импорт пользователей из CSV-файла'; use yii\widgets\ActiveForm;
use yii\helpers\Html;
$this->crumbs = array(
'Список сессий' => array('/testings/testingSessionAdmin/manage'),
$model->name => array('/testings/testingPassingAdmin/manage','session'=>$model->id),
'Импорт пользователей из CSV-файла',
);
?> ?>
<?php if (Yii::app()->user->hasFlash('flash')): ?> <?php if (\Yii::$app->session->hasFlash('flash')): ?>
<?php echo $this->msg(Yii::app()->user->getFlash('flash'), 'ok'); ?> <div class="alert alert-success fade in m-b-15">
<?php echo \Yii::$app->session->getFlash('flash'); ?>
<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/testingSessionAdmin/importCSV',array('id'=>$model->id)); ?>
<div><?php echo $log; ?></div> <div id="log_box"><?php echo $log; ?></div>
<hr>
<script type="text/javascript"> <script type="text/javascript">
jQuery('#log_box p').each(function(){ jQuery('#log_box p').each(function(){
var str = $(this).text(); var str = $(this).text();
var reg = /Ошибка/gi; var reg = /Ошибка/gi;
if (str.match(reg)) { if (str.match(reg)) {
$(this).css('background-color','#ccc').css('color','red'); $(this).css('color','red');
} }
}); });
</script> </script>
...@@ -35,43 +33,23 @@ $this->crumbs = array( ...@@ -35,43 +33,23 @@ $this->crumbs = array(
<div> <div>
Для загрузки реестра пользователей на сайт необходимо: Для загрузки реестра пользователей на сайт необходимо:
<ol> <ol>
<li>Заполнить <a href="/upload/users/Users_example_table.xls">шаблон</a> в формате MS Excel. Поля для назначения тестов имеют формат "да/нет".</li> <li>Заполнить <a href="/uploads/templates/Users_example_table.xlsx">шаблон</a> в формате MS Excel. Поля для назначения тестов имеют формат "да/нет".</li>
<li>ВАЖНО! Список тестов в сессии необходимо создать заранее! Порядок создания тестов в сессии определяет порядок столбцов в файле!</li> <li>ВАЖНО! Список тестов в сессии необходимо создать заранее! Порядок создания тестов в сессии определяет порядок столбцов в файле!</li>
<li>Сохранить файл как CSV (разделители-запятые).</li> <li>Сохранить файл как XLS.</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>. <span style="color: red;">Важно!</span> Не используйте клавишу ENTER для перевода строки при заполнении шаблона. Если это необходимо, пользуйтесь вместо этого тегом <strong><span style="color: red">&lt;br&gt;</span></strong>.
<div class="message info">Внимание! Для правильной работы модуля CSV-импорта необходимо корректно заполнять шаблон. Любое отхождение от шаблона (пустая строка, добавленный столбец) может нарушить работу данной системы.</div>
<div class="message info">Внимание! Для правильной работы модуля CSV-импорта необходимо корректно заполнять шаблон. Любое отхождение от шаблона (пустая строка, добавленный столбец) может нарушить работу данной системы.</div>
<?php $form = $this->beginWidget('CActiveForm', array( <hr>
'id'=>'import-csv-form',
'htmlOptions' => array(
'enctype' => 'multipart/form-data'
)
)); ?>
<dl class="text"> <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
<dd>
<?=$form->label($group, 'name')?>
<?=$form->textField($group, 'name', array(
'class' => 'text'
));?>
<?=$form->error($group, 'name');?>
</dd>
</dl>
<dl class="file"> <?= $form->field($group, 'name')->textInput() ?>
<dd>
<?=$form->label($model, 'csv_file')?> <?= $form->field($model, 'csv_file')->fileInput() ?>
<?=$form->fileField($model, 'csv_file');?>
<?=$form->error($model, 'csv_file');?> <?= Html::submitButton('Загрузить', ['class' => 'btn btn-success']); ?>
</dd>
</dl>
<div class="row buttons">
<?=CHtml::submitButton('Загрузить', array(
'class' => 'submit mid'
))?>
</div>
<?php $this->endWidget(); ?> <?php ActiveForm::end() ?>
\ No newline at end of file
...@@ -93,7 +93,6 @@ use \common\components\zii\AdminGrid; ...@@ -93,7 +93,6 @@ use \common\components\zii\AdminGrid;
[ [
'class' => 'common\components\ColorActionColumn', 'class' => 'common\components\ColorActionColumn',
'template' => '{view} {update}', 'template' => '{view} {update}',
'contentOptions' => ['style' => 'width:60px;', 'align' => 'center'],
], ],
], ],
]); ?> ]); ?>
\ No newline at end of file
...@@ -6,7 +6,6 @@ use \common\components\zii\AdminGrid; ...@@ -6,7 +6,6 @@ use \common\components\zii\AdminGrid;
use common\modules\testings\models\TestingSession; use common\modules\testings\models\TestingSession;
/* @var $this yii\web\View */ /* @var $this yii\web\View */
/* @var $searchModel common\modules\faq\models\SearchFaq */
/* @var $dataProvider yii\data\ActiveDataProvider */ /* @var $dataProvider yii\data\ActiveDataProvider */
$session_id = null; $session_id = null;
...@@ -75,7 +74,6 @@ if($session) ...@@ -75,7 +74,6 @@ if($session)
[ [
'class' => 'common\components\ColorActionColumn', 'class' => 'common\components\ColorActionColumn',
'template' => '{view} {update}', 'template' => '{view} {update}',
'contentOptions' => ['style' => 'width:60px;', 'align' => 'center'],
], ],
], ],
]); ?> ]); ?>
......
...@@ -13,10 +13,21 @@ use common\modules\testings\models\TestingPassing; ...@@ -13,10 +13,21 @@ use common\modules\testings\models\TestingPassing;
/* @var $this yii\web\View */ /* @var $this yii\web\View */
/* @var $dataProvider yii\data\ActiveDataProvider */ /* @var $dataProvider yii\data\ActiveDataProvider */
$session = null;
if (\Yii::$app->request->get('session'))
{
$session = TestingSession::findOne(\Yii::$app->request->get('session'));
}
?> ?>
<p> <p>
<?= Html::a('Добавить', ['create'], ['class' => 'btn btn-success']) ?> <?= Html::a('Добавить', ['create'], ['class' => 'btn btn-success']) ?>
<?php if($session) : ?>
<?= Html::a('Разослать уведомления всем', ['/testings/testing-session-admin/send-message-to-all', 'id' => $session->id], ['class' => 'btn btn-info']) ?>
<?= Html::a('История отправки дубликатов', ['/testings/testing-send-history-admin/manage', 'session' => $session->id], ['class' => 'btn btn-info']) ?>
<?= Html::a('Импорт пользователей из XLS', ['/testings/testing-session-admin/import-passings', 'id' => $session->id], ['class' => 'btn btn-info']) ?>
<?php endif; ?>
</p> </p>
<?php if (\Yii::$app->session->hasFlash('flash')) : ?> <?php if (\Yii::$app->session->hasFlash('flash')) : ?>
...@@ -99,104 +110,88 @@ $columns = [ ...@@ -99,104 +110,88 @@ $columns = [
$link = ''; $link = '';
if (\Yii::$app->request->get('session')) if ($session)
{ {
$session = TestingSession::findOne(\Yii::$app->request->get('session')); $marked = \Yii::$app->controller->getMarked($session->id);
if ($session)
{ $qty = count($marked);
$marked = \Yii::$app->controller->getMarked($session->id);
$style = ($qty) ? '' : 'display:none;';
$qty = count($marked);
$send = Html::a("Разослать выделенным ($qty)",
$style = ($qty) ? '' : 'display:none;'; ['testings/testing-session-admin/send-message-to-marked', 'id' => $session->id],
['style' => $style, 'id' => 'sendMarkup']
$send = Html::a("Разослать выделенным ($qty)", );
['/testings/testing-session-admin/send-message-to-marked', 'id' => $session->id],
['style' => $style, 'id' => 'sendMarkup'] $clear = Html::a("[сброс]",
); ['update-mark', 'session' => $session->id],
['style' => $style, 'id' => 'resetMarkup']
$clear = Html::a("[сброс]", );
['resetMark', 'session' => $session->id],
['style' => $style, 'id' => 'resetMarkup'] $link = $send . ' ' . $clear . '<br><br>';
);
echo $link;
$link = $send . ' ' . $clear;
array_unshift(
// array_unshift( $columns,
// $columns, [
// [ 'class' => 'common\modules\testings\components\MarkBoxColumn',
// 'class' => 'MarkBoxColumn', 'updateUrl' => Url::to(['update-mark', 'session' => $session->id]),
// 'update_url' => Url::to(['update-mark', 'session' => $session->id]), ]
// ] );
// );
foreach($session->tests as $test)
foreach($session->tests as $test) {
{ $columns = ArrayHelper::merge(
$columns = ArrayHelper::merge( $columns,
$columns, [
[ [
[ 'header' => $test->name,
'header' => $test->name, 'value' => function($model) use($test)
'value' => function($model) use($test) {
$passing = TestingPassing::find()->where([
'test_id' => $test->id,
'user_id' => $model->id
])->one();
if($passing)
{
return Html::a("Да", ["/testings/testing-passing-admin/change-status", "user"=>$model->id, "test" => $test->id], ["title" => "Изменить на НЕТ"]);
}
else
{ {
$passing = TestingPassing::find()->where([ return Html::a("Нет", ["/testings/testing-passing-admin/change-status", "user"=>$model->id, "test" => $test->id], ["title" => "Изменить на ДА"]);
'test_id' => $test->id, }
'user_id' => $model->id },
])->one(); 'format' => 'html',
if($passing)
{
return Html::a("Да", ["/testings/testing-passing-admin/change-status", "user"=>$model->id, "test" => $test->id], ["title" => "Изменить на НЕТ"]);
}
else
{
return Html::a("Нет", ["/testings/testing-passing-admin/change-status", "user"=>$model->id, "test" => $test->id], ["title" => "Изменить на ДА"]);
}
},
'format' => 'html',
]
] ]
); ]
} );
// $this->tabs = array(
// 'разослать уведомления всем' => $this->createUrl('/testings/testingSessionAdmin/sendMessageToAll',array('id'=>$session->id)),
// 'история отправки дубликатов' => $this->createUrl('/testings/testingSendHistoryAdmin/manage', array('session'=>$session->id)),
// 'импорт пользователей из CSV' => $this->createUrl(
// '/testings/testingSessionAdmin/importPassings',
// array('id'=>$session->id)
// ),
// );
// $buttons = array(
// 'class' => 'CButtonColumn',
// 'template' => '{sendEmail}{view}{update}',
// 'buttons' => array(
// 'sendEmail' => array(
// 'url' => 'array("/testings/testingSessionAdmin/sendMessage","id"=>'.$session->id.',"user"=>$data->id)',
// 'imageUrl' => '/images/icons/mail.png',
// 'options' => array(
// 'title' => 'Уведомить о тестировании',
// ),
// ),
// ),
// );
} }
$buttons = [
[
'class' => \common\components\ColorActionColumn::className(),
'template' => '{send} {view} {update}',
'buttons' => [
'send' => function ($url, $model, $key) use($session)
{
return Html::a('<i class="fa fa-envelope fa-lg"></i>', Url::to(['testings/testing-session-admin/send-message', 'id' => $session->id, 'user' => $model->id]), [
'title' => 'Уведомить о тестировании',
'data-toggle' => 'tooltip',
'data-pjax' => '0',
]);
},
]
]
];
$columns = ArrayHelper::merge($columns, $buttons);
} }
echo AdminGrid::widget([ echo AdminGrid::widget([
'dataProvider' => $dataProvider, 'dataProvider' => $dataProvider,
'filterModel' => $searchModel, 'filterModel' => $searchModel,
'columns' => $columns 'columns' => $columns,
]); ]);
\ No newline at end of file
// $this->widget('AdminGrid', array(
// 'id' => 'testing-user-grid',
// 'dataProvider' => $model->search(),
// 'filter' => $model,
// 'columns' => $columns,
// 'template' => "$link {pagerSelect}{summary}<br/>{pager}<br/>{items}<br/>{pager}",
// ));
\ No newline at end of file
<?php
$this->tabs = array(
'список назначений тестов пользователям' => $this->createUrl('/testings/testingUserAdmin/manage', array('session' => $session_id)),
);
$this->page_title = 'История отправок дубликатов';
$this->widget('AdminGrid', array(
'id' => 'testing-sendhistory-grid',
'dataProvider' => $model->search(),
'filter' => $model,
'columns' => array(
'email',
array(
'name' => 'sended',
'value' => 'date("d.m.Y H:i:s", $data->sended)',
),
array(
'name' => 'unisender_status',
'value' => 'TestingSendHistory::getStatusTitle($data->unisender_status)',
'filter' => TestingSendHistory::getStatusTitle(),
'headerHtmlOptions' => array(
'style' => 'width: 360px;'
)
),
array(
'header' => '',
'type' => 'raw',
'value' => function($data) {
if($data->file && file_exists($data->getFilePath()))
{
$send = CHtml::link(CHtml::image('/images/icons/mail.png', 'Повторить отправку', array('title' => 'Повторить отправку')), '#', array(
'data-id' => $data->id,
'data-email' => $data->email,
'id' => "resend"
));
$file = CHtml::link(CHtml::image('/img/excel_bg.png', 'Скачать список доступов', array('title' => 'Скачать список доступов')), $data->getFileUrl());
return $send . ' ' . $file;
}
}
)
),
'template' => "{pagerSelect}{summary}<br/>{pager}<br/>{items}<br/>{pager}",
));
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