anketa = $anketa; // global variable global $lang; global $global_user_id; $this->lang = $lang; $this->user_id = $global_user_id; $this->hierarhija_type = HierarhijaHelper::preveriTipHierarhije($this->anketa); return $this; } private static $_instance; public static function init($anketa) { if (!static::$_instance) return (new AjaxUporabniki($anketa)); return static::$_instance; } /** * Pridobimo vse celotno strukturo za prikaz v dataTables * * @return $array - večdimenzionalni */ public function getDataTablesPodatkeZaPrikazTabele() { // če je admin if ($this->hierarhija_type < 5) { $podatki = (new HierarhijaQuery())->hierarhijaArrayDataTables($this->anketa); } else { $hierarhija = (new HierarhijaQuery()); $uporabnik = $hierarhija->preveriPravicoUporabnika($this->anketa); $struktura = $hierarhija->poisciHierarhijoNavzgor($uporabnik->struktura_id); $podatki = (new HierarhijaQuery())->hierarhijaArrayDataTables($this->anketa, $struktura); } return $podatki; } /** * Preverimo, če je omenjen šifrant že napisan za ustrezen nivo * * @return $array or null */ public function preveriVpisSifrantaZaSledeciNivo() { $level = $_POST['level']; $hierarhija_sifranti_id = $_POST['hierarhija_sifranti_id']; // Če je parent_id = potem moramo pogledati na prvi nivo IS NULL if (empty($_POST['parent_id'])) { $parent = "parent_id IS NULL"; } else { $parent = "parent_id='" . $_POST['parent_id'] . "'"; } $sql = sisplet_query("SELECT * FROM srv_hierarhija_struktura WHERE hierarhija_sifranti_id='" . $hierarhija_sifranti_id . "' AND level='" . $level . "' AND " . $parent); // imamo zapis v bazi, potem pogledamo še če obstajajo uporabniki if ($sql->num_rows > 0) { $podatki = []; while ($row = $sql->fetch_object()) { $podatki = [ 'id' => $row->id, 'level' => $row->level, 'parent_id' => $row->parent_id, 'hierarhija_sifranti_id' => $row->hierarhija_sifranti_id ]; $sql_user = sisplet_query(" SELECT users.id as id, users.email as email, users.name as name, users.surname as surname FROM srv_hierarhija_struktura_users as u LEFT JOIN users ON users.id = u.user_id WHERE u.hierarhija_struktura_id = '" . $row->id . "' "); // V kolikor so v bazi uporabniki potem pridobimo vse in zapišemo v polje if ($sql_user->num_rows > 0) { while ($user = $sql_user->fetch_object()) { $podatki['uporabniki'][] = [ 'id' => $user->id, 'email' => $user->email, 'ime' => $user->name, 'priimek' => $user->surname ]; } } } return ($podatki); } return 0; } /** * Posodobimo sifrante za JS tree, če brišemo element iz drevesne strukture * * @return array */ public function getPosodobiSifranteZaJsTree() { $id = $_POST['id']; # Pridobimo strukturo navzgor od trenutnega ID-ja za vse šifrante $nivoji = HierarhijaQuery::posodobiSifranteVrednostiGledeNaTrenutenIdStrukture($id); # Pridobimo max st nivojev $max_st = sisplet_query("SELECT MAX(level) AS max FROM srv_hierarhija_ravni WHERE anketa_id='$this->anketa'")->fetch_object()->max; # Preverimo na katerem ID-ju (nivoju) se nahaja uporabnik, ki je kliknil na strukturo $user_db = HierarhijaOnlyQuery::queryStrukturaUsersLevel($this->anketa, $this->user_id); if ($user_db->num_rows == 0 && $this->hierarhija_type < 5) { $nivoji['user'] = [ 'id_strukture' => 'admin', 'max_level' => $max_st ]; } if ($user_db->num_rows > 0) { $user_db = $user_db->fetch_object(); $nivoji['user'] = [ 'id_strukture' => $user_db->struktura_id, 'level' => $user_db->level, 'max_level' => $max_st ]; } return $nivoji; } /** * Shrani strukturo v bazo (novi šifranti in uporabniki za sledeči nivo * * @return string or intiger */ public function shraniStrukturoSifrantovInUporabnikov() { // tracking - beleženje sprememb $this->trackingChanges(); $vnos = $_POST['vnos']; $osebe = $_POST['osebe']; $hierarhija_id = null; if (empty($vnos)) return 0; // Najprev shranimo strukturo, da pridobimo id za vpis oseb foreach ($vnos as $nivo => $vpis) { // Vpišemo samo nivoje večje od 0, ker post request vsebuje tudi polje 0, ki za naš ni relavanto if ($nivo > 0 && is_array($vpis) && empty($vpis['id'])) { $ravni_id = $vpis['hierarhija_ravni_id']; $sifrant_id = $vpis['hierarhija_sifranti_id']; $level = $vpis['level']; // Če je prvi nivo potem je parent_id NULL, za vse ostale primere pa moramo met parenta, če naprej v hierarhiji ni parenta potem uporabimo $hierarhija_id - predhodni element vpisa if ($level == 1) $parent_id = null; elseif ($level > 1 && empty($vpis['parent_id'])) $parent_id = $hierarhija_id; else $parent_id = $vpis['parent_id']; // Vpis nove strukture, kjer dobimo ID in uporabimo potem za parent id $hierarhija_id = sisplet_query("INSERT INTO srv_hierarhija_struktura (anketa_id, hierarhija_ravni_id, parent_id, hierarhija_sifranti_id, level) VALUES ('" . $this->anketa . "', '" . $ravni_id . "', " . var_export($parent_id, true) . ",'" . $sifrant_id . "', ' " . $level . "')", "id"); // Vpišemo še uporabnike, če obstaja if (!empty($osebe[$vpis['level']]) && is_array($osebe[$vpis['level']])) { // Osebe so nanizane v poljih, vsaka oseba je podana preko polja, kjer [ 0 => email, 1=>ime, 2=>priimek], obvezen je samo prvi element foreach ($osebe[$vpis['level']] as $oseba) { $this->dodajUporabnikaVbazo($oseba, $hierarhija_id); } } } elseif ($nivo > 0 && is_array($vpis) && !empty($vpis['id'])) { // Vpišemo samo uporabnika if (!empty($osebe[$vpis['level']]) && is_array($osebe[$vpis['level']])) { // Osebe so nanizane v poljih, vsaka oseba je podana preko polja, kjer [ 0 => email, 1=>ime, 2=>priimek], obvezen je samo prvi element foreach ($osebe[$vpis['level']] as $oseba) { $this->dodajUporabnikaVbazo($oseba, $vpis['id']); } } } } // Podatke shranimo še v srv_hierarhija_shrani (new HierarhijaAjax($this->anketa))->shraniStrukturoHierarhijeVString(); return 'success'; } /** * pridobimo pravice trenutnega uporabnika * * level 1 - super admin ima vse pravice, ponavadi je lastnik ankete oz. jo je ustvaril in vključil hierarhijo * levle 10 - običajni uporabnik, ki je dodan na določen nivo hierarhije * * @return array */ public function getUserLevelPermission() { // vrne polje leve, struktura_id in parent_id $hierarhija = (new HierarhijaQuery()); $uporabnik = $hierarhija->preveriPravicoUporabnika($this->anketa); if (is_array($uporabnik) && $uporabnik['uporabnik'] == 1) { echo json_encode($uporabnik); die(); } $struktura = $hierarhija->poisciHierarhijoNavzgor($uporabnik->struktura_id); return [ 'uporabnik' => $uporabnik, 'struktura' => $struktura ]; } /** * Pridobimo nivoje in šifrane za sledečo raven pri tem če ni super admin ga omejimo * * @return array - ['nivoji', 'sifranti', 'maxLevel] */ public function getSifrantiZaHierarhijaUserType() { if ($this->hierarhija_type < 5) { // Pridobimo vse ravni in šifrante $podatki = (new HierarhijaQuery())->getSifrantAdmin($this->anketa); } else { // Pridobimo nivo uporabnika, ki se nahaja najvišje v strukturi $uporabnik = (new HierarhijaQuery())->preveriPravicoUporabnika($this->anketa); // Pridobimo vse ravni in šifrante samo od uporabnikovega nivoja/level navzdol $podatki = (new HierarhijaQuery())->getSifrantAdmin($this->anketa, 999, $uporabnik->level); } // Pridobimo max število nivojev, ki jih lahko vnesemo $podatki['maxLevel'] = sisplet_query("SELECT MAX(level) as level FROM srv_hierarhija_ravni WHERE anketa_id='" . $this->anketa . "'")->fetch_object()->level; return $podatki; } /** * Dodamo uporabnika v bazo za sledečo strukturo */ private function dodajUporabnikaVbazo($oseba, $struktura_id, $last = false) { global $pass_salt; // Podatki o uporabniku $email = (is_array($oseba) ? trim($oseba[0]) : $oseba); $update = false; //Iz emaila pridobimo podatke preg_match('/(\w+)((?:\.)(\w+))?/', $email, $matches); $name = !empty($oseba[1]) ? trim($oseba[1]) : ucfirst(mb_strtolower($matches[1])); // V kolikor je primek ga if(!empty($oseba[2])) { $surname = trim($oseba[2]); $update = true; }elseif(!empty($matches[3])){ $surname = ucfirst(mb_strtolower($matches[3])); }else{ $surname = ''; } if ($email != '' && validEmail($email)) { $sql_user = sisplet_query("SELECT id FROM users WHERE email='$email'"); if (mysqli_num_rows($sql_user) == 0) { sisplet_query("INSERT INTO users (name, surname, email, pass, type, when_reg, came_from) VALUES ('$name', '$surname', '$email', '" . base64_encode((hash('SHA256', '' . $pass_salt))) . "', '3', DATE_FORMAT(NOW(), '%Y-%m-%d'), '1')"); $user_id = mysqli_insert_id($GLOBALS['connect_db']); } else { $row = mysqli_fetch_array($sql_user); $user_id = $row['id']; // V kolikor smo mi vnesli ime in prrimek potem popravimo tudi v bazi if($update) sisplet_query("UPDATE users SET name='".$name."', surname='".$surname."' WHERE id='".$user_id."'"); } // V kolikor smo dodali nov email na zadnji nivo potem samo zamenjamo z obstoječim if ($last) { $query = sisplet_query("UPDATE srv_hierarhija_struktura_users SET user_id='" . $user_id . "' WHERE hierarhija_struktura_id='" . $struktura_id . "'"); } else { $query = sisplet_query("INSERT INTO srv_hierarhija_struktura_users (hierarhija_struktura_id, user_id) VALUES ('" . $struktura_id . "', '" . $user_id . "')"); } if (!$query) echo mysqli_error($GLOBALS['connect_db']); // Preverimo, če je uporabnik že dodan in če ni ga nato šele dodamo $user_search = sisplet_query("SELECT * FROM srv_hierarhija_users WHERE user_id='" . $user_id . "' AND anketa_id='$this->anketa'"); if ($user_search->num_rows == 0) { $user_query = sisplet_query("INSERT INTO srv_hierarhija_users (user_id, anketa_id, type) VALUES ('" . $user_id . "', '" . $this->anketa . "', 10)"); if (!$user_query) echo mysqli_error($GLOBALS['connect_db']); } // Preverimo, če ima uporabnik za omenjeno anketo že pravice in mu nato dodamo pravice HierarhijaQuery::dostopZaUporabnika($this->anketa, $user_id, 'insert'); } } /** * Pridobi vse uporabnike za določen nivo * uporablja se prid DataTables edit mode, da izpiše uporabnike pod vsak nivo * * @var $id - struktura id * @return $array */ public function pridobiUporabnikeZaDolocenNivoId() { // id strukture, da preverimo kateri uporabnikise nahajajo na omenjeni strukturi $id = $_POST['id']; $uporabniki = (new HierarhijaQuery())->pridobiVseUporabnikeZaSpecificnoStrukturo($id); if (!is_array($uporabniki) || sizeof($uporabniki) == 0) return 0; //Preverimo max število nivojev/ravni za omenjeno anketo $max_level = sisplet_query("SELECT MAX(level) AS level FROM srv_hierarhija_ravni WHERE anketa_id='" . $this->anketa . "'")->fetch_object()->level; return [ 'uporabniki' => $uporabniki, 'maxLevel' => $max_level ]; } /** * Shrani uporabnike na določen nivo strukture - pri DataTables edit mode */ public function postUporabnikeZaDolocenNivoId() { // tracking - beleženje sprememb $this->trackingChanges(); $uporabniki = json_decode(stripslashes($_POST['uporabniki'])); $struktura_id = $_POST['struktura']; if (sizeof($uporabniki) == 0) return 'uporabnik'; // pobrišemo vse že dodane uporabnike sisplet_query("DELETE FROM srv_hierarhija_struktura_users WHERE hierarhija_struktura_id='" . $struktura_id . "'"); // vpišemo nove uporabnike foreach ($uporabniki as $uporabnik) { sisplet_query("INSERT INTO srv_hierarhija_struktura_users (hierarhija_struktura_id, user_id) VALUES ('" . $struktura_id . "', '" . $uporabnik . "')"); } } /** * Prikaži popup za vnos uporabnikov * * @return html */ public function getUsersImportPopup(){ // tracking - beleženje sprememb $this->trackingChanges(); echo '