summaryrefslogtreecommitdiffstats
path: root/admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php
diff options
context:
space:
mode:
Diffstat (limited to 'admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php')
-rw-r--r--admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php418
1 files changed, 418 insertions, 0 deletions
diff --git a/admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php b/admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php
new file mode 100644
index 0000000..27dd880
--- /dev/null
+++ b/admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php
@@ -0,0 +1,418 @@
+<?php
+
+/***************************************
+ * Description: Razred omogoča kopiranja obstoječe strukture in shranjevanje v json
+ * Autor: Robert Šmalc
+ * Created date: 04.11.2016
+ *****************************************/
+namespace Hierarhija;
+
+use Hierarhija\Model\HierarhijaOnlyQuery;
+use Hierarhija\Model\HierarhijaQuery;
+
+class HierarhijaKopiranjeClass
+{
+ private static $_instance;
+ protected $anketa;
+ protected $polje_strukture = [];
+ protected $user_id;
+
+ public function __construct($anketa)
+ {
+ $this->anketa = $anketa;
+
+ global $global_user_id;
+ $this->user_id = $global_user_id;
+ }
+
+ public static function getInstance($anketa)
+ {
+ if (self::$_instance)
+ return self::$_instance;
+
+ return new HierarhijaKopiranjeClass($anketa);
+ }
+
+ /**
+ * Pridobimo celotno polje in tudi možnsz serialize v string za shranjevanje v bazo uporabimo
+ *
+ * @param (boolean) $seialize
+ * @return array | string
+ */
+ public function get($serialize = false)
+ {
+ $struktura = $this->getStrukturaInUporabniki();
+
+ if ($serialize && !empty($struktura))
+ return serialize($struktura);
+
+ return $struktura;
+ }
+
+ protected $polje_primerjava;
+
+ /**
+ * Shranimo polje in uporabni
+ *
+ * @param (array) $struktura
+ * @return
+ */
+
+ public function save($struktura)
+ {
+ // Ustvarimo sistemsko vprašanje v kolikor kopiramo tudi strukturo k vlogi
+ (new Hierarhija($this->anketa))->izrisisSistemskoVprsanjeVloga();
+
+ // Shranimo strukturo
+ $this->insert($struktura, 0);
+
+ }
+
+ /**
+ * Vpišemo elemente v bazo
+ *
+ * @param (array) $polje - polje struktura, ki ga pridobimo iz baze
+ * @param (int) $parent_id - id parenta iz prejšnje strukture, po kateri iščemo
+ * @param (int) $new_parent_id - ID vpisa strukture, ki ga uporabimo za vpis parenta
+ */
+ private function insert(array $polje, $parent_id, $new_parent_id = null)
+ {
+ if (isset($parent_id) && is_array($polje) && sizeof($polje) > 0) {
+ foreach ($polje as $raven) {
+
+ if ($raven['parent_id'] == $parent_id) {
+
+ // Pridobimo nove podatke s primerjavo s starimi ID-ji od prej, da shranimo strukturo
+ $hierarhija_ravni_id = (int)$this->primerjava['ravni'][$raven['ravni_id']];
+ $hierarhija_sifrant_id = (int)$this->primerjava['sifranti'][$raven['sifrant_id']];
+ $level = (int)$raven['level'];
+
+ $sql_raven = sisplet_query("
+ INSERT INTO srv_hierarhija_struktura
+ (hierarhija_ravni_id, parent_id, hierarhija_sifranti_id, level, anketa_id)
+ VALUES
+ ('" . $hierarhija_ravni_id . "', " . var_export($new_parent_id, true) . " , '" . $hierarhija_sifrant_id . "', '" . $level . "', '" . $this->anketa . "')
+ ");
+ $this->sqlError($sql_raven);
+
+ // Pridobimo ID vpisa strukture
+ $id_strukture = mysqli_insert_id($GLOBALS['connect_db']);
+
+ // Vpišemo uporabnike v kolikor jih imammo
+ if (isset($raven['uporabniki']) && sizeof($raven['uporabniki']) > 0) {
+ foreach ($raven['uporabniki'] as $uporabnik) {
+ $sql_user = sisplet_query("INSERT INTO srv_hierarhija_struktura_users (hierarhija_struktura_id, user_id)
+ VALUES ('" . $id_strukture . "', '" . $uporabnik . "')");
+ $this->sqlError($sql_user);
+
+ // Omogočimo tudi dostop uporabnikom do hierarhije s pravicami 10, najprej pa preverimo če je že vpisan, ker ne dovolimo duplikatov
+ $sql_uporabnik_obstaja = sisplet_query("SELECT type FROM srv_hierarhija_users WHERE anketa_id='".$this->anketa."' AND user_id='".$uporabnik."'");
+
+ if(mysqli_num_rows($sql_uporabnik_obstaja)) {
+ $sql_hierarhija_user = sisplet_query("INSERT INTO srv_hierarhija_users (user_id, anketa_id, type) VALUES ('" . $uporabnik . "', '" . $this->anketa . "', 10)");
+ $this->sqlError($sql_hierarhija_user);
+ }
+
+ // Omogočimo dostop omenjenim uporabnikom
+ HierarhijaQuery::dostopZaUporabnika($this->anketa, $uporabnik, 'insert');
+ }
+ }
+
+ // Vpišemo še vse child elemente, ki so v drevesni strukturi
+ $this->insert($polje, $raven['id'], $id_strukture);
+
+
+ }
+ }
+
+ }
+
+ }
+
+
+ /**
+ * Pridobimo vrednost za primerjavo;
+ *
+ * @param (array) $primerjava
+ * @return $this;
+ */
+ private $primerjava;
+
+ public function compare($primerjava)
+ {
+ $this->primerjava = $primerjava;
+ return $this;
+ }
+
+ /**
+ * Pridobimo strukturo v obliki multi arraya in potem dodamo še uporabnike
+ *
+ * @return (array)
+ */
+ protected function getStrukturaInUporabniki()
+ {
+
+ $sql_vsa_hierarhija = (new HierarhijaOnlyQuery())->queryStruktura($this->anketa);
+
+ // Izdelamo polje iz sql poizvedbe, da bomo v nadaljevanju izdelali vgnezdeno polje
+ $struktura = [];
+ while ($obj = $sql_vsa_hierarhija->fetch_object()) {
+ $struktura[] = [
+ 'id' => $obj->id,
+ 'ravni_id' => $obj->ravni_id,
+ 'parent_id' => (is_null($obj->parent_id) ? 0 : $obj->parent_id),
+ 'sifrant_id' => $obj->sifrant_id,
+ 'level' => $obj->level,
+ 'uporabniki' => $this->getVseUporabnikeZaStrukturo($obj->id)
+ ];
+ }
+
+ return $struktura;
+ }
+
+
+ /**
+ * Pridobimo ID vseh uporabnikov, ki so na določeni strukturi
+ *
+ * @param (int) $id
+ * @return null | (array)
+ */
+
+ protected function getVseUporabnikeZaStrukturo($id)
+ {
+ $sql_uporabniki = sisplet_query("SELECT hierarhija_struktura_id, user_id FROM srv_hierarhija_struktura_users WHERE hierarhija_struktura_id='" . $id . "'");
+
+ if ($sql_uporabniki->num_rows == 0)
+ return null;
+
+ $uporabniki = [];
+ while ($obj = $sql_uporabniki->fetch_object()) {
+ $uporabniki[] = $obj->user_id;
+ }
+
+ return $uporabniki;
+ }
+
+ /**
+ * Iz strukture hierarhije izdelamo vgnezdena polja kot je drevesna struktura
+ *
+ * @param (array) $elements
+ * @param (int) $parentId
+ * @return array
+ */
+ protected function createTreeArray(array $elements, $parentId = 0)
+ {
+ $polje = [];
+
+ foreach ($elements as $element) {
+ // Najprej poiščemoprvi nivo
+ if ($element['parent_id'] == $parentId) {
+ $naslednji = $this->createTreeArray($elements, $element['id']);
+
+ // V kolikor imamo naslednji element polja, ga zapišemo
+ if ($naslednji)
+ $element['child'] = $naslednji;
+
+ $polje[] = $element;
+ }
+ }
+
+ return $polje;
+ }
+
+ public function kopirajHierarhijo($hierarhija, $uporabniki = 0)
+ {
+ // preverimo, če je json
+ if ($this->isJson($hierarhija))
+ $hierarhija = $this->isJson($hierarhija, 1);
+
+ // v kolikor želimo kopirati tudi uporabnike/strukturo potem zbiramo stare in nove vrednosti
+ if ($uporabniki == 1)
+ $primerjava = [
+ 'ravni' => [],
+ 'sifranti' => [],
+ ];
+
+ // vpisemo vse ravni in šifrante
+ if (!empty($hierarhija) && is_array($hierarhija) && sizeof($hierarhija) > 0) {
+
+ foreach ($hierarhija as $ravni) {
+ $sql_ravni = sisplet_query("INSERT INTO srv_hierarhija_ravni (anketa_id, user_id, level, ime) VALUES ('$this->anketa', '" . $this->user_id . "', '" . $ravni['st'] . "', '" . $ravni['ime'] . "')");
+ $this->sqlError($sql_ravni);
+ $id_ravni = mysqli_insert_id($GLOBALS['connect_db']);
+
+ if ($uporabniki == 1 && isset($primerjava))
+ $primerjava['ravni'][$ravni['id']] = $id_ravni;
+
+ // V kolikor so tudi šifranti vpišemo še šifrante
+ if (!empty($ravni['sifranti']) && sizeof($ravni['sifranti']) > 0 && !empty($id_ravni)) {
+ foreach ($ravni['sifranti'] as $sifrant) {
+ if (!empty($sifrant['ime'])) {
+ $sql_hs = sisplet_query("INSERT INTO srv_hierarhija_sifranti (hierarhija_ravni_id, ime) VALUES ('" . $id_ravni . "', '" . $sifrant['ime'] . "')");
+ $this->sqlError($sql_hs);
+
+ if ($uporabniki == 1 && isset($primerjava['sifranti'])) {
+ $primerjava['sifranti'][$sifrant['id']] = mysqli_insert_id($GLOBALS['connect_db']);
+ }
+
+ }
+ }
+ }
+ }
+
+ }
+
+ if ($uporabniki == 1 && isset($primerjava) && sizeof($primerjava['ravni']) > 0 && $id_shranjene_strukture > 0) {
+ $struktura = HierarhijaQuery::getHierarhijaShraniRow($id_shranjene_strukture, 'struktura');
+ $struktura = unserialize($struktura);
+
+ $this->compare($primerjava)->save($struktura);
+ }
+
+ }
+
+ /**
+ * Ustvarimo ravni in šifrante ter lahko tudi strukturo z uporabniki
+ *
+ * Funkcija omogoča kopiranje/ustvarjanje novih ravni in šifrantov, ki jih dobi preko večdimenzionalnega polja,
+ * lahko pa tudi kopira strukturo in uporabnike, tako da primerja nove ID-je ravni/sifrantov s starimi in gre postari strukturi ter
+ * zamenja stare ID-je z novimi ter zapiše tudi uporabnike
+ *
+ * @param (array) $hierarhija - multi array
+ * @param (int) $id_shranjene_strukture - pridobimo id vrstice iz tabele srv_hierarhija_shrani
+ * @param (int) $uporabniki - ali se kopirajo tudi uporabniki
+ * @return boolean
+ */
+ public function ustvariRavniInSifranteLahkoTudiStrukturo($hierarhija, $id_shranjene_strukture = null, $uporabniki = 0)
+ {
+ // v kolikor želimo kopirati tudi uporabnike/strukturo potem zbiramo stare in nove vrednosti
+ if ($uporabniki == 1)
+ $primerjava = [
+ 'ravni' => [],
+ 'sifranti' => [],
+ ];
+
+ // Nimamo hierarhije
+ if (empty($hierarhija))
+ return false;
+
+ // vpisemo vse ravni in šifrante
+ if (!empty($hierarhija) && is_array($hierarhija) && sizeof($hierarhija) > 0) {
+
+ foreach ($hierarhija as $ravni) {
+ $ravni = (array)$ravni;
+
+ $id_ravni = sisplet_query("INSERT INTO srv_hierarhija_ravni (anketa_id, user_id, level, ime) VALUES ('".$this->anketa."', '".$this->user_id."', '" . $ravni['st'] . "', '" . $ravni['ime'] . "')", "id");
+
+ if ($uporabniki == 1 && isset($primerjava))
+ $primerjava['ravni'][$ravni['id']] = $id_ravni;
+
+ // V kolikor so tudi šifranti vpišemo še šifrante
+ if (!empty($ravni['sifranti']) && sizeof($ravni['sifranti']) > 0 && !empty($id_ravni)) {
+ foreach ($ravni['sifranti'] as $sifrant) {
+ $sifrant = (array)$sifrant;
+
+ if (!empty($sifrant['ime'])) {
+ $sql_hs = sisplet_query("INSERT INTO srv_hierarhija_sifranti (hierarhija_ravni_id, ime) VALUES ('" . $id_ravni . "', '" . $sifrant['ime'] . "')");
+ $this->sqlError($sql_hs);
+
+ if ($uporabniki == 1 && isset($primerjava['sifranti'])) {
+ $primerjava['sifranti'][$sifrant['id']] = mysqli_insert_id($GLOBALS['connect_db']);
+ }
+
+ }
+ }
+ }
+ }
+
+ }
+
+ if ($uporabniki == 1 && isset($primerjava) && sizeof($primerjava['ravni']) > 0 && $id_shranjene_strukture > 0) {
+ $struktura = HierarhijaQuery::getHierarhijaShraniRow($id_shranjene_strukture, 'struktura');
+ $struktura = unserialize($struktura);
+
+ if (!empty($struktura) && sizeof($primerjava['ravni']) > 0) {
+ $this->compare($primerjava)->save($struktura);
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Kopira celotrno strukturo iz stare ankete na novo anketo
+ *
+ * @param int $old_id
+ */
+ public function kopirajCelotroStrukturoKNoviAnketi($old_id)
+ {
+ // pridobimo ID trenutne hierarhije še s tarim ID-jem ankete
+ // $old_id - ID trenutne ankete, preden jo skopiramo
+ $id_shranjene_strukture = (new HierarhijaQuery())->getDeleteHierarhijaOptions($old_id, 'srv_hierarhija_shrani_id', null, null, false);
+ $shranjeni_podatki_stare_ankete = sisplet_query("SELECT * FROM srv_hierarhija_shrani WHERE id='" . $id_shranjene_strukture . "'", "obj");
+
+ // Kopiramo podatke iz srv_hierarhija_shrani
+ $ime_strukture_pri_novi_anketi = $shranjeni_podatki_stare_ankete->ime . '_' . date('H:i:s');
+ $id_stranjene_nove_ankete = sisplet_query("INSERT INTO
+ srv_hierarhija_shrani
+ (anketa_id, user_id, ime, hierarhija, struktura, st_uciteljev, st_vseh_uporabnikov, komentar)
+ VALUES
+ (
+ $this->anketa,
+ $this->user_id,
+ '" . $ime_strukture_pri_novi_anketi . "',
+ '" . $shranjeni_podatki_stare_ankete->hierarhija . "',
+ '" . $shranjeni_podatki_stare_ankete->struktura . "',
+ '" . $shranjeni_podatki_stare_ankete->st_uciteljev . "',
+ '" . $shranjeni_podatki_stare_ankete->st_vseh_uporabnikov . "',
+ '" . $shranjeni_podatki_stare_ankete->komentar . "'
+ )
+ ", "id");
+
+ // podatke shranimo še med opcije za specifično anketo
+ sisplet_query("INSERT INTO srv_hierarhija_options (anketa_id, option_name, option_value) VALUES ($this->anketa, 'srv_hierarhija_shrani_id', $id_stranjene_nove_ankete)");
+ sisplet_query("INSERT INTO srv_hierarhija_options (anketa_id, option_name, option_value) VALUES ($this->anketa, 'aktivna_hierarhija_ime', '" . $ime_strukture_pri_novi_anketi . "')");
+
+ if ($this->isJson($shranjeni_podatki_stare_ankete->hierarhija)) {
+ $hierarhija = json_decode($shranjeni_podatki_stare_ankete->hierarhija);
+ } else {
+ $hierarhija = unserialize($shranjeni_podatki_stare_ankete->hierarhija);
+ }
+
+ // $new_id je ID nove ankete, ki je bila skopirana
+ return $this->ustvariRavniInSifranteLahkoTudiStrukturo($hierarhija, $id_shranjene_strukture, 1);
+
+ }
+
+ /**
+ * Preverimo, če je JSON
+ *
+ * @param (string) $string
+ * @return return true ali error
+ */
+ public function isJson($string, $polje = 0)
+ {
+ if (is_string($string)) {
+ $array = json_decode(stripslashes($string));
+
+ if (json_last_error() == JSON_ERROR_NONE) {
+ if ($polje)
+ return $array;
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function sqlError($sql)
+ {
+ if (!$sql) {
+ echo mysqli_error($GLOBALS['connect_db']);
+ die();
+ }
+
+ }
+
+} \ No newline at end of file