Commit 8fca25f6 authored by Shakarim Sapa's avatar Shakarim Sapa

Merge remote-tracking branch 'origin/master'

parents c8f50546 2f792aa6
<?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\SendHistory;
use common\modules\testings\models\SearchSendHistory;
class SendHistoryAdminController extends AdminController
{
public static function actionsTitles()
{
return array(
'Manage' => 'Управление пользователями',
'Resend-dublicates' => '',
);
}
public function actionManage($session)
{
$searchModel = new SearchSendHistory();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
Yii::$app->controller->page_title = 'История отправки дубликатов';
Yii::$app->controller->breadcrumbs = [
'История отправки дубликатов',
];
return $this->render('manage', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'session_id' => $session
]);
}
public function actionResendDublicates()
{
if(Yii::app()->request->isAjaxRequest)
{
if(Yii::app()->request->getPost('email') && Yii::app()->request->getPost('id'))
{
$model = TestingSendHistory::model()->findByPK(Yii::app()->request->getPost('id'));
$path = Yii::getPathOfAlias('webroot') . TestingSendHistory::FOLDER_PATH;
$file = $path . $model->file;
if($model->file && file_exists($file))
{
$body = Setting::getValue('email_multiple_user_test_notice_body');
$subject = Setting::getValue('email_test_notice_head');
$mailer_letter = MailerLetter::model();
$body = $mailer_letter->compileText($body, array(
'test_link' => CHtml::link(Yii::app()->controller->createAbsoluteUrl('/testings/testingTest'), Yii::app()->controller->createAbsoluteUrl('/testings/testingTest')),
));
unset($mailer_letter);
$attachments = array(
$model->file => $file
);
MailerModule::sendMailUniSender(Yii::app()->request->getPost('email'), $subject, $body, $model, $attachments);
echo CJavaScript::jsonEncode(array(
'success' => true,
'message' => 'Отправка прошла успешно'
));
}
else
{
echo CJavaScript::jsonEncode(array(
'success' => false,
'message' => 'Файл возможно был удален!'
));
}
}
else
{
echo CJavaScript::jsonEncode(array(
'success' => false,
'message' => 'Данные введены не верно!'
));
}
}
else
throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
}
/**
* Finds the Faq model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param integer $id
* @return Faq the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = SendHistory::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}
...@@ -26,14 +26,8 @@ class SessionAdminController extends AdminController ...@@ -26,14 +26,8 @@ class SessionAdminController extends AdminController
'View' => 'Просмотр сессии', 'View' => 'Просмотр сессии',
'Create' => 'Создание сессии', 'Create' => 'Создание сессии',
'Update' => 'Редактирование сессии', 'Update' => 'Редактирование сессии',
'Extend' => 'Продление сессии',
'Extend1' => 'Продление сессии для компании',
'Delete' => 'Удаление сессии', 'Delete' => 'Удаление сессии',
'Manage' => 'Управление сессиями', 'Manage' => 'Управление сессиями',
'ExportSessionResult' => 'Экспорт результата сессии',
'SendMessage' => 'Отправить пользователю сообщение о назначенных тестах',
'SendMessageToAll' => 'Отправить сообщения о назначенных тестах всем пользователям',
'SendMessageToMarked' => 'Отправить сообщения отмеченным пользователям',
); );
} }
...@@ -129,682 +123,6 @@ class SessionAdminController extends AdminController ...@@ -129,682 +123,6 @@ class SessionAdminController extends AdminController
]); ]);
} }
public function actionExtend($id)
{
$session = $this->loadModel($id);
$model = new Passing;
$model->scenario = 'extend';
$form = new BaseForm('testings.TestingExtendForm', $model);
if(isset($_POST['TestingPassing']))
{
$model->attributes = $_POST['TestingPassing'];
$userPassing = TestingPassing::model()->find('user_id=:user_id and test_id=:test_id', array(':user_id'=> $model->user_id, ':test_id' => $model->test_id));
if ($userPassing == null) {
$model->addError('test_id', 'Нельзя продлить время для теста, который не был назначен пользователю');
}
else {
$userPassing->end_date = $model->end_date;
if($model->validate())
{
if ($userPassing->save()) {
$this->redirect(array('manage'));
}
}
}
}
$this->render('extend', array(
'form' => $form,
'session' => $session
));
}
public function actionExtend1($id)
{
$session = $this->loadModel($id);
$model = new Passing;
//$model->scenario = 'extend';
$form = new BaseForm('testings.TestingExtend1Form', $model);
if(isset($_POST['TestingPassing']))
{
//$model->attributes = $_POST['TestingPassing'];
//var_dump($_POST['TestingPassing']);die;
$users = User::model()->findAllByAttributes(array('company_name'=>htmlspecialchars_decode($_POST['TestingPassing']['company'])));
if ($users)
{
foreach ($users as $user)
{
$userPassing = Passing::model()->find('user_id=:user_id and test_id=:test_id', array(':user_id'=> $user->id, ':test_id' => $_POST['TestingPassing']['test_id']));
if ($userPassing)
{
$userPassing->end_date = $_POST['TestingPassing']['end_date'];
$userPassing->save();
}
}
$this->redirect(array('manage'));
}
}
$this->render('extend1', array(
'form' => $form,
'session' => $session,
));
}
// public function actionImportPassings($id)
// {
// $model = $this->findModel($id);
// $group = new UserGroup;
// $params = ['model' => $model, 'group' => $group];
// if (Yii::$app->request->isPost)
// {
// $model->attributes = Yii::$app->request->post('Session');
// $group->attributes = Yii::$app->request->post('UserGroup');
// $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(Test::find()->where(['session_id' => $model->id])->all(), 'id', 'name'));
// if(!empty($test_ids))
// {
// $passings = Passing::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, Test::$mix_test_titles) && $mixCreate)
// {
// $mixModel = Test::model()->findByAttributes(array('name'=>'Комбинированный тест', 'session_id'=>$model->id));
// if(!$mixModel)
// {
// $mixModel = new Test;
// $mixModel->session_id = $model->id;
// $mixModel->name = 'Комбинированный тест';
// $mixModel->mix = true;
// $mixModel->save();
// }
// $mixCreate = false;
// }
// $usertests[] = $test;
// }
// // если первый столбец не указывает на пол - вся строка неправильная
// if (($sex <> 'м') && ($sex <> 'ж') && ($sex <> 'М') && ($sex <> 'Ж')) continue;
// $usersCount++;
// // поиск или создание пользователя
// $user = User::find()->where([
// 'first_name' => $first_name,
// 'last_name' => $last_name,
// 'patronymic' => $patronymic,
// 'company_name' => $company_name,
// ])->one();
// if (!$user)
// {
// $user = new User;
// $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 UserGroupAssign;
// $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 = Test::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 Passing;
// $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/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)
{
$letters = array();
$count = 1;
for($col = 'A'; $col != 'ZZ'; $col++) {
$letters[$count++] = $col;
}
/*echo "<pre>";
print_r($letters);
echo "</pre>";
die();*/
set_time_limit(900);
ini_set('memory_limit','5250M');
//ini_set('memory_limit','1024M');
$session = $this->loadModel($id);
// get a reference to the path of PHPExcel classes
$phpExcelPath = Yii::getPathOfAlias('ext.phpexcel.Classes');
// Turn off our amazing library autoload
spl_autoload_unregister(array('YiiBase','autoload'));
// making use of our reference, include the main class
// when we do this, phpExcel has its own autoload registration
// procedure (PHPExcel_Autoloader::Register();)
include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');
// Create new PHPExcel object
$excel = new PHPExcel();
// Once we have finished using the library, give back the
// power to Yii...
spl_autoload_register(array('YiiBase','autoload'));
// Set properties
$excel->getProperties()->setCreator("Scheinder Electric")
->setTitle("Excel Title")
->setSubject("Excel Test Document")
->setDescription("Test document for excel, generated using PHP classes.")
->setKeywords("excel php")
->setCategory("Test result file");
// стили
$styleHead = array(
'font'=>array(
'name'=>'Arial',
'size'=>'8',
'bold'=>true,
),
'alignment'=>array(
'horizontal'=>'center',
'vertical'=>'center',
),
'borders' =>array(
'outline'=>array(
'style'=>'thin',
'color'=> array(
'argb'=>'FF333333',
),
),
'inside'=>array(
'style'=>'thin',
'color'=> array(
'argb'=>'FF333333',
),
),
),
'fill'=>array(
'type'=>'solid',
'color'=>array(
'argb'=>'FFC0C0C0',
),
),
);
$styleHead2 = CMap::mergeArray($styleHead, array(
'fill'=>array(
'type'=>'solid',
'color'=>array(
'argb'=>'FFCCFFCC',
),
),
));
$styleHead3 = CMap::mergeArray($styleHead, array(
'fill'=>array(
'type'=>'solid',
'color'=>array(
'argb'=>'FF969696',
),
),
));
$styleHead4 = CMap::mergeArray($styleHead, array(
'font'=>array(
'name'=>'Arial',
'size'=>'6',
'bold'=>true,
),
));
$styleLeft2 = array(
'font'=>array(
'name'=>'Arial',
'size'=>'8',
'bold'=>false,
),
'alignment'=>array(
'horizontal'=>'left',
'vertical'=>'bottom',
),
'borders' =>array(
'outline'=>array(
'style'=>'thin',
'color'=> array(
'argb'=>'FF333333',
),
),
'inside'=>array(
'style'=>'thin',
'color'=> array(
'argb'=>'FF333333',
),
),
),
);
$styleLeft = CMap::mergeArray($styleLeft2, array(
'fill'=>array(
'type'=>'solid',
'color'=>array(
'argb'=>'FFC0C0C0',
),
),
));
$styleNormal = array(
'font'=>array(
'name'=>'Tahoma',
'size'=>'10',
'bold'=>false,
),
'alignment'=>array(
'horizontal'=>'center',
'vertical'=>'bottom',
),
'borders' =>array(
'outline'=>array(
'style'=>'thin',
'color'=> array(
'argb'=>'FF333333',
),
),
'inside'=>array(
'style'=>'thin',
'color'=> array(
'argb'=>'FF333333',
),
),
),
);
$stylePassed = CMap::mergeArray($styleNormal, array(
'fill'=>array(
'type'=>'solid',
'color'=>array(
'argb'=>'FF99CC00',
),
),
));
$styleFailed = CMap::mergeArray($styleNormal, array(
'fill'=>array(
'type'=>'solid',
'color'=>array(
'argb'=>'FFFF9900',
),
),
));
// Добавление информации в таблицу
$excel->setActiveSheetIndex(0);
$s = $excel->getActiveSheet();
// шапка таблицы
$s->mergeCells('A2:A3');
$s->mergeCells('B2:B3');
$s->mergeCells('C2:C3');
$s->mergeCells('D2:D3');
$s->mergeCells('E2:E3');
$s->setCellValue('A2', 'Ответственный ТКИ ШЭ');
$s->setCellValue('B2', 'Город (Регион ШЭ)');
$s->setCellValue('C2', 'ФИО партнёра');
$s->setCellValue('D2', 'Название компании');
$s->setCellValue('E2', 'Город');
$s->getStyle('A2:B3')->applyFromArray($styleHead3);
$s->getStyle('C2:E3')->applyFromArray($styleHead2);
// автоперенос в строках
$s->getStyle('A2:Z3')->getAlignment()->setWrapText(true);
$s->getColumnDimension('A')->setWidth('20');
$s->getColumnDimension('B')->setWidth('18');
$s->getColumnDimension('C')->setWidth('30');
$s->getColumnDimension('D')->setWidth('20');
$s->getColumnDimension('E')->setWidth('18');
$s->getRowDimension('2')->setRowHeight('40');
$s->getRowDimension('3')->setRowHeight('40');
// заголовки для тестов
//$letter = ord('F');
$letter = 6;
$tests = array();
if ($session->tests) {
//die(print_r($session->tests[10]));
foreach ($session->tests as $index => $test) {
//for($index = 0; $index < count($session->tests)-1; $index++) {
$test = $session->tests[$index];
$s->mergeCells($letters[$letter].'2:'.$letters[$letter+1].'2');
$s->setCellValue($letters[$letter].'2', $test->name);
$s->setCellValue($letters[$letter].'3', '%');
$s->setCellValue($letters[$letter+1].'3', 'комментарий');
$s->getColumnDimension($letters[$letter])->setWidth('10');
$s->getColumnDimension($letters[$letter+1])->setWidth('16');
$s->getStyle($letters[$letter].'3')->applyFromArray($styleHead4);
if ($index % 2) {
$s->getStyle($letters[$letter].'2:'.$letters[$letter+1].'3')->applyFromArray($styleHead2);
} else {
$s->getStyle($letters[$letter].'2:'.$letters[$letter+1].'3')->applyFromArray($styleHead);
}
$letter +=2;
$tests[] = $test->id;
//echo $index."<br>";
//if($index == 9) die(print_r($_tests));
}
}
//die('!++!-!-!'.count($session->tests).'---');
// информация о пользователе, ТКИ и тестах
$count = 4; // с какой строки начинать
$passings = Yii::app()->db->createCommand('SELECT * FROM testings_passings WHERE test_id IN ('.implode(',', $tests).') ORDER BY create_date')->queryAll();
//упорядочим для прямого доступа в дальнейшем
$pa = array();
if ($passings) {
foreach ($passings as $p) {
$pa[$p['user_id']][$p['test_id']] = $p;
}
$passings = $pa;
unset($pa);
}
//die(print_r($passings));
foreach ($session->users as $key => $user) {
// if($key<1200)
// continue;
$s->setCellValue('A'.$count, $user->tki);
$s->setCellValue('B'.$count, $user->region);
$s->setCellValue('C'.$count, $user->fio);
$s->setCellValue('D'.$count, $user->company_name);
$s->setCellValue('E'.$count, $user->city);
$s->getStyle('A'.$count.':B'.$count)->applyFromArray($styleLeft);
$s->getStyle('C'.$count.':E'.$count)->applyFromArray($styleLeft2);
$s->getRowDimension($count)->setRowHeight('12');
// информация о тестах
//$letter = ord('F');
$letter = 6;
foreach ($tests as $test_id) {
$s->getStyle($letters[$letter].$count.':'.$letters[$letter+1].$count)->applyFromArray($styleNormal);
if ($passings) {
if (isset($passings[$user->id][$test_id])) {
$passing = $passings[$user->id][$test_id];
}
}
$s->setCellValue($letters[$letter].$count, '-');
if (isset($passing)) {
//$s->setCellValue(chr($letter).$count, '1');
if ($passing['percent_rights']) $s->setCellValue($letters[$letter].$count, $passing['percent_rights']);
if ((string)$passing['is_passed'] === '1') {
$s->getStyle($letters[$letter].$count)->applyFromArray($stylePassed);
$s->setCellValue($letters[$letter+1].$count, 'сдал');
}
if ((string)$passing['is_passed'] === '0') {
$s->getStyle($letters[$letter].$count)->applyFromArray($styleFailed);
$s->setCellValue($letters[$letter+1].$count, 'не сдал');
}
if ($passing['pass_date'] === NULL) {
$s->setCellValue($letters[$letter+1].$count, 'не сдавал');
}
}
unset($passing);
$letter +=2;
}
$count++;
}
// Rename sheet
$excel->getActiveSheet()->setTitle('Отчёт');
// Set active sheet index to the first sheet,
// so Excel opens this as the first sheet
$excel->setActiveSheetIndex(0);
$filename = 'Отчёт по сессии '.$session->name.'.xlsx';
// Redirect output to a client’s web browser (Excel2007)
header('Content-Type: application/excel');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
$objWriter->save('php://output');
Yii::app()->end();
}
public function actionSendMessageToAll($id)
{
set_time_limit(0);
ignore_user_abort(true);
$session = $this->loadModel($id);
$session->sendMailByList($session->users);
Yii::app()->user->setFlash('flash', 'Сообщения для всех успешно отправлены!');
$this->redirect($_SERVER['HTTP_REFERER']);
}
public function actionSendMessageToMarked($id)
{
set_time_limit(0);
$session = $this->loadModel($id);
$session_key = 'notify_session_'.$id;
if(isset(Yii::app()->session[$session_key]))
{
$data = unserialize(Yii::app()->session[$session_key]);
if($data === FALSE)
{
$data = array();
}
}
else
{
$data = array();
}
//очищаем список
unset(Yii::app()->session[$session_key]);
if (count($data))
{
$criteria = new CDbCriteria;
$criteria->addInCondition( "id" , $data );
$users = TestingUser::model()->findAll($criteria);
$session->sendMailByList($users);
}
Yii::app()->user->setFlash('flash','Сообщения для выделенных успешно отправлены!');
$this->redirect($_SERVER['HTTP_REFERER']);
}
public function actionSendMessage($id, $user)
{
$user = TestingUser::model()->findByPk($user);
$session = $this->loadModel($id);
$session->sendMailByList(array($user));
Yii::app()->user->setFlash('flash','Сообщение для пользователя "'.$user->fio.'" успешно отправлено!');
$this->redirect($_SERVER['HTTP_REFERER']);
}
/** /**
* 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.
......
...@@ -6,7 +6,7 @@ use Yii; ...@@ -6,7 +6,7 @@ use Yii;
use yii\behaviors\TimestampBehavior; use yii\behaviors\TimestampBehavior;
use yii\db\Expression; use yii\db\Expression;
use common\modules\testings\models\User; use common\modules\users\models\User;
class Passing extends \common\components\ActiveRecordModel class Passing extends \common\components\ActiveRecordModel
{ {
......
<?php
namespace common\modules\testings\models;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use common\modules\testings\models\SendHistory;
class SearchSendHistory extends SendHistory
{
/**
* @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 = SendHistory::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
<?php
namespace common\modules\testings\models;
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\db\Expression;
use yii\helpers\Url;
class SendHistory extends \common\components\ActiveRecordModel
{
const PAGE_SIZE = 10;
const FOLDER_PATH = '/uploads/dublicates/';
const OFFSET_EXCEL_ROWS = 3;
const STATUS_NOT_SENT = 'not_sent';
const STATUS_OK_SENT = 'ok_sent';
const STATUS_OK_DELIVERED = 'ok_delivered';
const STATUS_OK_READ = 'ok_read';
const STATUS_OK_FBL = 'ok_fbl';
const STATUS_OK_LINK_VISITED = 'ok_link_visited';
const STATUS_OK_UNSUBSCRIBED = 'ok_unsubscribed';
const STATUS_ERR_USER_UNKNOWN = 'err_user_unknown';
const STATUS_ERR_USER_INACTIVE = 'err_user_inactive';
const STATUS_ERR_MAILBOX_FULL = 'err_mailbox_full';
const STATUS_ERR_SPAM_REJECTED = 'err_spam_rejected';
const STATUS_ERR_SPAM_FOLDER = 'err_spam_folder';
const STATUS_ERR_DELIVERY_FAILED = 'err_delivery_failed';
const STATUS_ERR_WILL_RETRY = 'err_will_retry';
const STATUS_ERR_RESEND = 'err_resend';
const STATUS_ERR_DOMAIN_INACTIVE = 'err_domain_inactive';
const STATUS_ERR_SKIP_LETTER = 'err_skip_letter';
const STATUS_ERR_SPAM_SKIPPED = 'err_spam_skipped';
const STATUS_ERR_SPAM_RETRY = 'err_spam_retry';
const STATUS_ERR_UNSUBSCRIBED = 'err_unsubscribed';
const STATUS_ERR_SRC_INVALID = 'err_src_invalid';
const STATUS_ERR_DEST_INVALID = 'err_dest_invalid';
const STATUS_ERR_NOT_ALLOWED = 'err_not_allowed';
const STATUS_ERR_NOT_AVAILABLE = 'err_not_available';
const STATUS_ERR_LOST = 'err_lost';
const STATUS_ERR_INTERNAL = 'err_internal';
private static $xl_template = [
'last_name' => 'Фамилия',
'first_name' => 'Имя',
'patronymic' => 'Отчество',
'login' => 'Логин',
'password' => 'Пароль',
];
public static function tableName()
{
return 'testings_users_history';
}
/**
* @inheritdoc
*/
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'create_date',
'updatedAtAttribute' => null,
'value' => new Expression('NOW()'),
],
];
}
public function name()
{
return 'История отправки доступов';
}
public function rules()
{
return [
[['email', 'session_id'], 'required'],
['file', 'sended', 'user_id', 'unisender_email', 'unisender_status', 'notified', 'safe'],
// array('id, email, session_id, file, sended, user_id', 'safe', 'on' => 'search'),
];
}
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'user_id']);
}
public function getSession()
{
return $this->hasOne(Session::className(), ['id' => 'session_id']);
}
public function attributeLabels()
{
return [
'email' => 'Email',
'session_id' => 'Сессия',
'file' => 'Файл',
'sended' => 'Дата отправки',
'user_id' => 'Пользователь',
'unisender_email' => 'UniSender ID',
'unisender_status' => 'Статус отправки',
];
}
public static function getStatusTitle($status = null)
{
$list = [
self::STATUS_NOT_SENT => 'Сообщение еще не было обработано',
self::STATUS_OK_SENT => 'Сообщение было отправлено',
self::STATUS_OK_DELIVERED => 'Сообщение доставлено',
self::STATUS_OK_READ => 'Сообщение доставлено и зарегистрировано его прочтение',
self::STATUS_OK_FBL => 'Сообщение доставлено, но помещено в папку "спам" получателем',
self::STATUS_OK_LINK_VISITED => 'Сообщение доставлено, прочитано и выполнен переход по одной из ссылок',
self::STATUS_OK_UNSUBSCRIBED => 'Сообщение доставлено и прочитано, но пользователь отписался по ссылке в письме',
self::STATUS_ERR_USER_UNKNOWN => 'Адрес не существует, доставка не удалась',
self::STATUS_ERR_USER_INACTIVE => 'Адрес когда-то существовал, но сейчас отключен',
self::STATUS_ERR_MAILBOX_FULL => 'Почтовый ящик получателя переполнен',
self::STATUS_ERR_SPAM_REJECTED => 'Письмо отклонено сервером как спам',
self::STATUS_ERR_SPAM_FOLDER => 'Письмо помещено в папку со спамом почтовой службой',
self::STATUS_ERR_DELIVERY_FAILED => 'Доставка не удалась по иным причинам',
self::STATUS_ERR_WILL_RETRY => 'Одна или несколько попыток доставки оказались неудачными, но попытки продолжаются',
self::STATUS_ERR_RESEND => 'Одна или несколько попыток доставки оказались неудачными, но попытки продолжаются',
self::STATUS_ERR_DOMAIN_INACTIVE => 'Домен не принимает почту или не существует',
self::STATUS_ERR_SKIP_LETTER => 'Адресат не является активным - он отключён или заблокирован',
self::STATUS_ERR_SPAM_SKIPPED => 'Сообщение не отправлено, т.к. большая часть рассылки попала в cпам и остальные письма отправлять не имеет смысла',
self::STATUS_ERR_SPAM_RETRY => 'Письмо ранее не было отправлено из-за подозрения на спам, но после расследования выяснилось, что всё в порядке и его нужно переотправить',
self::STATUS_ERR_UNSUBSCRIBED => 'Отправка не выполнялась, т.к. адрес, по которому пытались отправить письмо, ранее отписался',
self::STATUS_ERR_SRC_INVALID => 'Неправильный адрес отправителя',
self::STATUS_ERR_DEST_INVALID => 'Неправильный адрес получателя',
self::STATUS_ERR_NOT_ALLOWED => 'Возможность отправки писем заблокирована системой из-за нехватки средств на счету или сотрудниками технической поддержки вручную',
self::STATUS_ERR_NOT_AVAILABLE => 'Адрес, по которому пытались отправить письмо, не является доступным',
self::STATUS_ERR_LOST => 'Письмо было утеряно из-за сбоя на нашей стороне, и отправитель должен переотправить письмо самостоятельно',
self::STATUS_ERR_INTERNAL => 'Внутренний сбой',
];
if($status)
{
if(in_array($status, array_keys($list)))
{
return $list[$status];
}
return $status;
}
return $list;
}
public function getFilePath()
{
return Yii::getAlias('@webroot') . self::FOLDER_PATH . $this->file;
}
public function getFileUrl()
{
return Url::to([self::FOLDER_PATH . $this->file]);
}
public function generateFile($users, $session_id)
{
$path = Yii::getPathOfAlias('webroot') . SendHistory::FOLDER_PATH;
mkdir($path, 0777, true);
$filename = 'spisok_dostupov_k_testirovaniyu_' . date('Y-m-d_His') . '_' . uniqid() . '.xlsx';
$file = $path . $filename;
$phpExcelPath = Yii::getPathOfAlias('ext.phpexcel.Classes');
require_once($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');
$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$sheet = $objPHPExcel->getActiveSheet();
$session = Session::model()->findByPK($session_id);
$info = "Список доступов сотрудников к сессии ".$session->name."
Указанная почта: ".$users[0]->email."
Дата: " . date('d.m.Y');
$objPHPExcel->getDefaultStyle()->getFont()->setName('Calibri')->setSize(12);
$sheet->getColumnDimension("A")->setWidth(25);
$sheet->getColumnDimension("B")->setWidth(25);
$sheet->getColumnDimension("C")->setWidth(25);
$sheet->getColumnDimension("D")->setWidth(25);
$sheet->getColumnDimension("E")->setWidth(25);
$sheet->setCellValue('A1', $info);
$sheet->mergeCells('A1:E1');
$sheet->getRowDimension('1')->setRowHeight(62);
$sheet->getStyle('A1:E1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$sheet->getStyle("A1:E1")->getAlignment()->setWrapText(true);
$sheet->getStyle('A2:E2')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyle('A2:E2')->getFill()->getStartColor()->setARGB('92D050');
$sheet->getStyle('A2:E2')->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$sheet->getStyle('A2:E2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$sheet->getStyle("A2:E2")->getFont()->setBold(true);
$i = 0;
foreach (self::$xl_template as $name => $title)
{
$sheet->setCellValueByColumnAndRow($i, 2, $title);
$i++;
}
foreach ($users as $i => $user)
{
$row = $i + self::OFFSET_EXCEL_ROWS;
$j = 0;
$sheet->getStyle('A'.$row.':E'.$row)->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
if($row%2==0)
{
$sheet->getStyle('A'.$row.':E'.$row)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyle('A'.$row.':E'.$row)->getFill()->getStartColor()->setARGB('F2F2F2');
}
foreach (self::$xl_template as $name => $title)
{
$sheet->setCellValueByColumnAndRow($j, $row, $user->$name);
$j++;
}
}
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save($file);
return $filename;
}
public function search()
{
$criteria = new CDbCriteria;
$criteria->compare('id', $this->id);
$criteria->compare('email', $this->email, true);
$criteria->compare('session_id', Yii::app()->request->getQuery('session'), true);
$criteria->compare('file', $this->file, true);
$criteria->compare('sended', $this->sended, true);
$criteria->compare('user_id', $this->user_id, true);
$criteria->addCondition("user_id = 0");
return new ActiveDataProvider(get_class($this), array(
'criteria' => $criteria
));
}
}
\ No newline at end of file
...@@ -28,9 +28,9 @@ use common\modules\testings\models\Passing; ...@@ -28,9 +28,9 @@ use common\modules\testings\models\Passing;
<p> <p>
<?= Html::a('Добавить', ['create', 'session' => $session->id], ['class' => 'btn btn-success']) ?> <!--<?= Html::a('Добавить', ['create', 'session' => $session->id], ['class' => 'btn btn-success']) ?>-->
<?= Html::a('Импорт из XLS-файла', ['/testings/session-admin/import-passings', 'id' => $session->id], ['class' => 'btn btn-info']) ?> <!--<?= Html::a('Импорт из XLS-файла', ['/testings/session-admin/import-passings', 'id' => $session->id], ['class' => 'btn btn-info']) ?>-->
<?= Html::a('Экспорт результатов в XLS-файл', ['/testings/session-admin/export-session-result', 'id' => $session->id], ['class' => 'btn btn-info']) ?> <!--<?= Html::a('Экспорт результатов в XLS-файл', ['/testings/session-admin/export-session-result', 'id' => $session->id], ['class' => 'btn btn-info']) ?>-->
</p> </p>
<?php echo AdminGrid::widget([ <?php echo AdminGrid::widget([
...@@ -46,7 +46,7 @@ use common\modules\testings\models\Passing; ...@@ -46,7 +46,7 @@ use common\modules\testings\models\Passing;
{ {
if($model->user) if($model->user)
{ {
return Html::a($model->user->fio, ["/testings/user-admin/view", "id" => $model->user->id]); return Html::a($model->user->surname . ' ' . $model->user->name, ["/testings/user-admin/view", "id" => $model->user->id]);
} }
else else
{ {
......
<?php
use yii\helpers\Html;
use \common\components\zii\AdminGrid;
use yii\helpers\Url;
use common\modules\testings\models\SendHistory;
/* @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 SendHistory::getStatusTitle($model->unisender_status);
},
'filter' => SendHistory::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/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
$this->tabs = array(
'просмотреть сессию' => $this->createUrl('/testings/testingPassingAdmin/manage',array('session'=>$model->id)),
);
$this->page_title = 'Импорт пользователей из CSV-файла';
$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 echo $this->msg(Yii::app()->user->getFlash('flash'), 'ok'); ?>
<?php endif ?>
<?php if (isset($log)) : ?>
<?php $this->tabs['загрузить ещё пользователей из CSV-файла'] = $this->createUrl('/testings/testingSessionAdmin/importCSV',array('id'=>$model->id)); ?>
<div><?php echo $log; ?></div>
<script type="text/javascript">
jQuery('#log_box p').each(function(){
var str = $(this).text();
var reg = /Ошибка/gi;
if (str.match(reg)) {
$(this).css('background-color','#ccc').css('color','red');
}
});
</script>
<?php endif; ?>
<span style="font-size: 14px; color: #008C66;">Краткая инструкция по файла назначения теста пользователям</span><br /><br />
<div>
Для загрузки реестра пользователей на сайт необходимо:
<ol>
<li>Заполнить <a href="/upload/users/Users_example_table.xls">шаблон</a> в формате MS Excel. Поля для назначения тестов имеют формат "да/нет".</li>
<li>ВАЖНО! Список тестов в сессии необходимо создать заранее! Порядок создания тестов в сессии определяет порядок столбцов в файле!</li>
<li>Сохранить файл как CSV (разделители-запятые).</li>
<li>Загрузить файл на сайт c помощью кнопки ниже.</li>
</ol>
<span style="color: red;">Важно!</span> Не используйте клавишу ENTER для перевода строки при заполнении шаблона. Если это необходимо, пользуйтесь вместо этого тегом <strong><span style="color: red">&lt;br&gt;</span></strong>.
<div class="message info">Внимание! Для правильной работы модуля CSV-импорта необходимо корректно заполнять шаблон. Любое отхождение от шаблона (пустая строка, добавленный столбец) может нарушить работу данной системы.</div>
<?php echo $form; ?>
\ No newline at end of file
<?php
$this->tabs = array(
'управление' => $this->createUrl('manage'),
'просмотр' => $this->createUrl('view', array('id' => $session->id)),
'продлить' => $this->createUrl('extend', array('id' => $session->id))
);
$this->crumbs = array(
'Список сессий' => array('/testings/testingSessionAdmin/manage'),
'Сессия "'.$session->name.'"' => array('/testings/testingSessionAdmin/view','id'=>$session->id),
'Редактирование',
);
echo $form;
<?php
$this->tabs = array(
'управление' => $this->createUrl('manage'),
'просмотр' => $this->createUrl('view', array('id' => $session->id)),
'продлить' => $this->createUrl('extend', array('id' => $session->id))
);
$this->crumbs = array(
'Список сессий' => array('/testings/testingSessionAdmin/manage'),
'Сессия "'.$session->name.'"' => array('/testings/testingSessionAdmin/view','id'=>$session->id),
'Редактирование',
);
echo $form;
<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
?>
<?php if (\Yii::$app->session->hasFlash('flash')): ?>
<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 if (isset($log)) : ?>
<div id="log_box"><?php echo $log; ?></div>
<hr>
<script type="text/javascript">
jQuery('#log_box p').each(function(){
var str = $(this).text();
var reg = /Ошибка/gi;
if (str.match(reg)) {
$(this).css('color','red');
}
});
</script>
<?php endif; ?>
<span style="font-size: 14px; color: #008C66;">Краткая инструкция по файла назначения теста пользователям</span><br /><br />
<div>
Для загрузки реестра пользователей на сайт необходимо:
<ol>
<li>Заполнить <a href="/uploads/templates/Users_example_table.xlsx">шаблон</a> в формате MS Excel. Поля для назначения тестов имеют формат "да/нет".</li>
<li>ВАЖНО! Список тестов в сессии необходимо создать заранее! Порядок создания тестов в сессии определяет порядок столбцов в файле!</li>
<li>Сохранить файл как XLS.</li>
<li>Загрузить файл на сайт c помощью кнопки ниже.</li>
</ol>
<span style="color: red;">Важно!</span> Не используйте клавишу ENTER для перевода строки при заполнении шаблона. Если это необходимо, пользуйтесь вместо этого тегом <strong><span style="color: red">&lt;br&gt;</span></strong>.
<div class="message info">Внимание! Для правильной работы модуля XLS-импорта необходимо корректно заполнять шаблон. Любое отхождение от шаблона (пустая строка, добавленный столбец) может нарушить работу данной системы.</div>
<hr>
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
<?= $form->field($group, 'name')->textInput() ?>
<?= $form->field($model, 'csv_file')->fileInput() ?>
<?= Html::submitButton('Загрузить', ['class' => 'btn btn-success']); ?>
<?php ActiveForm::end() ?>
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160218_131414_clear_testings extends Migration
{
public function safeUp()
{
$this->dropTable('testings_users');
$this->dropTable('testings_users_groups');
$this->dropTable('testings_users_groups_assign');
$this->dropTable('testings_users_history');
}
public function safeDown()
{
// Структура таблицы `testings_users`
$this->createTable('testings_users', [
'id' => Schema::TYPE_PK,
'sex' => 'tinyint(1) NOT NULL',
'first_name' => Schema::TYPE_STRING . '(50) NOT NULL',
'patronymic' => Schema::TYPE_STRING . '(50) DEFAULT NULL',
'last_name' => Schema::TYPE_STRING . '(50) NOT NULL',
'company_name' => Schema::TYPE_STRING . '(250) NOT NULL',
'city' => Schema::TYPE_STRING . '(100) DEFAULT NULL',
'login' => Schema::TYPE_STRING . '(30) NOT NULL',
'password' => Schema::TYPE_STRING . '(30) NOT NULL',
'email' => Schema::TYPE_STRING . '(150) NOT NULL',
'manager_id' => Schema::TYPE_INTEGER . '(11) unsigned NOT NULL',
'tki' => Schema::TYPE_STRING . '(150) DEFAULT NULL',
'region' => Schema::TYPE_STRING . '(100) DEFAULT NULL',
'is_auth' => "tinyint(1) DEFAULT '0'",
'create_date' => Schema::TYPE_TIMESTAMP . ' NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
]);
// Структура таблицы `testings_users_groups`
$this->createTable('testings_users_groups', [
'id' => Schema::TYPE_PK,
'session_id' => Schema::TYPE_INTEGER . '(11) NOT NULL',
'name' => Schema::TYPE_STRING . '(255) DEFAULT NULL',
'created' => Schema::TYPE_TIMESTAMP . ' NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
]);
// Структура таблицы `testings_users_groups_assign`
$this->createTable('testings_users_groups_assign', [
'user_id' => Schema::TYPE_INTEGER . '(11) NOT NULL',
'group_id' => Schema::TYPE_INTEGER . '(11) NOT NULL',
'session_id' => Schema::TYPE_INTEGER . '(11) NOT NULL',
]);
// Структура таблицы `testings_users_history`
$this->createTable('testings_users_history', [
'id' => Schema::TYPE_PK,
'session_id' => Schema::TYPE_INTEGER . '(11) NOT NULL',
'user_id' => Schema::TYPE_INTEGER . '(11) NOT NULL',
'email' => Schema::TYPE_STRING . '(255) DEFAULT NULL',
'sended' => Schema::TYPE_INTEGER . '(11) NOT NULL',
'file' => Schema::TYPE_STRING . '(255) DEFAULT NULL',
'unisender_email' => Schema::TYPE_STRING . '(255) DEFAULT NULL',
'unisender_status' => Schema::TYPE_STRING . '(20) DEFAULT NULL',
'notified' => Schema::TYPE_INTEGER . '(1) NOT NULL',
'created' => Schema::TYPE_TIMESTAMP . ' NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
]);
$this->createIndex('testings_users2users', 'testings_users', 'manager_id');
}
}
...@@ -76,9 +76,6 @@ a.login_form_link, a.login_form_popup_link, a.reg_popup_link, a.reg_form_link{ ...@@ -76,9 +76,6 @@ a.login_form_link, a.login_form_popup_link, a.reg_popup_link, a.reg_form_link{
.txt_server:before { .txt_server:before {
position: absolute; position: absolute;
} }
.article_short_txt img {
width: auto !important;
}
.reviews-block { .reviews-block {
background: #fff; background: #fff;
padding-bottom: 0; padding-bottom: 0;
...@@ -162,7 +159,27 @@ a.toggle_bottom:hover .icon-arrowDown2:after, a.toggle_bottom:active .icon-arrow ...@@ -162,7 +159,27 @@ a.toggle_bottom:hover .icon-arrowDown2:after, a.toggle_bottom:active .icon-arrow
.video_sec a.toggle_bottom { .video_sec a.toggle_bottom {
margin-top: 153px; margin-top: 153px;
} }
.bx-wrapper .bx-prev {
background: #344555 url(../images/arrow_left.png) no-repeat center center;
}
.bx-wrapper .bx-pager.bx-default-pager a:hover {
background: url(../images/elips_hover.png) no-repeat center center;
}
.bx-wrapper .bx-pager.bx-default-pager a {
background: url(../images/elips.png) no-repeat center center;
}
.bx-wrapper .bx-next {
background: #344555 url(../images/arrow_right.png) no-repeat center center;
}
.bx-wrapper .bx-pager.bx-default-pager a.active {
background: url(../images/elips_active.png) no-repeat center center;
}
@media (min-width: 970px) {
.article_short_txt img {
width: auto !important;
}
}
@media (max-width: 970px) { @media (max-width: 970px) {
.e_cat_top a.toggle_bottom { .e_cat_top a.toggle_bottom {
...@@ -201,4 +218,8 @@ a.toggle_bottom:hover .icon-arrowDown2:after, a.toggle_bottom:active .icon-arrow ...@@ -201,4 +218,8 @@ a.toggle_bottom:hover .icon-arrowDown2:after, a.toggle_bottom:active .icon-arrow
font-size: 14px; font-size: 14px;
margin-top: 90px; margin-top: 90px;
} }
.calk_form .calk_form_subtitle,
.calk_form .file-upload_block {
display: none;
}
} }
\ No newline at end of file
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