summaryrefslogblamecommitdiffstats
path: root/admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php
blob: 27dd880fa125a7e068229bfd43b2ab27e7768238 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
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();
        }

    }

}