diff --git a/~dev_rating/application/classes/Controller/Admin/Teachers.php b/~dev_rating/application/classes/Controller/Admin/Teachers.php index 6433a9fe67d1c69ec68545d917a9838a3574d44b..22fb88cec36962b15f770c3bc02eced718d50505 100644 --- a/~dev_rating/application/classes/Controller/Admin/Teachers.php +++ b/~dev_rating/application/classes/Controller/Admin/Teachers.php @@ -25,9 +25,30 @@ class Controller_Admin_Teachers extends Controller_UserEnvi { public function action_add() { // LOGIC + $model = new Model_Admin_Teachers; + $faculties = $model->getFaculties(); + $facultiesHandled = array(); $i = 0; + foreach($faculties as $row) + { + $i++; + $facultiesHandled[$i]['ID'] = $row['FacultyID']; + $facultiesHandled[$i]['Name'] = $row['FacultyName']; + $facultiesHandled[$i]['Abbr'] = $row['FacultyAbbr']; + } + $jobPositions = $model->getJobPositions(); + $jobPositionsHandled = array(); $i = 0; + foreach($jobPositions as $row) + { + $i++; + $jobPositionsHandled[$i]['ID'] = $row['ID']; + $jobPositionsHandled[$i]['Name'] = $row['Name']; + // $jobPositionsHandled[$i]['Abbr'] = $row['Abbr']; + } // VIEW $twig = Twig::factory('admin/teachers/add'); + $twig->JobPositions = $jobPositionsHandled; + $twig->Faculties = $facultiesHandled; $twig->User = $this->UserInfo; $this->response->body($twig); } diff --git a/~dev_rating/application/classes/Controller/Handler/AdmTeachers.php b/~dev_rating/application/classes/Controller/Handler/AdmTeachers.php index 8f6d03576b3783c16d61481d3650ebd0f227f7b7..f72decff178fb6386aa96a2e08265372ae774de3 100644 --- a/~dev_rating/application/classes/Controller/Handler/AdmTeachers.php +++ b/~dev_rating/application/classes/Controller/Handler/AdmTeachers.php @@ -8,6 +8,56 @@ class Controller_Handler_AdmTeachers extends Controller_Handler { parent::before(); } + protected function action_createTeacher() + { + $response['success'] = false; + $this->post + ->rule('firstName', 'not_empty') + ->rule('firstName', 'alpha_dash', array(':value', TRUE)) + ->rule('secondName', 'not_empty') + ->rule('secondName', 'alpha_dash', array(':value', TRUE)) + ->rule('lastName', 'not_empty') + ->rule('lastName', 'alpha_dash', array(':value', TRUE)) + ->rule('jobPositionID', 'not_empty') + ->rule('jobPositionID', 'digit') + ->rule('departmentID', 'not_empty') + ->rule('departmentID', 'digit'); + if($this->post->offsetGet('jobPositionID') == 0) + { + $this->post->error('jobPositionID', 'not_empty'); + $response['success'] = false; + } + if($this->post->offsetGet('departmentID') == 0) + { + $this->post->error('departmentID', 'not_empty'); + $response['success'] = false; + } + if($this->post->check()) + { + $code = $this->createTeacher( + $this->post->offsetGet('lastName'), + $this->post->offsetGet('firstName'), + $this->post->offsetGet('secondName'), + $this->post->offsetGet('jobPositionID'), + $this->post->offsetGet('departmentID')); + if($code != -1) + { + $response['success'] = true; + $response['messages'][1] = 'Р’СЃС‘ РћРљ! Р’РѕС‚ РєРѕРґ активации: '.$code; + } + else { + $response['success'] = false; + $response['messages'][1] = 'Неверные входные данные.'; + } + } + else + { + $response['success'] = false; + $response['messages'] = $this->post->errors(); + } + $this->response->body(json_encode($response)); + } + protected function createTeacher($firstName, $secondName, $lastName, $degreeID, $departamentID) { $activationCode = Account::instance()->createTeacher($firstName, $secondName, $lastName, $degreeID, $departamentID); diff --git a/~dev_rating/application/classes/Model/Admin/Teachers.php b/~dev_rating/application/classes/Model/Admin/Teachers.php index d3e1c809f3605accb4543947e99289d8777af9e8..db5ccb52833f4000cc6b269e59cb77a4200bbcef 100644 --- a/~dev_rating/application/classes/Model/Admin/Teachers.php +++ b/~dev_rating/application/classes/Model/Admin/Teachers.php @@ -8,6 +8,12 @@ class Model_Admin_Teachers extends Model return DB::query(Database::SELECT, $sql)->execute(); } + public function getJobPositions() + { + $sql = "CALL `GetJobPositions`(); "; + return DB::query(Database::SELECT, $sql)->execute(); + } + public function getTeachersByFaculty($facultyID) { $sql = "CALL `GetTeachersByFaculty`('$facultyID'); "; diff --git a/~dev_rating/application/views/admin/base.twig b/~dev_rating/application/views/admin/base.twig index cb1a6ca2fa6b9a796d51e487dd50eb6da958533e..05d330112394982e7fa253cc2ad7851ed64e3314 100644 --- a/~dev_rating/application/views/admin/base.twig +++ b/~dev_rating/application/views/admin/base.twig @@ -42,7 +42,7 @@ {{ HTML.anchor('/', System.Title, {'title': 'Перейти РЅР° главную'})|raw }} </div> <div class="top_name_faculty"> - Панель администратора + {{ HTML.anchor('/admin', System.Title, {'title': 'Перейти РЅР° главную'})|raw }} </div> <div class="top_user"> {{ User.First }} {{ User.Last }} | diff --git a/~dev_rating/application/views/admin/teachers/add.twig b/~dev_rating/application/views/admin/teachers/add.twig index aa3d5f102316dc80c9fc5250352cdbeb5ba95b51..b4173e3930f2fe6727aab950f974f4573cd4d4a6 100644 --- a/~dev_rating/application/views/admin/teachers/add.twig +++ b/~dev_rating/application/views/admin/teachers/add.twig @@ -1 +1,51 @@ -{# empty Twig template #} +{% extends "admin/base" %} + + +{% block media %} +{{ HTML.style('media/css/admin/inputGroup.css')|raw }} +{{ HTML.script('media/js/admin/teachers/add.js')|raw }} +{% endblock %} + +{% block title %}Преподаватели{% endblock %} +{% block main_top_title %}Создание преподавателя{% endblock %} + +{% block main_content %} + <div class="inputGroupMessages"></div> + <div class="inputGroup"> + <div class="inputGroup_title"> + Персональная информация + </div> + <div class="inputGroup_input"> + <input type="text" id="lastName" placeholder="Фамилия"> + <input type="text" id="firstName" placeholder="РРјСЏ"> + <input type="text" id="secondName" placeholder="Отчество"> + </div> + </div> + <div class="inputGroup"> + <div class="inputGroup_title"> + Какая-то информация. Как её назвать? + </div> + <div class="inputGroup_input"> + <select id="jobPositionSelect"> + <option value="0">--- Академическая должность ---</option> + {% for row in JobPositions %} + <option value="{{ row.ID }}">{{ row.Name }}</option> + {% endfor %} + </select> + <select id="facultySelect"> + <option value="0">--- Подразделение ЮФУ ---</option> + {% for row in Faculties %} + <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option> + {% endfor %} + </select> + <select id="departmentSelect"> + <option value="0">--- Кафедра ---</option> + </select> + </div> + </div> + <div class="inputGroup"> + <div class="inputGroup_submit"> + <button id="inputGroupSubmit">Создать преподавателя</button> + </div> + </div> +{% endblock %} \ No newline at end of file diff --git a/~dev_rating/application/views/admin/teachers/index.twig b/~dev_rating/application/views/admin/teachers/index.twig index 5fef921bfe4d58d8d495f2b6ebef2f8cc2b722ff..1ac60818acbab832b605aad03eb528ebcaa0f572 100644 --- a/~dev_rating/application/views/admin/teachers/index.twig +++ b/~dev_rating/application/views/admin/teachers/index.twig @@ -1,6 +1,7 @@ {% extends "admin/base" %} {% block media %} +{{ HTML.style('media/css/admin/searchBox.css')|raw }} {{ HTML.script('media/js/admin/teachers/index.js')|raw }} {% endblock %} @@ -42,9 +43,9 @@ </div> </div> - {{ admin.action('#', 'Загрузить СЃРїРёСЃРѕРє преподавателей', + {{ admin.action(URL.site('admin/teachers/upload'), 'Загрузить СЃРїРёСЃРѕРє преподавателей', 'Загрузить РІ систему '~System.Title~' СЃРїРёСЃРѕРє преподавателей РёР· заранее подготовленных csv-файлов. '~ 'Для каждого преподавателя, загруженного данной утилитой, будет создан аккаунт Рё сгенерирован РєРѕРґ активации.') }} - {{ admin.action('#', 'Добавить РЅРѕРІРѕРіРѕ преподавателя', 'Добавить РІ систему '~System.Title~' РЅРѕРІРѕРіРѕ преподавателя. '~ + {{ admin.action(URL.site('admin/teachers/add'), 'Добавить РЅРѕРІРѕРіРѕ преподавателя', 'Добавить РІ систему '~System.Title~' РЅРѕРІРѕРіРѕ преподавателя. '~ 'Для него будет создан аккаунт Рё сгенерирован РєРѕРґ активации.') }} {% endblock %} \ No newline at end of file diff --git a/~dev_rating/media/css/admin/base.css b/~dev_rating/media/css/admin/base.css index d4a02616916875d4a7d80b49758a2bfb669a9574..b5d56364d612994485fb8f74b3ca1bced47c4e2d 100644 --- a/~dev_rating/media/css/admin/base.css +++ b/~dev_rating/media/css/admin/base.css @@ -185,77 +185,6 @@ a:hover { font-size: 10pt; } -/* ------------------------------------SEARCH----------------------------------------*/ - -.search .search_box -{ - background-color: #eee; - margin: 10px auto; - padding: 5px; -} -.search .search_box .search_mainInput input -{ - width: 100%; - padding: 4px; -} - -.search .search_box .search_mainInput -{ - margin-bottom: 5px; -} - -.search .search_box .search_inputFilters .filter, -.search .search_box .search_inputFilters .filterLarge -{ - display: inline-block; -} - -.search .search_box .search_inputFilters .filter select -{ - padding: 5px; - width: 200px; -} - -.search .search_box .search_inputFilters .filterLarge select -{ - padding: 5px; - width: 400px; -} - -.search_item -{ - padding: 10px; - margin: 1px 0; -} - -.search_item > div -{ - display: inline-block; - vertical-align: middle; - height: auto; - width: 49%; -} - -.search_item_actions -{ - text-align: right; -} - -.search_item:nth-child(odd) -{ - background: #eee; -} - -.search_item:nth-child(even) -{ - background: #fff; -} - -.search_item .search_item_firstLine a -{ - font-size: 18px; -} - /*-------------------------------------ACTION-----------------------------------------*/ .action diff --git a/~dev_rating/media/css/admin/inputGroup.css b/~dev_rating/media/css/admin/inputGroup.css new file mode 100644 index 0000000000000000000000000000000000000000..6ad970c26f71d698ea647e0b5168c4168aedbc27 --- /dev/null +++ b/~dev_rating/media/css/admin/inputGroup.css @@ -0,0 +1,39 @@ +/* ------------------------------------SEARCH----------------------------------------*/ + +.inputGroup +{ + /*border: 1px solid #ddd; + border-radius: 3px;*/ + padding: 10px; +} + +.inputGroup_title +{ + font-size: 18px; + padding: 5px 0px; + border-bottom: 1px solid #ddd; +} + +.inputGroup_input +{ + margin: 10px 0; +} + +.inputGroup_input input[type='text'] +{ + padding: 4px; + width: 265px; +} + +.inputGroup_input select +{ + padding: 4px; + width: 265px; +} + +.inputGroup_submit button +{ + padding: 4px; + width: 100%; +} + diff --git a/~dev_rating/media/css/admin/searchBox.css b/~dev_rating/media/css/admin/searchBox.css new file mode 100644 index 0000000000000000000000000000000000000000..ad95e4aaedd00c819c503bfa8246c50610970812 --- /dev/null +++ b/~dev_rating/media/css/admin/searchBox.css @@ -0,0 +1,70 @@ +/* ------------------------------------SEARCH----------------------------------------*/ + +.search .search_box +{ + background-color: #eee; + margin: 10px auto; + padding: 5px; +} +.search .search_box .search_mainInput input +{ + width: 100%; + padding: 4px; +} + +.search .search_box .search_mainInput +{ + margin-bottom: 5px; +} + +.search .search_box .search_inputFilters .filter, +.search .search_box .search_inputFilters .filterLarge +{ + display: inline-block; +} + +.search .search_box .search_inputFilters .filter select +{ + padding: 5px; + width: 200px; +} + +.search .search_box .search_inputFilters .filterLarge select +{ + padding: 5px; + width: 400px; +} + +.search_item +{ + padding: 10px; + margin: 1px 0; +} + +.search_item > div +{ + display: inline-block; + vertical-align: middle; + height: auto; + width: 49%; +} + +.search_item_actions +{ + text-align: right; +} + +.search_item:nth-child(odd) +{ + background: #eee; +} + +.search_item:nth-child(even) +{ + background: #fff; +} + +.search_item .search_item_firstLine a +{ + font-size: 18px; +} \ No newline at end of file diff --git a/~dev_rating/media/js/admin/teachers/add.js b/~dev_rating/media/js/admin/teachers/add.js new file mode 100644 index 0000000000000000000000000000000000000000..565de1b7875ce2e5b1a05a0e33e7821e4f9527c8 --- /dev/null +++ b/~dev_rating/media/js/admin/teachers/add.js @@ -0,0 +1,44 @@ +$(function() +{ + $("#facultySelect [value='0']").attr('selected', 'selected'); + $('#departmentSelect').attr('disabled', 'disabled'); + $("#departmentSelect [value='0']").attr('selected', 'selected'); + $("#jobPositionSelect [value='0']").attr('selected', 'selected'); + // Выбор факультета + $('#facultySelect').change(function(){ + if (($('#facultySelect option:selected').val()!= '0')) { + $("#departmentSelect").html('<option value="0">--- Кафедра ---</option>'); + $('#departmentSelect').attr('disabled', 'disabled'); + $.post('/~dev_rating/handler/admTeachers/getDepartmentsList', {'facultyID': $('#facultySelect option:selected').val()}, function(data){ + $.each(data, function(i){ + $("#departmentSelect").append('<option value="'+data[i].ID+'">'+data[i].Name+'</option>'); + }); + $("#departmentSelect").removeAttr("disabled"); + }, "json"); + } + else + { + $('#departmentSelect').attr('disabled', 'disabled'); + } + }); + + $('#inputGroupSubmit').click(function(){ + $('#inputGroupSubmit').attr('disabled', 'disabled'); + $.post('/~dev_rating/handler/admTeachers/createTeacher', + { + 'firstName': $('#firstName').val(), + 'secondName': $('#secondName').val(), + 'lastName': $('#lastName').val(), + 'jobPositionID': $('#jobPositionSelect option:selected').val(), + 'departmentID': $('#departmentSelect option:selected').val(), + }, + function(data){ + $('.inputGroupMessages').html('<ul>'); + $.each(data.messages, function(i){ + $('.inputGroupMessages').append('<li>' + data.messages[i]); + }); + $('.inputGroupMessages').append('</ul>'); + $('#inputGroupSubmit').removeAttr('disabled'); + }, "json"); + }); +}); \ No newline at end of file diff --git a/~dev_rating/modules/account/classes/Kohana/Account.php b/~dev_rating/modules/account/classes/Kohana/Account.php index 60509e18bc7a9b93387dde4b39762648295bef88..a0cd0c4aab4be807baae12e65b1641be9b9c2571 100644 --- a/~dev_rating/modules/account/classes/Kohana/Account.php +++ b/~dev_rating/modules/account/classes/Kohana/Account.php @@ -46,15 +46,21 @@ class Kohana_Account { public function createTeacher($lastName, $firstName, $secondName, $degreeID, $departamentID) { $activationCode = $this->generateActivationCode($firstName, $secondName, $lastName); - $this->_model->createTeacher($lastName, $firstName, $secondName, $degreeID, $departamentID, $activationCode); - return $activationCode; + $response = $this->_model->createTeacher($lastName, $firstName, $secondName, $degreeID, $departamentID, $activationCode); + if($response == -1) + return -1; + else + return $activationCode; } public function createStudent($lastName, $firstName, $secondName, $grade, $groupNum, $facultyID) { $activationCode = $this->generateActivationCode($firstName, $secondName, $lastName); - $this->_model->createStudent($lastName, $firstName, $secondName, $grade, $groupNum, $facultyID, $activationCode); - return $activationCode; + $response = $this->_model->createStudent($lastName, $firstName, $secondName, $grade, $groupNum, $facultyID, $activationCode); + if($response == -1) + return -1; + else + return $activationCode; } public function isLoginExists($login)