337 lines
12 KiB
PHP

<?php
/***************************************
* Description: Funkcije za pomoč pri hierarhiji
* Autor: Robert Šmalc
* Created date: 11.04.2017
*****************************************/
namespace Hierarhija;
use Hierarhija\Model\HierarhijaOnlyQuery;
use Hierarhija\Model\HierarhijaQuery;
use SurveyInfo;
use Common;
class HierarhijaHelper
{
/**
* Iz teksa zamenjamo besede, ki so med lojtrami (#nivo1#, #nivo2#, #ime
* ucitelja#, #email ucitelja#)
*
* @param text $text
* @param int $ank_id
*
* @return text
*/
public static function dataPiping($text, $ank_id = null)
{
if (is_null($ank_id)) {
$ank_id = (! empty(get('anketa')) ? get('anketa') : $_GET['anketa']);
}
// Preverimo, če tekst vsebuje kaj
if (! preg_match_all('/#([\w\s]+)#/', $text, $matches) || is_null($ank_id)) {
return $text;
}
// Pridobimo ID vrednosti spremenljivk, za katere moramo dobiti naslove, da jih lahko prikažemo
$get = get('get');
// V kolikor smo na katerikoli strani, potem gledamo po piškotkih
if (isset($get->{'survey-'.$ank_id})) {
$active = SurveyInfo::getInstance()->getSurveyArchiveDBString();
// ID uporabnika, glede na njegov piškot
$srv_user = sisplet_query("SELECT id FROM srv_user WHERE cookie='".$get->{'survey-'.$ank_id}."'", "obj")->id;
// Pridobimo vse odgovore - strukturo hierarhije
$vrednosti = sisplet_query("SELECT
v.naslov AS naslov,
ss.variable AS variable,
v.id AS spr_id
FROM
srv_data_vrednost".$active." AS sd
LEFT JOIN
srv_vrednost AS v
ON
sd.vre_id=v.id
LEFT JOIN
srv_spremenljivka AS ss
ON
v.spr_id=ss.id
WHERE sd.usr_id='".$srv_user."' ORDER BY ss.variable DESC", "obj");
}
// Zanka po vseh besedah v texstu, k so med lojtrama (
foreach ($matches[0] as $key => $match) {
$iskanje = strtolower($matches[1][$key]);
// Zamenjava nivojev (primer: nivo1, nivo2, ...) in vloge (učenec, učitelj)
if (! empty($get->{$iskanje})) {
$variabla = sisplet_query("SELECT naslov FROM srv_vrednost WHERE id='".$get->{$matches[1][$key]}."'", "obj");
$text = str_ireplace($match, $variabla->naslov, $text);
} elseif ($iskanje === 'hierarhija') {
$hierarhija_pot = Hierarhija::displayPodatkeOhierarhijiZaRespondente($get, true);
$text = str_ireplace($match, $hierarhija_pot, $text);
}
// Kadar nivoje menjamo na ostalih vprašanjih in nimamo več Get parametrov, potem pridobimo iz že shranjenih sistemskih odgovorov
if (! empty($vrednosti)) {
$url_variables = '';
foreach ($vrednosti as $vrednost) {
if ($vrednost->variable == $matches[1][$key]) {
$text = str_ireplace($match, $vrednost->naslov, $text);
}
if (! empty($vrednost->variable)) {
$url_variables .= $vrednost->variable.'='.$vrednost->spr_id.'&';
}
}
}
// Ostranimo lojtro iz zadnjega nivoja, da lahko nato preverimo pa url naslovu v bazi
$url_variables = substr($url_variables, 0, strlen($url_variables) - 1);
// zamenjava podatkov o učitelju/uporabniku - ime, priimek, email
if (in_array($iskanje, ['ime ucitelja', 'email ucitelja'])) {
// Pridobimo podatke u uporabniku za sledečo anketo
if (! empty($get->enc)) {
$url_variables = base64_decode($get->enc);
}
$user = sisplet_query("SELECT u.email AS email, u.name AS name, u.surname AS surname FROM srv_hierarhija_koda AS h LEFT JOIN users AS u ON u.id=h.user_id WHERE h.anketa_id='".$ank_id."' AND h.url='".$url_variables."'", "obj");
$zamenjaj = $match;
// email ne sme biti enak imenu ali priimku
if ($iskanje == 'ime ucitelja' && ! in_array($user->email, [$user->name, $user->surname])) {
$zamenjaj = $user->name." ".$user->surname;
} elseif ($iskanje == 'ime ucitelja') {
preg_match('/(\w+)((?:\.)(\w+))?/', $user->email, $ucitelj);
$zamenjaj = self::velikaZacetnica($ucitelj[1]);
if (! empty($ucitelj[3])) {
$zamenjaj .= " ".self::velikaZacetnica($ucitelj[3]);
}
}
if ($iskanje == 'email ucitelja') {
$zamenjaj = $user->email;
}
$text = str_ireplace($match, $zamenjaj, $text);
}
}
return $text;
}
/**
* Iz besedila najprej pretvorimo v male črke in nato veliko začetnico
*
* @param string $string
*
* @return string
*/
private static function velikaZacetnica($string)
{
return ucfirst(mb_strtolower($string, 'UTF-8'));
}
/**
* Preverimo dostop določenega uporabnika do modula SA
*
* @param (int) $anketa
*/
public static function preveriDostop($anketa_id = 0)
{
global $admin_type;
// Če ima dostop in je modul vključen
if (Common::checkModule('hierarhija') == '1') {
//anketa še ni ustvarjena, potem mu je dostop omogočen
if ($anketa_id == 0 && self::aliImaDostopDoIzdelovanjaHierarhije()) {
return true;
}
// Imamo anketa ID in smo znotraj ankete
if ($anketa_id > 0) {
// Če je modul vključen potem lahko do hierarhije dostopajo samo (admini, oseba, ki je mod vključila in osebe, katerim je bil dodan dostop do urejanja hierarhije)
if (SurveyInfo::checkSurveyModule('hierarhija', $anketa_id) && ($admin_type == 1 || self::preveriTipHierarhije($anketa_id) < 5)) {
return true;
// Če modul še ni bil vključen imajo dostop samo uporabniki s predhodnimi pravicami
} elseif (! SurveyInfo::checkSurveyModule('hierarhija', $anketa_id) && self::aliImaDostopDoIzdelovanjaHierarhije()) {
return true;
}
}
}
return false;
}
/**
* Preverimo, če ima dostop do grajenja hierarhije, dostop omogočimo:
* AAI uporabnikom
* 1ka administrator
* Uporabniku, kateremu je bil dodeljen dostop do ankete
*/
public static function aliImaDostopDoIzdelovanjaHierarhije()
{
global $site_url;
$strani = [
'https://www.1ka.si/',
'http://test.1ka.si/',
'http://1ka.test/',
'https://1ka.arnes.si/'
];
// Če je domena prava in če je modul vključen na inštalaciji
$modul = Common::checkModule('hierarhija');
if ($modul == '0' || $modul == '1' && ! in_array($site_url, $strani)) {
return false;
}
// Ali je administrator
global $admin_type;
if ($admin_type == 0) {
return true;
}
//AAI uporabnik
if (! empty($_COOKIE['aai']) && $_COOKIE['aai'] == 1) {
return true;
}
// Ima dostop, ker je bil dodan v bazo uporabnikov za dostop do hierarhije
if (sizeof(sisplet_query("SHOW TABLES LIKE 'srv_hierarhija_dostop'", "array")) == 1) {
global $global_user_id;
$dostop = sisplet_query("SELECT dostop FROM srv_hierarhija_dostop WHERE user_id='".$global_user_id."'", "obj");
if (! empty($dostop) && $dostop->dostop == 1) {
return true;
}
}
return false;
}
public static function preveriTipHierarhije($anketa)
{
global $global_user_id;
$type = null;
if (is_null($anketa)) {
return null;
}
if (! SurveyInfo::checkSurveyModule('hierarhija', $anketa)) {
return null;
}
// V kolikor je tip hierarhije že v seji
if (! empty($_SESSION['hierarhija'][$anketa]['type']) && $_SESSION['hierarhija'][$anketa]['type'] > 5) {
return $_SESSION['hierarhija'][$anketa]['type'];
}
$sql = sisplet_query("SELECT type FROM srv_hierarhija_users WHERE user_id='".$global_user_id."' AND anketa_id='".$anketa."'");
if (! empty($sql) && mysqli_num_rows($sql) > 0) {
$row = mysqli_fetch_object($sql);
$type = $row->type;
}
$_SESSION['hierarhija'][$anketa]['type'] = $type;
return $type;
}
/**
* Preverimo, komu so bile poslane kode in vrnemo ustrezno besedilo
*
* @param int $anketa
* @param string $string
*
* @return text
*/
public static function textGledeNaOpcije($anketa, $string = null)
{
global $lang;
if (is_null($string)) {
return null;
}
$poslji_kode = HierarhijaQuery::getOptionsPosljiKode($anketa);
return $lang[$string.'_'.$poslji_kode];
}
/**
* Izpišemo nivoje hierarhije za našega uporabnika za prikaz linkov
*/
public static function hierarhijaPrikazNaslovovpriUrlju(
$anketa,
$struktura_id,
$email = null
) {
global $global_user_id;
$predmet = (new HierarhijaOnlyQuery())->queryStruktura($anketa, null, ' AND str.id='.$struktura_id)->fetch_object();
// V kolikor pošiljamo email vabilo admin in je aktiviral ali je $email že user_id
if ($email && is_numeric($email)) {
$user_id = $email;
} elseif ($email) {
$user_id = sisplet_query("SELECT user_id FROM srv_hierarhija_struktura_users WHERE hierarhija_struktura_id='".$predmet->id."'")->fetch_object()->user_id;
} else {
$user_id = $global_user_id;
}
$veja_hierarhije = (new HierarhijaQuery())->pridobiHierarhijoNavzgor($anketa, null, $user_id);
$ime_strukture = [];
foreach ($veja_hierarhije as $key_struktura => $value_sifranta) {
### Če ključ trenutnega predmeta ustreza ključi polja za to hierarhijo, potem izpišemo pot za ta predmet (ime, razred, itd...)
if ($key_struktura == $predmet->id) {
#### Sortiramo polje od nivoja 1 do 6, ker drugače imamo obratno
krsort($value_sifranta);
$st_vnosov = sizeof($value_sifranta);
$nivo_ime = null;
foreach ($value_sifranta as $key => $element) {
// Tukaj prikaže tudi najvišji nivo, če je potrebno, če želimo najviši nivo izpustu
if ($key < $st_vnosov) {
$zacas_ime = (new HierarhijaOnlyQuery())->getSamoSifrant($element['id'], true)->fetch_object();
$nivo_ime .= $zacas_ime->ime;
if ($key != 0) {
$nivo_ime .= ' - ';
}
}
}
// V kolikor nas zanima naslov samo za eno strukturo
if (! is_null($struktura_id)) {
return $nivo_ime;
}
$ime_strukture[$key_struktura] = $nivo_ime;
}
}
return $ime_strukture;
}
}