981 lines
36 KiB
PHP
981 lines
36 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Avtor: Robert Šmalc
|
|
* Date: 8/20/15
|
|
*/
|
|
|
|
namespace Hierarhija\Model;
|
|
|
|
use Hierarhija\Hierarhija;
|
|
use Hierarhija\HierarhijaHelper;
|
|
|
|
class HierarhijaQuery
|
|
{
|
|
|
|
/**
|
|
* Pridobimo vse nivoje ravno za trenutno anketo
|
|
*
|
|
* @param string $anketa - ID ankete
|
|
* @param string $id - izbrane ravni
|
|
* @return SLQ results or NULL
|
|
*/
|
|
protected $anketa;
|
|
protected $id;
|
|
protected $max_struktura;
|
|
|
|
public static function getRavniAdmin($anketa, $id = null)
|
|
{
|
|
|
|
$sql = "SELECT * FROM srv_hierarhija_ravni WHERE anketa_id='" . $anketa . "'";
|
|
if (!is_null($id)) {
|
|
$sql .= " AND id='" . $id . "'";
|
|
} else {
|
|
$sql .= "ORDER BY level";
|
|
}
|
|
$sql1 = sisplet_query($sql);
|
|
$results = null;
|
|
if (!empty($sql1) && mysqli_num_rows($sql1) > 0)
|
|
$results = $sql1;
|
|
|
|
return $results;
|
|
}
|
|
|
|
/**
|
|
* Pridobimo vse sifrante za trenutno anketo
|
|
*
|
|
* @param string $anketa - ID ankete
|
|
* @param integer $max_struktura - do katerega nivoja je struktura že vnešena
|
|
* @return SLQ results or NULL
|
|
*/
|
|
public function getSifrantAdmin($anketa, $max_struktura = 999, $user_level = 0)
|
|
{
|
|
$sql_ravni = sisplet_query("SELECT * FROM srv_hierarhija_ravni WHERE anketa_id='" . $anketa . "' ORDER BY level");
|
|
$sql_sifra = sisplet_query("
|
|
SELECT
|
|
hs.id AS id,
|
|
hr.level AS level,
|
|
hs.ime AS sifrant
|
|
FROM srv_hierarhija_ravni AS hr
|
|
LEFT JOIN
|
|
srv_hierarhija_sifranti AS hs ON hr.id = hs.hierarhija_ravni_id
|
|
WHERE anketa_id='$anketa' AND hr.level > '" . $user_level . "'
|
|
ORDER BY hr.level, hs.ime
|
|
");
|
|
|
|
$results = null;
|
|
if (!empty($sql_ravni) && mysqli_num_rows($sql_ravni) > 0) {
|
|
while ($nivoObj = mysqli_fetch_object($sql_ravni)) {
|
|
//v kolikor pri izgradnji strukture še nimamo nobenega podatka potem ponudimo samo 1.nivo
|
|
if ($nivoObj->level <= ($max_struktura + 1) || $nivoObj->level == 1) {
|
|
$results['nivoji'][] = [
|
|
'id' => (int)$nivoObj->id,
|
|
'level' => $nivoObj->level,
|
|
'ime' => $nivoObj->ime,
|
|
'unikaten' => $nivoObj->unikaten
|
|
];
|
|
}
|
|
|
|
}
|
|
while ($sifraObj = mysqli_fetch_object($sql_sifra)) {
|
|
$results['sifranti'][] = [
|
|
'id' => (int)$sifraObj->id,
|
|
'level' => $sifraObj->level,
|
|
'sifrant' => $sifraObj->sifrant
|
|
];
|
|
}
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
|
|
/**
|
|
* Pridobimo ravni, šifrante in strukturo HIERARHIJE, ki jo je že vnesel uporabnik
|
|
*
|
|
* @param string $anketa
|
|
* @return array query
|
|
*/
|
|
public function getSifrantHierarhija($anketa)
|
|
{
|
|
$results['struktura'] = (new HierarhijaOnlyQuery())->queryStruktura($anketa)->fetch_object();
|
|
$max_struktura = (new HierarhijaOnlyQuery())->queryStruktura($anketa, ', MAX(str.level) AS max_level')->fetch_object()->max_level;
|
|
|
|
$results = $this->getSifrantAdmin($anketa, $max_struktura);
|
|
|
|
return $results;
|
|
}
|
|
|
|
/**
|
|
* INSERT - srv_Spremenljivka in srv_branching
|
|
*
|
|
* @param (array) $spremenljivka
|
|
* @param (int) $anketa
|
|
* @return
|
|
*/
|
|
protected $spremenljivka;
|
|
protected $sql_sifra;
|
|
protected $spremenljivka_id;
|
|
|
|
public function insertSpremenljivkaBranching($spremenljivka, $sql_sifra, $anketa, $vloga = null)
|
|
{
|
|
if (is_array($spremenljivka)) {
|
|
$st_vrednosti = (is_null($sql_sifra) ? '2' : $sql_sifra->num_rows);
|
|
|
|
// V kolikor je vloga potem je vprašanje zaklenjeno
|
|
$locked = (!empty($vloga) ? 1 : 0);
|
|
|
|
$this->spremenljivka_id = sisplet_query("INSERT INTO
|
|
srv_spremenljivka
|
|
(id, gru_id, naslov, variable, variable_custom, size, tip, vrstni_red, visible, sistem, locked)
|
|
VALUES
|
|
('', '$spremenljivka[0]', '$spremenljivka[1]', '$spremenljivka[2]', '1', '$st_vrednosti', '1', '$spremenljivka[4]', '0', '1', '$locked')
|
|
", "id");
|
|
|
|
}
|
|
|
|
//vstavimoe v branching vse nivoje
|
|
if (is_array($spremenljivka) && $anketa) {
|
|
$sql_branching = sisplet_query("INSERT INTO srv_branching (ank_id, parent, element_spr, element_if, vrstni_red, pagebreak) VALUES ('$anketa', 0, '" . $this->spremenljivka_id . "', 0, '$spremenljivka[4]', 0)");
|
|
$this->sqlError($sql_branching);
|
|
}
|
|
|
|
if (!empty($sql_sifra) && !empty($this->spremenljivka_id) && is_null($vloga))
|
|
$this->insertVrednost($sql_sifra);
|
|
|
|
if (!empty($this->spremenljivka_id) && !is_null($vloga))
|
|
$this->insertVrednost(null, $vloga);
|
|
|
|
}
|
|
|
|
/**
|
|
* INSERT - srv_vrednost odogovore za sledečo spremenljivko
|
|
*
|
|
* @param (array) $vrednost
|
|
* @return
|
|
*/
|
|
protected $vrednost;
|
|
|
|
public function insertVrednost($vrednost, $vloga = null)
|
|
{
|
|
if (!is_null($vrednost)) {
|
|
$vrstni_red_sifre = 1;
|
|
while ($sifrant = $vrednost->fetch_object()) {
|
|
$vrednost_id = sisplet_query("INSERT INTO srv_vrednost (id, spr_id, naslov, variable, vrstni_red) VALUES ('', '$this->spremenljivka_id', '$sifrant->ime', '$vrstni_red_sifre', '$vrstni_red_sifre')", "id");
|
|
|
|
//vpišemo šifrante in vrednosti odgovorov v pivot tabelo za lažje generiranje URL naslovov
|
|
$sql_pivot = sisplet_query("INSERT INTO srv_hierarhija_sifrant_vrednost (sifrant_id, vrednost_id) VALUES ($sifrant->id, $vrednost_id)");
|
|
$this->sqlError($sql_pivot);
|
|
|
|
$vrstni_red_sifre++;
|
|
}
|
|
} elseif ($vloga == 1) {
|
|
$vrstni_red_sifre = 1;
|
|
$vloga = ['učenec', 'učitelj'];
|
|
foreach ($vloga as $row) {
|
|
$sql_vrednost = sisplet_query("INSERT INTO srv_vrednost (id, spr_id, naslov, variable, vrstni_red) VALUES ('', '$this->spremenljivka_id', '$row', '$vrstni_red_sifre', '$vrstni_red_sifre')");
|
|
$this->sqlError($sql_vrednost);
|
|
$vrstni_red_sifre++;
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Vreno celotno drevesno strukturo za userja v hierarhiji
|
|
*
|
|
* @param (int) $anketa
|
|
* @return (array)
|
|
*/
|
|
|
|
|
|
public function pridobiHierarhijoNavzgor($anketa, $odgovori = null, $user = null)
|
|
{
|
|
global $global_user_id;
|
|
|
|
if (is_null($user))
|
|
$user = $global_user_id;
|
|
|
|
$sql_str = (new HierarhijaOnlyQuery())->queryStrukturaUsersOnlyId($anketa, $user);
|
|
$this->sqlError($sql_str);
|
|
|
|
# pridobimo tudi ID strukture hierarhije, da lahko kasneje pridobimo drevesno strukturo celotnega drevesa in vsak id strukture damo v polje, ker bomo poiskali vso strukturo
|
|
## V kolikor bi učitelj izvajal samoevalvacijo za dva predmeta
|
|
while ($obj = $sql_str->fetch_object()) {
|
|
$id_nivojev[] = $obj->struktur_id;
|
|
}
|
|
|
|
if (is_null($id_nivojev))
|
|
return null;
|
|
|
|
# gremo po vseh id-jih strukture in pridobimo strukturo navzgor
|
|
foreach ($id_nivojev as $nivo) {
|
|
$id = $nivo;
|
|
|
|
## v koliko imamo ID strukture potem naredimo zanko in preverimo parent_id, ter ID strukture napolnimo v polje
|
|
while (!is_null($id)) {
|
|
$row = (new HierarhijaOnlyQuery())->queryStruktura($anketa, null, ' AND str.id=' . $id)->fetch_object();
|
|
|
|
if (!is_null($odgovori) && $odgovori == TRUE) {
|
|
|
|
$st_odgovora = sisplet_query("
|
|
SELECT
|
|
sv.vrednost_id AS vrednost_id,
|
|
v.variable AS variable
|
|
FROM
|
|
srv_hierarhija_sifrant_vrednost as sv
|
|
LEFT JOIN
|
|
srv_vrednost as v ON sv.vrednost_id = v.id
|
|
WHERE
|
|
sv.sifrant_id='$row->sifrant_id'
|
|
");
|
|
|
|
$hiearhija[$nivo][] = [
|
|
'nivo' => 'nivo' . $row->level,
|
|
'id' => $row->sifrant_id,
|
|
'st_odgovora' => $st_odgovora->fetch_array()['variable']
|
|
];
|
|
} else {
|
|
$hiearhija[$nivo][] = [
|
|
'nivo' => 'nivo' . $row->level,
|
|
'id' => $row->sifrant_id
|
|
];
|
|
}
|
|
$id = $row->parent_id;
|
|
}
|
|
}
|
|
|
|
return $hiearhija;
|
|
}
|
|
|
|
public static function posodobiSifranteVrednostiGledeNaTrenutenIdStrukture($id)
|
|
{
|
|
while (!is_null($id)) {
|
|
$row = sisplet_query("SELECT * FROM srv_hierarhija_struktura WHERE id='$id' ORDER BY level");
|
|
$row = $row->fetch_object();
|
|
|
|
$hiearhija[$row->level] = [
|
|
'id' => $id,
|
|
'id_sifranta' => $row->hierarhija_sifranti_id,
|
|
'select' => $row->level . '-' . $row->hierarhija_sifranti_id,
|
|
'hierarhija_ravni_id' => $row->hierarhija_ravni_id
|
|
];
|
|
|
|
$id = $row->parent_id;
|
|
}
|
|
|
|
return $hiearhija;
|
|
}
|
|
|
|
/**
|
|
* Funkcija poišče v PIVOT tabeli srv_hierarhija_sifrant_vrednost vrednost_id
|
|
*
|
|
* @param (int) $sifrant_id
|
|
* @return (int) vrednost_id
|
|
*/
|
|
|
|
protected $sifrant_id;
|
|
|
|
public function getVrednostIdFromPivot($sifrant_id)
|
|
{
|
|
$sql = sisplet_query("SELECT * FROM srv_hierarhija_sifrant_vrednost WHERE sifrant_id='$sifrant_id'");
|
|
|
|
if (!empty($sql))
|
|
return $sql->fetch_object()->vrednost_id;
|
|
}
|
|
|
|
/**
|
|
* Pridobimo ID vseh struktur, ki je pod določeno strukturi, ker bomo tudi te strukture brisali
|
|
*
|
|
* @param (int) $anketa_id
|
|
* @param (int) $id - strukture
|
|
* @return (array) $this->element
|
|
*/
|
|
public function pridobiIdStruktureDoKonca($id, $anketa_id)
|
|
{
|
|
|
|
if (!isset($this->element) || !is_array($this->element))
|
|
$this->element = array();
|
|
|
|
$sql_id = sisplet_query("SELECT * FROM srv_hierarhija_struktura WHERE parent_id='$id' AND anketa_id='$anketa_id'");
|
|
$this->sqlError($sql_id);
|
|
|
|
if ($sql_id->num_rows > 0) {
|
|
while ($obj = $sql_id->fetch_object()) {
|
|
if (!isset($element) || !in_array($obj->id, $element)) {
|
|
$this->element[] = $obj->id;
|
|
$this->pridobiIdStruktureDoKonca($obj->id, $anketa_id);
|
|
}
|
|
}
|
|
}
|
|
|
|
return $this->element;
|
|
}
|
|
|
|
/**
|
|
* Shrani ali posodobi dodatno opcijo pri hierarhiji - nastavitve
|
|
*/
|
|
public function saveHierarhijaOptions($anketa_id, $option, $value, $id = null)
|
|
{
|
|
if (is_null($id)) {
|
|
$ce_obstaja_id = $this->getRowOptions($anketa_id, $option);
|
|
if (!empty($ce_obstaja_id->id))
|
|
$id = $ce_obstaja_id->id;
|
|
}
|
|
|
|
if (is_null($id)) {
|
|
$sql = sisplet_query("INSERT INTO srv_hierarhija_options (anketa_id, option_name, option_value) VALUES ('" . $anketa_id . "', '" . $option . "', '" . $value . "')");
|
|
} else {
|
|
$sql = sisplet_query("UPDATE srv_hierarhija_options SET option_value='" . $value . "' WHERE anketa_id='" . $anketa_id . "' AND id='" . $id . "'");
|
|
}
|
|
|
|
$this->sqlError($sql);
|
|
}
|
|
|
|
/**
|
|
* get ali delete dodatnih opcij
|
|
*/
|
|
public function getDeleteHierarhijaOptions($anketa_id, $option = null, $id = null, $delete = null, $json = true)
|
|
{
|
|
if (is_null($option) && is_null($id) && is_null($delete)) {
|
|
$sql = sisplet_query("SELECT * FROM srv_hierarhija_options WHERE anketa_id='" . $anketa_id . "'");
|
|
} elseif (is_null($delete)) {
|
|
if (!empty($anketa_id) && !empty($option))
|
|
$sql = sisplet_query("SELECT * FROM srv_hierarhija_options WHERE anketa_id='" . $anketa_id . "' AND option_name='" . $option . "'");
|
|
|
|
if (!is_null($id))
|
|
$sql = sisplet_query("SELECT * FROM srv_hierarhija_options WHERE id='" . $id . "'");
|
|
|
|
} else {
|
|
if (!empty($anketa_id) && !empty($option) && !is_null($delete))
|
|
$sql = sisplet_query("DELETE FROM srv_hierarhija_options WHERE anketa_id='" . $anketa_id . "' AND option_name='" . $option . "'");
|
|
|
|
if (!is_null($id) && !is_null($delete))
|
|
$sql = sisplet_query("DELETE FROM srv_hierarhija_options WHERE id='" . $id . "'");
|
|
|
|
$this->sqlError($sql);
|
|
return '';
|
|
}
|
|
$this->sqlError($sql);
|
|
|
|
$data = array();
|
|
if ($sql->num_rows > 0) {
|
|
while ($row = $sql->fetch_object()) {
|
|
$data[$row->option_name] = $row->option_value;
|
|
}
|
|
}
|
|
|
|
if (!$json && is_null($option)) {
|
|
return $data;
|
|
} elseif (!$json && !is_null($option)) {
|
|
return $data[$option];
|
|
}
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
/**
|
|
* Pridobimo opcijo, ki jo iščemo ali želimo
|
|
*
|
|
* @param (int) $anketa
|
|
* @param (string) $option
|
|
* @return string | value;
|
|
*/
|
|
public static function getOptions($anketa, $option)
|
|
{
|
|
return (new HierarhijaQuery())->getDeleteHierarhijaOptions($anketa, $option, null, null, false);
|
|
}
|
|
|
|
/**
|
|
* Shranimo opcijo hierarhije - bližnica
|
|
*
|
|
* @param (int) $anketa
|
|
* @param (string) $option
|
|
* @param (string) $value
|
|
* @return string | value;
|
|
*/
|
|
public static function saveOptions($anketa, $option, $value)
|
|
{
|
|
return (new HierarhijaQuery())->saveHierarhijaOptions($anketa, $option, $value);
|
|
}
|
|
|
|
|
|
/**
|
|
* Preverimo, komu vse pošljemo kode (učencem, učitelju ali nobenemu)
|
|
*
|
|
* @param int $anketa
|
|
* @return null || string
|
|
*/
|
|
|
|
public static function getOptionsPosljiKode($anketa)
|
|
{
|
|
$poslji = null;
|
|
|
|
if (!empty(self::getOptions($anketa, 'ne_poslji_kode_ucencem')))
|
|
$poslji[] = 'ucitelju';
|
|
|
|
if (!empty(self::getOptions($anketa, 'ne_poslji_kodo_ucitelju')))
|
|
$poslji[] = 'ucencem';
|
|
|
|
if (is_null($poslji))
|
|
return 'vsem';
|
|
|
|
if (sizeof($poslji) == 1)
|
|
return $poslji[0];
|
|
|
|
return 'nikomur';
|
|
}
|
|
|
|
public function getRowOptions($anketa_id, $option, $id = null)
|
|
{
|
|
if (is_null($id))
|
|
$sql = sisplet_query("SELECT * FROM srv_hierarhija_options WHERE anketa_id='" . $anketa_id . "' AND option_name='" . $option . "'");
|
|
|
|
if (!is_null($id))
|
|
$sql = sisplet_query("SELECT * FROM srv_hierarhija_options WHERE id='" . $id . "'");
|
|
|
|
$this->sqlError($sql);
|
|
|
|
if ($sql->num_rows > 0)
|
|
return $sql->fetch_object();
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Vnre polje vse strukture z imeni, ter tudi email naslove, ki so dodane določeni strukturi
|
|
*/
|
|
public function json_jstree($anketa, $array = null)
|
|
{
|
|
global $global_user_id;
|
|
$hierarhija_type = (!empty($_SESSION['hierarhija'][$this->anketa]['type']) ? $_SESSION['hierarhija'][$this->anketa]['type'] : null);
|
|
|
|
$user_level = HierarhijaOnlyQuery::queryStrukturaUsersLevel($anketa, $global_user_id);
|
|
|
|
//vpisan kot super_admin in ima dostop do celotne hierarhije
|
|
if ($hierarhija_type < 5) {
|
|
$hierarhija = (new HierarhijaOnlyQuery())->queryStruktura($anketa);
|
|
} elseif ($user_level->num_rows > 0) { //preverimo, če je uporabnik že kje vpisan v hierarhiji in na kateri nivo - level
|
|
while ($obj = $user_level->fetch_object()) {
|
|
//dodamo id v array, ker le tako lahko zgradimo drevo za ustreznega uporabnika, ki nima vpogleda v celotno strukturo
|
|
$hierarhija_drevo[] = $obj->struktura_id;
|
|
$hierarhija_drevo[] = $obj->parent_id;
|
|
|
|
//pridobimo hierarhijo navzgor
|
|
$hierarhija_navzgor = HierarhijaQuery::posodobiSifranteVrednostiGledeNaTrenutenIdStrukture($obj->struktura_id);
|
|
foreach ($hierarhija_navzgor as $n) {
|
|
$hierarhija_drevo[] = $n['id']; //vse id,je strukture vnesemo v polje, kjer bomo nato preverjali, če obstaja
|
|
}
|
|
}
|
|
|
|
// Pridobimo celotno strukturo hierarhije tudi za elemente, ki jih kasneje ne izpišemo
|
|
$hierarhija = (new HierarhijaOnlyQuery())->queryStruktura($anketa, null, ' AND hr.level>1');
|
|
|
|
}
|
|
|
|
//pridobimo podate o uporabnikih - email in ne prikazujemo uporabnika, ki je višje v hierarhiji od dejansko prijavljenega uporabnika
|
|
$users = (new HierarhijaOnlyQuery())->queryStrukturaUsersGroupBy($anketa);
|
|
$user_level = null;
|
|
while ($row = $users->fetch_assoc()) {
|
|
## Pridobimo uporabnika na največjem možnem nivoju
|
|
if ($global_user_id == $row['user_id'] && (is_null($user_level) || $user_level > $row['level']))
|
|
$user_level = $row['level'];
|
|
|
|
## Ko imamo določen nivo uporabnika, potem pod njemu pridobimo vse ostale uporabnike, ki jih omenjen uporabnik lahko vidi
|
|
if (!is_null($user_level) && $row['level'] >= $user_level)
|
|
$hierarhija_users[] = $row;
|
|
|
|
## V kolikor gre za administratorja ankete
|
|
if ($hierarhija_type < 5)
|
|
$hierarhija_users[] = $row;
|
|
}
|
|
|
|
# V kolikor imamo polje hierarhije z ID-ji pridobljenimi za hierarhijo navzgor
|
|
if (!is_null($hierarhija_drevo)) {
|
|
while ($obj = $hierarhija->fetch_object()) {
|
|
$up = null;
|
|
foreach ($hierarhija_users as $user) {
|
|
if ($obj->id == $user['id'])
|
|
$up = $user['uporabniki'];
|
|
}
|
|
|
|
## Če se id strukture ujema z uporabnikovo hierarhijo
|
|
## Če se trenutni nivo/level strukture ujema z uporabnikov, potem od tega nivoja naprej izpišemo celotno strukturo
|
|
if (in_array($obj->id, $hierarhija_drevo) || ($obj->ravni_level > $user_level && in_array($obj->parent_id, $hierarhija_drevo))) {
|
|
$hierarhija_drevo[] = $obj->parent_id;
|
|
$hierarhija_drevo[] = $obj->id;
|
|
|
|
$struktura[] = [
|
|
'id' => $obj->id,
|
|
'parent' => ((is_null($obj->parent_id) || $obj->ravni_level == 2) ? '#' : $obj->parent_id),
|
|
"text" => $obj->sifrant_ime . (!is_null($up) ? " - (" . $up . ")" : null)
|
|
];
|
|
}
|
|
}
|
|
|
|
#Izpišemo celotno hierarhijo za admin uporabnika
|
|
} elseif ($hierarhija_type < 5) {
|
|
while ($obj = $hierarhija->fetch_object()) {
|
|
$up = null;
|
|
|
|
//preverimo, če so uporabniki v hierarhiji
|
|
if (!empty($hierarhija_users)) {
|
|
foreach ($hierarhija_users as $user) {
|
|
if ($obj->id == $user['id'])
|
|
$up = $user['uporabniki'];
|
|
}
|
|
}
|
|
|
|
$struktura[] = [
|
|
'id' => $obj->id,
|
|
'parent' => (is_null($obj->parent_id) ? '#' : $obj->parent_id),
|
|
'text' => $obj->sifrant_ime . (!is_null($up) ? " - (" . $up . ")" : null)
|
|
];
|
|
|
|
// v kolikor na gre ja jstree potem potrebujemo tudi številko levela za nadaljne operacije
|
|
if (!is_null($array)) {
|
|
end($struktura);
|
|
$key = key($struktura);
|
|
$struktura[$key]['level'] = $obj->level;
|
|
}
|
|
|
|
}
|
|
}
|
|
return $struktura;
|
|
}
|
|
|
|
/**
|
|
* SqL poizvedba, kjer pridobimo celotno strukturo in izdela polje, kjer nato pripravimo polje za vpis v Datatables
|
|
*
|
|
* @param $anketa
|
|
* @return array
|
|
*/
|
|
public function hierarhijaArrayDataTables($anketa, $vpisani = null, $csv = false)
|
|
{
|
|
$this->anketa = $anketa;
|
|
|
|
$sql_vsa_hierarhija = (new HierarhijaOnlyQuery())->queryStruktura($anketa);
|
|
|
|
// Izdelamo polje iz sql poizvedbe, da bomo v nadaljevanju izdelali vgnezdeno polje
|
|
$struktura = [];
|
|
while ($obj = $sql_vsa_hierarhija->fetch_object()) {
|
|
// V kolikor ima strukturo že od prej vpisanih elementov, potem na tistem nivoju vpišemo samo ID strukture in vse ostale odstranimo
|
|
if (empty($vpisani[$obj->level - 1]) || $vpisani[$obj->level - 1]['izbrani']['id'] == $obj->id) {
|
|
$struktura[] = [
|
|
'id' => $obj->id,
|
|
'parent_id' => (is_null($obj->parent_id) ? 0 : $obj->parent_id),
|
|
'name' => $obj->sifrant_ime,
|
|
'level' => $obj->level
|
|
];
|
|
}
|
|
}
|
|
|
|
// Pridobimo max število nivojev
|
|
$max_st = (new HierarhijaOnlyQuery())->getRavni($anketa, 'MAX(level) AS max_level')->fetch_object()->max_level;
|
|
|
|
return $this->izdelajVrsticeStrukture($struktura, $max_st, 0, [], $csv);
|
|
}
|
|
|
|
/**
|
|
* Iz polja celotne strukture naredimo vrstice za vpis v Datatables
|
|
*
|
|
* @param $elements - polje celotne strukture
|
|
* @param $parentId
|
|
* @param $polje - polje ene vrstice strukture, kjer elemente preneašamo napraj, da jih na koncu zapišemo kot vrstica v tabeli
|
|
* @param $max_st - maksimalno število nivojev, potrebno za generiranje praznih polj
|
|
* @return array
|
|
*/
|
|
|
|
protected $skupno_polje = [];
|
|
|
|
protected function izdelajVrsticeStrukture(array $elements, $max_st = 1, $parentId = 0, $polje = [], $csv = false)
|
|
{
|
|
global $lang;
|
|
|
|
foreach ($elements as $key => $element) {
|
|
// Najprej poiščemoprvi nivo
|
|
if ($element['parent_id'] == $parentId) {
|
|
// Preveri, če obstaja uporabnik za omenjeno polje
|
|
$db_user = (new HierarhijaOnlyQuery())->queryStrukturaUsersGroupBy($this->anketa, ' AND hs.id="' . $element['id'] . '"');
|
|
|
|
$uporabniki = null;
|
|
if ($db_user->num_rows > 0)
|
|
$uporabniki = '<br />(' . $db_user->fetch_object()->uporabniki . ')';
|
|
|
|
$zacasno_polje = $polje;
|
|
array_push($zacasno_polje, array(
|
|
'id' => $element['id'],
|
|
'level' => $element['level'],
|
|
'label' => $element['name'] . ((!$csv && !empty($uporabniki)) ? '<span style="color:#ffa608;">' . $uporabniki . '</span>' : ' ' . $uporabniki)
|
|
));
|
|
|
|
// Rekurzivno gremo po vseh elementih do zadnjega, da pridobimo strukturo
|
|
$zadnji_element = $this->izdelajVrsticeStrukture($elements, $max_st, $element['id'], $zacasno_polje, $csv);
|
|
|
|
// V kolikor smo prišli do zadnjega elementa potem vpišemo v spremenljivko $this->skupno_polje
|
|
if ($zadnji_element == 0) {
|
|
|
|
// Preverimo koliko elementov smo že vpisali od vseh
|
|
// Kjer še niso vpisani vpišemo NULL, ker DataTables potrebuje vedeti število vseh nivojev
|
|
if (sizeof($zacasno_polje) < $max_st && !$csv) {
|
|
for ($i = sizeof($zacasno_polje); $i < ($max_st - 1); $i++) {
|
|
array_push($zacasno_polje, null);
|
|
}
|
|
|
|
// Na zadnji nivo vpišemo klicaj, v kolikor še ni dodan predmet in učitelj
|
|
array_push($zacasno_polje, array(
|
|
'label' => '<span style="color:#fa4913; font-style: italic;">Manjka zadnji nivo</span><a href="/" id="help_srv_hierarhy_last_level_missing" lang="' . $lang['id'] . '" class="help" onclick="return false;" title_txt="' . $lang['help'] . '" style="color:#fa4913; font-weight: bold;float: right;padding: 0 30px;cursor: pointer;">
|
|
(!)
|
|
</a>'
|
|
));
|
|
}
|
|
|
|
// Dodamo še gumbe
|
|
if (!$csv) {
|
|
$gumbi = '<span data-id="' . $element['id'] . '" class="ikona ikona-uporabniki" onclick="urediVrsticoHierarhije(' . $element['id'] . ')"></span>
|
|
<span data-id="' . $element['id'] . '" class="ikona ikona-kopiraj" onclick="kopirajVrsticoHierarhije(' . $element['id'] . ')"></span>
|
|
<span data-id="' . $element['id'] . '" class="ikona ikona-brisi" onclick="pobrisiVrsticoHierarhije(' . $element['id'] . ', 1)"></span>';
|
|
|
|
array_push($zacasno_polje, array(
|
|
'label' => $gumbi
|
|
));
|
|
}
|
|
|
|
|
|
$this->skupno_polje[] = $zacasno_polje;
|
|
}
|
|
}
|
|
}
|
|
|
|
// V kolior ni bilo nobenega elementa vpisanov $začano polje, potem smo prišli do konca drevesne strukture in vrnemo nič
|
|
if (is_null($zacasno_polje))
|
|
return 0;
|
|
|
|
return $this->skupno_polje;
|
|
}
|
|
|
|
/**
|
|
* Pridobi vse uporabnike za točno določeno strukturo in pripadajoče ID-je, da se jih lahko odstrani
|
|
*
|
|
* @param $id - struktura_id
|
|
* @return (array) $izbran_uporabnik
|
|
*/
|
|
public function pridobiVseUporabnikeZaSpecificnoStrukturo($id)
|
|
{
|
|
$sql_izbrani_uporabniki = sisplet_query("SELECT
|
|
u.id as id,
|
|
u.email as email,
|
|
u.name as name,
|
|
u.surname as surname
|
|
FROM
|
|
srv_hierarhija_struktura_users AS stu
|
|
LEFT JOIN
|
|
users AS u ON u.id = stu.user_id
|
|
WHERE
|
|
hierarhija_struktura_id='" . $id . "'");
|
|
|
|
$izbran_uporabnik = array();
|
|
if ($sql_izbrani_uporabniki->num_rows > 0) {
|
|
while ($row = $sql_izbrani_uporabniki->fetch_object()) {
|
|
$uporabnik = $row->email;
|
|
|
|
// V kolikor obstaja ime in priimek potem tudi to dodamo poleg emaila
|
|
if ($row->email != $row->name || $row->email != $row->surname)
|
|
$uporabnik .= ' (' . $row->name . ' ' . $row->surname . ')';
|
|
|
|
$izbran_uporabnik[] = array(
|
|
'id' => $row->id,
|
|
'uporabnik' => $uporabnik
|
|
);
|
|
}
|
|
}
|
|
|
|
return $izbran_uporabnik;
|
|
}
|
|
|
|
/**
|
|
* Pridobi pravice uporabnika za sledečo anketo (v katerem nivoju se nahaja najvišje)
|
|
* @return object (level, struktura_id, parent_id)
|
|
*/
|
|
public function preveriPravicoUporabnika($anketa_id)
|
|
{
|
|
global $global_user_id;
|
|
$hierarhija_type = (!empty($_SESSION['hierarhija'][$this->anketa]['type']) ? $_SESSION['hierarhija'][$this->anketa]['type'] : null);
|
|
|
|
// tukaj gre za admina in vrnemo samo to
|
|
if ($hierarhija_type < 5)
|
|
return ['uporabnik' => 1];
|
|
|
|
$sql_user = HierarhijaOnlyQuery::queryStrukturaUsersLevel($anketa_id, $global_user_id);
|
|
|
|
return $sql_user->fetch_object();
|
|
}
|
|
|
|
/**
|
|
* Poiščemo hierarhijo od tu navzgor in pridobimo vse ID vrednosti struktur
|
|
* @return array
|
|
*/
|
|
|
|
public function poisciHierarhijoNavzgor($id, $polje = array())
|
|
{
|
|
// Ko pridemo na vrh potem sortiramo od 1. nivoja navzdol
|
|
if (is_null($id)) {
|
|
$polje = array_reverse($polje);
|
|
return $polje;
|
|
}
|
|
|
|
|
|
$sql_ravni = sisplet_query("SELECT id, parent_id, level, hierarhija_sifranti_id, hierarhija_ravni_id FROM srv_hierarhija_struktura WHERE id='" . $id . "'");
|
|
while ($row = $sql_ravni->fetch_object()) {
|
|
// Pridobimo še ime omenjenega šifranta
|
|
$ime = (new HierarhijaOnlyQuery())->getSamoSifrant($row->hierarhija_sifranti_id, true)->fetch_object()->ime;
|
|
|
|
$polje[] = [
|
|
'ime' => $ime,
|
|
'izbrani' => [
|
|
'id' => $row->id,
|
|
'level' => $row->level,
|
|
'hierarhija_sifranti_id' => $row->hierarhija_sifranti_id,
|
|
'hierarhija_ravni_id' => $row->hierarhija_ravni_id,
|
|
'parent_id' => $row->parent_id
|
|
]
|
|
];
|
|
|
|
$id = $row->parent_id;
|
|
}
|
|
|
|
return $this->poisciHierarhijoNavzgor($id, $polje);
|
|
}
|
|
|
|
/**
|
|
* Pridobimo podate o uporabniku
|
|
*
|
|
* @param (int) $id
|
|
* @return object
|
|
*/
|
|
public static function getUserSurvey($id = null)
|
|
{
|
|
if (is_null($id)) {
|
|
global $global_user_id;
|
|
$id = $global_user_id;
|
|
}
|
|
|
|
$user_db = sisplet_query("SELECT * FROM users WHERE id = '" . $id . "'", "obj");
|
|
|
|
if (!is_null($user_db))
|
|
return $user_db;
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Pridobi podatek iz tabele
|
|
*
|
|
* @param (string) $table
|
|
* @param (string) $row - ime stolpca
|
|
* @return array or value
|
|
*/
|
|
public static function getHierarhijaShraniRow($id, $col = false)
|
|
{
|
|
$sql = sisplet_query('SELECT * FROM srv_hierarhija_shrani WHERE id="' . $id . '"');
|
|
if ($sql->num_rows == 0)
|
|
return null;
|
|
|
|
$polje = [];
|
|
while ($obj = $sql->fetch_assoc()) {
|
|
$polje = $obj;
|
|
}
|
|
|
|
if ($col)
|
|
return $polje[$col];
|
|
|
|
return $polje;
|
|
}
|
|
|
|
/**
|
|
* Vpiši podatke v tabelo
|
|
*
|
|
* @param (array) $array
|
|
*/
|
|
public function saveHierarhijaShraniRow($array)
|
|
{
|
|
$sql = sisplet_query('SELECT * FROM srv_hierarhija_shrani WHERE id="' . $id . '"');
|
|
if ($sql->num_rows == 0)
|
|
return null;
|
|
|
|
$polje = [];
|
|
while ($obj = $sql->fetch_assoc()) {
|
|
$polje = $obj;
|
|
}
|
|
|
|
if ($col)
|
|
return $polje[$col];
|
|
|
|
return $polje;
|
|
}
|
|
|
|
/**
|
|
* Prteveri branching, če imamo kako spremenljivko
|
|
*
|
|
* @param int $anketa
|
|
* @return string || int
|
|
*/
|
|
public static function preveriBranchingCeJeKakoVprasanje($anketa)
|
|
{
|
|
$branching = sisplet_query("SELECT ank_id, element_spr FROM srv_branching WHERE ank_id='" . $anketa . "'", "obj");
|
|
|
|
// Nimamo še nobenega vprašanja
|
|
if (is_null($branching) || sizeof($branching) == 0)
|
|
return 1;
|
|
|
|
// preverimo tip vprašanja
|
|
if (is_array($branching)) {
|
|
$vsi_tipi_vprasanj = [];
|
|
foreach ($branching as $row) {
|
|
$element = sisplet_query("SELECT id, tip, variable FROM srv_spremenljivka WHERE id='" . $row->element_spr . "'", "obj");
|
|
// hierarhije je že bila aktivirana na obstoječi anketi
|
|
if ($element->variable == 'vloga')
|
|
return '9';
|
|
|
|
if (!in_array($element->tip, ['5', '6', '21']))
|
|
return 2;
|
|
|
|
// Vse tipe vprašanj dodamo v polje, da preverimo kasnje, da niso samo besedilana vprašanja
|
|
$vsi_tipi_vprasanj[] = $element->tip;
|
|
}
|
|
|
|
// Preverimo, če je samo besedilno vprašanje
|
|
if (!in_array('6', $vsi_tipi_vprasanj))
|
|
return 3;
|
|
|
|
} else {
|
|
$element = sisplet_query("SELECT id, tip, variable FROM srv_spremenljivka WHERE id='" . $branching->element_spr . "'", "obj");
|
|
|
|
if (!in_array($element->tip, ['6', 21]))
|
|
return 2;
|
|
|
|
// Imamo samo besedilo vprašanje
|
|
if ($element->tip == 21)
|
|
return 3;
|
|
}
|
|
|
|
|
|
return 'ok';
|
|
|
|
}
|
|
|
|
/**
|
|
* Uporabniko dodamo ali onemogočimo dostop
|
|
*
|
|
* @param integer $user_id
|
|
* @param string $tip - insert ali delete
|
|
*/
|
|
public static function dostopZaUporabnika($anketa, $user_id, $tip = 'inset')
|
|
{
|
|
|
|
if ($tip == 'insert') {
|
|
$user_dostop = sisplet_query("SELECT ank_id, uid FROM srv_dostop WHERE ank_id='" . $anketa . "' AND uid='" . $user_id . "'");
|
|
|
|
if (mysqli_num_rows($user_dostop) == 0)
|
|
sisplet_query("INSERT INTO srv_dostop (ank_id, uid, aktiven, dostop) VALUES ('" . $anketa . "', '" . $user_id . "', 1, 'edit,lock,analyse')");
|
|
}
|
|
|
|
if ($tip == 'delete') {
|
|
$user_dostop = sisplet_query("SELECT ank_id, uid FROM srv_dostop WHERE ank_id='" . $anketa . "' AND uid='" . $user_id . "'");
|
|
|
|
if (mysqli_num_rows($user_dostop) > 0)
|
|
sisplet_query("DELETE FROM srv_dostop WHERE ank_id='" . $anketa . "' AND uid='" . $user_id . "'");
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Generiraj supersifro in shrani kode
|
|
*
|
|
* @param int $anketa
|
|
* @param array $kode
|
|
*/
|
|
public static function saveSuperSifra($anketa, $kode)
|
|
{
|
|
$kode = serialize($kode);
|
|
|
|
$vpis = false;
|
|
while (!$vpis) {
|
|
$vpis = sisplet_query("INSERT INTO srv_hierarhija_supersifra (koda, anketa_id, kode, datetime) VALUES
|
|
(CONCAT('s','s',SUBSTRING('abcdefghijklmnoprtuvz0123456789', RAND()*30+1, 1),
|
|
SUBSTRING('abcdefghijklmnoprtuvz0123456789', RAND()*30+1, 1),
|
|
SUBSTRING('abcdefghijklmnoprtuvz0123456789', RAND()*30+1, 1),
|
|
SUBSTRING('abcdefghijklmnoprtuvz0123456789', RAND()*30+1, 1),
|
|
SUBSTRING('abcdefghijklmnoprtuvz0123456789', RAND()*30+1, 1)), '" . $anketa . "', '" . $kode . "', NOW())");
|
|
|
|
|
|
}
|
|
|
|
return self::vseSuperkodeSpripadajocimiHierarhijami($anketa);
|
|
}
|
|
|
|
/**
|
|
* Pridobimo vse kode,ki pripadajo superšifri in vrnemo tudi strukturo ter email
|
|
*
|
|
* @param string $koda
|
|
* @param boolean $return
|
|
* @return array $kode or $polje - multiarray
|
|
*/
|
|
public static function supersifraPridobiHierarhijo($koda, $return = false){
|
|
$kode = sisplet_query("SELECT kode, anketa_id FROM srv_hierarhija_supersifra WHERE koda='".$koda."'", "obj");
|
|
$anketa = $kode->anketa_id;
|
|
$kode = unserialize($kode->kode);
|
|
|
|
// Vrni samo kode
|
|
if($return)
|
|
return $kode;
|
|
|
|
$polje = [];
|
|
foreach($kode as $koda){
|
|
$struktura = sisplet_query("SELECT hierarhija_struktura_id AS id FROM srv_hierarhija_koda WHERE koda='".$koda."'", "obj");
|
|
$uporabnik = (new HierarhijaQuery())->pridobiVseUporabnikeZaSpecificnoStrukturo($struktura->id);
|
|
|
|
$polje[strtoupper($koda)] = [
|
|
'hierarhija' => HierarhijaHelper::hierarhijaPrikazNaslovovpriUrlju($anketa, $struktura->id, $uporabnik[0]['id']),
|
|
'ucitelj' => $uporabnik[0]['uporabnik']
|
|
];
|
|
}
|
|
|
|
return $polje;
|
|
}
|
|
|
|
|
|
/**
|
|
* Pridobi vse superkode s pripadajočimi hierarhijami
|
|
*
|
|
* @param int $anketa
|
|
* @return array
|
|
*/
|
|
public static function vseSuperkodeSpripadajocimiHierarhijami($anketa)
|
|
{
|
|
$super_sifre = sisplet_query("SELECT koda, kode FROM srv_hierarhija_supersifra WHERE anketa_id='".$anketa."' ORDER BY datetime", "obj");
|
|
|
|
if(is_object($super_sifre))
|
|
$super_sifre = [$super_sifre];
|
|
|
|
$polje = [];
|
|
foreach($super_sifre as $sifra){
|
|
$polje[strtoupper($sifra->koda)] = self::supersifraPridobiHierarhijo($sifra->koda);
|
|
}
|
|
|
|
return $polje;
|
|
}
|
|
|
|
protected
|
|
$sql;
|
|
|
|
public function sqlError($sql)
|
|
{
|
|
if (!$sql) {
|
|
echo mysqli_error($GLOBALS['connect_db']);
|
|
die();
|
|
}
|
|
|
|
}
|
|
|
|
} |