<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /*Работа с пользователями*/ class User extends CI_Model { public function __construct() { parent::__construct(); // For hashPassword function $this->load->model("userHelper"); } /*Получаем всех пользователей*/ function getUsers($data) { return $this->filterResults('users', $data); } /*Получаем сайты пользователя*/ function getUserSites($data) { return $this->filterResults('responsible', $data); } private function filterResults($table, $data) { $this->load->helper("search"); $id_user = isset($data['id_user']) ? $data['id_user'] : 0; $page = isset($data['page']) ? $data['page'] : 0; $limit = isset($data['limit']) ? $data['limit'] : 0; $sord = isset($data['sord']) ? $data['sord'] : 0; $sidx = isset($data['sidx']) ? $data['sidx'] : 0; $search = isset($data['search']) ? $data['search'] : "false"; $searchstring = ""; $search_string = ""; if ($search == "true") { $searchField = $data['searchField']; $searchOper = $data['searchOper']; $searchString = $data['searchString']; $search_string = searchString($searchField, $searchOper, $searchString); if ($search_string != "") { $searchstring .= " AND " . $search_string . " "; } } $data = array(); /*Данные для pagination jqGrid*/ if ( $table == 'responsible' ) { $query_count = "SELECT COUNT(DISTINCT id) AS count FROM responsible AS r WHERE id_user = '$id_user'"; } else if ( $table == 'users' ) { $query_count = "SELECT COUNT(id) AS count FROM users AS u"; } $count = $this->db->query($query_count)->num_rows(); if( $count > 0 ) { $total_pages = ($limit > 0) ? ceil($count / $limit) : 1; } else { $total_pages = 0; } if ($page > $total_pages) { $page = $total_pages; } $data['page'] = $page; $data['total'] = $total_pages; $data['records'] = $count; $join_on = "s.id = r.id_site" . " WHERE r.id_user = '$id_user'"; /**/ $start = $limit * $page - $limit; if ($start < 0) { $start = 0; } if ( $table == 'users' ) { $this->db->select('*'); $this->db->from('users as u'); } else { $this->db->select('r.*, s.*, r.status as responsible_status'); $this->db->from('responsible as r'); $this->db->join('sites as s', $join_on); } if ( $search == "true" ) { $this->db->where($search_string); } if ( $limit ) { $this->db->limit($limit, $start); } if ( $sidx ) { $this->db->order_by($sidx . " " . $sord); } $results = $this->db->get(); if ( $table == 'users') { foreach( $results->result() as $id => $row ) { $data['rows'][$id]['id'] = $row->id; $data['rows'][$id]['cell'][] = $row->id; $data['rows'][$id]['cell'][] = $row->login; $data['rows'][$id]['cell'][] = $row->type; $data['rows'][$id]['cell'][] = $row->email; $data['rows'][$id]['cell'][] = '******'; $data['rows'][$id]['cell'][] = $row->firstname; $data['rows'][$id]['cell'][] = $row->middlename; $data['rows'][$id]['cell'][] = $row->lastname; $data['rows'][$id]['cell'][] = $row->activity; $data['rows'][$id]['cell'][] = $row->date; } } else if ( $table == 'responsible' ) { foreach( $results->result() as $id => $row ) { log_message("debug", "row dump: " . print_r($row, true)); $data['rows'][$id]['id'] = $row->id; $data['rows'][$id]['cell'][] = $row->id; $data['rows'][$id]['cell'][] = $row->site; $data['rows'][$id]['cell'][] = $row->responsible_status; $data['rows'][$id]['cell'][] = $row->date; } } return $data; } /** * Возвращает список сайтов, доступных для добавления * к пользователю. * * @param type $user_id Идентификатор пользователя */ function getAvailableSites($user_id) { $this->db->select("s.id,s.site"); $this->db->from("sites as s"); $this->db->where('s.id NOT IN (' . 'SELECT s.id FROM sites as s ' . 'JOIN responsible as r ON r.id_site = s.id ' . 'WHERE r.id_user = '.$user_id.')'); return $this->db->get(); } /*Добавляем пользователя*/ function addUser($data) { if (!$this->checkEmail($data['email'])) { return array('message' => 'Email не уникален'); } if (!$this->checkLogin($data['login'])) { return array('message' => 'Логин не уникален'); } $insertData = [ 'login' => $data['login'], 'type' => $data['type'], 'email' => $data['email'], 'password' => $this->userHelper->hashPassword($data['password']), 'firstname' => $data['firstname'], 'middlename' => $data['middlename'], 'lastname' => $data['lastname'], 'activity' => $data['activity'], 'date' => date('Y-m-d H:i:s', time()), ]; $this->db->insert('users', $insertData); } function editUser($data) { // TODO: дублирование проверки (см. addUser) if (!$this->checkEmail($data['email'], $data['id_user'])) { return array('message' => 'Email не уникален'); } if (!$this->checkLogin($data['login'], $data['id_user'])) { return array('message' => 'Логин не уникален'); } // TODO: странная проверка if ($data['password'] != '******') { $data['password'] = $this->userHelper->hashPassword($this->input->post('password')); } $insertData = [ 'id' => $data['id_user'], 'login' => $data['login'], 'type' => $data['type'], 'email' => $data['email'], 'password' => $data['password'], 'firstname' => $data['firstname'], 'middlename' => $data['middlename'], 'lastname' => $data['lastname'], 'activity' => $data['activity'], 'date' => date('Y-m-d H:i:s', time()), ]; $this->db->where('id', $data['id_user']); $this->db->update('users', $insertData); } /*Удаляем пользователя*/ function deleteUser($data) { $this->db->where('id', $data['id_user']); $this->db->delete('users'); $this->db->where('id', $data['id_user']); $this->db->delete('responsible'); } /*Снимаем ответсвенного*/ function deleteResponsible($data) { $this->db->where('id_site', $data['id_site']); $this->db->where('id_user', $data['id_user']); $this->db->delete('responsible'); } /*Обновляем статус*/ function editResponsible($data) { log_message("debug", "EditResponsible!"); $this->db->set('status', $data['status']); $this->db->where('id_site', $data['id_site']); $this->db->where('id_user', $data['id_user']); $this->db->update('responsible'); log_message("debug", "query: {$this->db->last_query()}"); } /*Проверяем логин на уникальность*/ function checkLogin($login, $id_user = '') { if ($this->config->item('typos_admin_login')) { if ($login == $this->config->item('typos_admin_login')) { return false; } } $this->db->where('login', $login); if ($id_user != '') { $this->db->where('id !=', $id_user); } $this->db->from('users'); $count = $this->db->count_all_results(); if ($count == 0) { return true; } else { return false; } } /*Проверяем email на уникальность*/ function checkEmail($email, $id_user = '') { if ($this->config->item('typos_admin_email')) { if ($email == $this->config->item('typos_admin_email')) { return false; } } $this->db->where('email', $email); if ($id_user != '') { $this->db->where('id !=', $id_user); } $this->db->from('users'); $count = $this->db->count_all_results(); if ($count == 0) { return true; } else { return false; } } /*Получаем сайты для пользователя, кроме уже принадлежащих*/ function getSites($id_user) { return $this->db->query("SELECT id, site FROM sites WHERE id NOT IN (SELECT site_id FROM responsible WHERE user_id = '$id_user') ")->result(); } /*Добавляем сайт в ответственность*/ function addResponsible($data) { if (!$this->checkUserId($data['id_user'])) { return array('message' => "Пользователь не существует"); } if (!$this->checkResponsible($data)) { return array('message' => "Этот сайт уже назначен"); } if (!$this->checkSiteId($data['id_site'])) { return array('message' => "Сайт не существует"); } $data2 = [ 'id' => NULL, 'id_site' => $data['id_site'], 'id_user' => $data['id_user'], 'status' => $data['status'], 'date' => date('Y-m-d H:i:s', time()) ]; $this->db->insert('responsible', $data2); } /*Проверяем - есть ли у пользователя такой сайт*/ function checkResponsible($data) { $this->db->where("id_user", $data['id_user']); $this->db->where("id_site", $data['id_site']); $this->db->from("responsible"); $count = $this->db->count_all_results(); if ($count == 0) { return true; } else { return false; } } /*Проверяем - есть ли пользователь по id*/ function checkUserId($id_user) { $this->db->where("id", $id_user); $this->db->from("users"); $count = $this->db->count_all_results(); if ($count == 0) { return false; } else { return true; } } function checkSiteId($id_site) { $this->db->where("id", $id_site); $this->db->from("sites"); $count = $this->db->count_all_results(); if ($count > 0) { return true; } else { return false; } } } /**/