337 lines
14 KiB
PHP
337 lines
14 KiB
PHP
<?php
|
|
/***************************************
|
|
* Description: Priprava Latex kode za Heatmap
|
|
*
|
|
* Vprašanje je prisotno:
|
|
* tip 27
|
|
*
|
|
* Autor: Patrik Pucer
|
|
* Datum: 09/2017
|
|
*****************************************/
|
|
//use enkaParameters;
|
|
define("PIC_SIZE", "\includegraphics[width=10cm]"); //slika sirine 50mm
|
|
define("ICON_SIZE", "\includegraphics[width=0.5cm]"); //za ikone @ slikovni tip
|
|
define("RADIO_BTN_SIZE", 0.13);
|
|
|
|
class HeatmapLatex extends LatexSurveyElement
|
|
{
|
|
protected $polyX = array();
|
|
protected $polyY = array();
|
|
protected $path2Images;
|
|
|
|
public function __construct()
|
|
{
|
|
global $site_path;
|
|
$this->path2Images = $site_path.'uploadi/editor/';
|
|
//parent::getGlobalVariables();
|
|
}
|
|
|
|
/************************************************
|
|
* Get instance
|
|
************************************************/
|
|
private static $_instance;
|
|
protected $texBigSkip = '\bigskip';
|
|
protected $loop_id = null; // id trenutnega loopa ce jih imamo
|
|
|
|
public static function getInstance()
|
|
{
|
|
if (self::$_instance)
|
|
return self::$_instance;
|
|
|
|
return new HeatmapLatex();
|
|
}
|
|
|
|
|
|
public function export($spremenljivke=null, $export_format='', $questionText='', $fillablePdf=null, $texNewLine='', $usr_id=null, $db_table=null, $export_subtype='', $preveriSpremenljivko=null, $loop_id=null){
|
|
// Ce je spremenljivka v loopu
|
|
$this->loop_id = $loop_id;
|
|
|
|
//preveri, ce je kaj v bazi
|
|
//$userDataPresent = $this->GetUsersData($db_table, $spremenljivke['id'], $spremenljivke['tip'], $usr_id);
|
|
$userDataPresent = $this->GetUsersData($db_table, $spremenljivke['id'], $spremenljivke['tip'], $usr_id, $this->loop_id);
|
|
//echo "userDataPresent za spremenljivko".$spremenljivke['id']." je: ".$userDataPresent."</br>";
|
|
|
|
if($userDataPresent||$export_subtype=='q_empty'||$export_subtype=='q_comment'||$preveriSpremenljivko){ //ce je kaj v bazi ali je prazen vprasalnik ali je potrebno pokazati tudi ne odgovorjena vprasanja
|
|
global $lang;
|
|
|
|
// iz baze preberemo vse moznosti - ko nimamo izpisa z odgovori respondenta
|
|
$sqlVrednosti = sisplet_query("SELECT id, naslov, naslov2, variable, other FROM srv_vrednost WHERE spr_id='".$spremenljivke['id']."' ORDER BY vrstni_red");
|
|
$numRowsSql = mysqli_num_rows($sqlVrednosti);
|
|
|
|
$tex = '';
|
|
$point = array();
|
|
//nastavitve iz baze ##########################
|
|
$spremenljivkaParams = new enkaParameters($spremenljivke['params']);
|
|
//nastavitve iz baze - konec ####################
|
|
|
|
$navpicniOdgovori = array();
|
|
$navpicniOdgovori = [];
|
|
$obmocjaNaSliki = array();
|
|
$coordsObmocijNaSliki = array();
|
|
|
|
$texNewLineAfterTable = $texNewLine." ".$texNewLine." ".$texNewLine;
|
|
|
|
//pregled vseh moznih vrednosti (kategorij) po $sqlVrednosti
|
|
while ($rowVrednost = mysqli_fetch_assoc($sqlVrednosti)){
|
|
$stringTitleRow = $rowVrednost['naslov']; //odgovori na levi strani
|
|
array_push($navpicniOdgovori, $this->encodeText($stringTitleRow) ); //filanje polja z navpicnimi odgovori (po vrsticah)
|
|
}
|
|
//pregled vseh moznih vrednosti (kategorij) po $sqlVrednosti - konec
|
|
|
|
|
|
//$tex .= $this->IzrisVsotaTabela($spremenljivke, $numRowsSql, $navpicniOdgovori, $texNewLine, $texNewLineAfterTable, $export_format, 0);
|
|
|
|
$imageName = $this->getImageName('hotspot', $spremenljivke['id'], 'hotspot_image=');
|
|
//echo("iz heatmap ime slike: ".$imageName."</br>");
|
|
$path2Images = $this->path2Images;
|
|
|
|
$imageNameTest = $path2Images.$imageName.'.png'; //za preveriti, ali obstaja slikovna datoteka na strezniku
|
|
|
|
//error_log("iz heatmap: ".$imageNameTest);
|
|
//echo("iz heatmap: ".$imageNameTest."</br>");
|
|
|
|
$imageName = $path2Images.$imageName;
|
|
|
|
if(filesize($imageNameTest) > 0){
|
|
$image = PIC_SIZE."{".$imageName."}"; //priprave slike predefinirane dimenzije
|
|
}else{
|
|
//$image = 'ni slike';
|
|
$image = $lang['srv_pc_unavailable'];
|
|
}
|
|
|
|
$tex .= $image."".$texNewLine; //izris slike
|
|
|
|
//iz baze poberi imena obmocij
|
|
$sqlHotSpotRegions = sisplet_query("SELECT region_name, region_coords FROM srv_hotspot_regions WHERE spr_id='".$spremenljivke['id']."' ORDER BY vrstni_red");
|
|
|
|
//izris imen obmocij po $sqlHotSpotRegions
|
|
$whileIndeks = 0;
|
|
while ($rowHotSpotRegions = mysqli_fetch_assoc($sqlHotSpotRegions)){
|
|
if($whileIndeks == 0){ //ce so prisotna imena obmocij, izpisi besedilo "Obmocja na sliki"
|
|
$tex .= $lang['srv_export_hotspot_regions_names'].': '.$texNewLine; //izpis besedila "Obmocja na sliki"
|
|
}
|
|
$tex .= $rowHotSpotRegions['region_name'].''.$texNewLine;
|
|
if($rowHotSpotRegions['region_name']){
|
|
array_push($obmocjaNaSliki, $rowHotSpotRegions['region_name']);
|
|
//array_push($coordsObmocijNaSliki, $rowHotSpotRegions['region_coords']);
|
|
$coordsObmocijNaSliki[$rowHotSpotRegions['region_name']]=$rowHotSpotRegions['region_coords'];
|
|
$point[$rowHotSpotRegions['region_name']] = 0;
|
|
}
|
|
$whileIndeks++;
|
|
}
|
|
|
|
$tex .= $texNewLine;
|
|
|
|
//ureditev missing-ov
|
|
if(count($missingOdgovori)!=0){ //ce so missing-i
|
|
$vodoravniOdgovori = $this->AddMissingsToAnswers($vodoravniOdgovori, $missingOdgovori);
|
|
}
|
|
//ureditev missing-ov - konec
|
|
|
|
|
|
/* //izris moznih odgovorov
|
|
$tex .= $lang['srv_drag_drop_answers'].': '.$texNewLine;
|
|
for($i=0; $i<$numColSql; $i++){
|
|
$tex .= $vodoravniOdgovori[$i].$texNewLine;
|
|
} */
|
|
|
|
|
|
if($userDataPresent){ //ce je kaj v bazi, je potrebno izrisati tabelo s koordinatami in naslovom
|
|
|
|
#pobiranje parametrov heatmap
|
|
$sql = sisplet_query("SELECT params FROM srv_spremenljivka WHERE id = '".$spremenljivke['id']."'");
|
|
$row = mysqli_fetch_assoc($sql);
|
|
$spremenljivkaParams = new enkaParameters($row['params']);
|
|
//html slike
|
|
$hotspot_image = ($spremenljivkaParams->get('hotspot_image') ? $spremenljivkaParams->get('hotspot_image') : "");
|
|
//stevilo dovoljenih klikov
|
|
$heatmap_num_clicks = ($spremenljivkaParams->get('heatmap_num_clicks') ? $spremenljivkaParams->get('heatmap_num_clicks') : 1);
|
|
#pobiranje parametrov heatmap - konec
|
|
|
|
$textboxWidthOdgovori = '1'; //sirina okvirja z odgovorom
|
|
$textboxHeightOdgovori = 0; //visina okvirja z odgovorom
|
|
$noBordersOdgovori = 0;
|
|
$parameterTabular = 'l';
|
|
//za ureditev stevila tock v izbranih obmocjih
|
|
$dataPointValue = array();
|
|
$data = array();
|
|
$numOfAnswers=count($this->userAnswer);
|
|
//za ureditev stevila tock v izbranih obmocjih - konec
|
|
//echo "stevilo odgovorov: ".count($this->userAnswer)."</br>";
|
|
|
|
#sporocilo o stevilu moznih klikov
|
|
$tex .= $lang['srv_vprasanje_heatmap_num_clicks'].": ";
|
|
//$tex .= $lang['srv_vprasanje_heatmap_num_clicks'].": ".$texNewLine;
|
|
if($export_format == 'pdf'){
|
|
$tex .= '\\textcolor{crta}{'.$numOfAnswers.'/'.$heatmap_num_clicks.'}'.$texNewLine;
|
|
}else if($export_format == 'rtf'){
|
|
$tex .= ' '.$numOfAnswers.'/'.$heatmap_num_clicks.' '.$texNewLine.$texNewLine;
|
|
}
|
|
|
|
|
|
#sporocilo o stevilu moznih klikov - konec
|
|
|
|
#sporocilo o koordinatah klikov
|
|
$tex .= $lang['srv_analiza_heatmap_clicked_coords'].": ";
|
|
|
|
|
|
for($i=0; $i<count($this->userAnswer);$i++){ //sprehodi se po tockah
|
|
|
|
//echo "rowAnswers: ".$this->userAnswer[$i]['address'].' za odgovore tip '.$spremenljivke['tip'].' id '.$spremenljivke['id'].' usr '.$usr_id.'</br>';
|
|
#priprava odgovora respondenta #######################################################################################
|
|
if($export_format == 'pdf'){
|
|
$answer = "\\textcolor{crta}{".$this->userAnswer[$i]['lat'].", ".$this->userAnswer[$i]['lng']."}";
|
|
}else if($export_format == 'rtf'){
|
|
$answer = " ".$this->userAnswer[$i]['lat'].", ".$this->userAnswer[$i]['lng']." ";
|
|
}
|
|
$lat = $this->userAnswer[$i]['lat'];
|
|
$lng = $this->userAnswer[$i]['lng'];
|
|
if($this->userAnswer[$i]['address']){ //ce je prisoten tudi podatek o naslovu, ga dodaj
|
|
if($export_format == 'pdf'){
|
|
$answer .= ", \\textcolor{crta}{".$this->userAnswer[$i]['address']."}";
|
|
}else if($export_format == 'rtf'){
|
|
$answer .= ", ".$this->userAnswer[$i]['address']." ";
|
|
}
|
|
}
|
|
if($this->userAnswer[$i]['text']&&!is_numeric($this->userAnswer[$i]['text'])){ //ce je prisoten tudi podatek 'text' (kjer je po navadi odgovor na podvprasanje) in ta ni stevilo, ga dodaj
|
|
$answer .= $texNewLine;
|
|
$answer .= $lang['srv_export_marker_podvpr_answer'].": \\textcolor{crta}{".$this->userAnswer[$i]['text']."}";
|
|
}
|
|
|
|
#pridobitev podatkov o obmocjih in podatka o prisotnosti tocke v obmocju
|
|
if(count($obmocjaNaSliki)!=0){ //ce imamo obmocja na sliki
|
|
$izpisiObmocij = 0;
|
|
for($o=0; $o<count($obmocjaNaSliki);$o++){
|
|
|
|
$this->polyX = array();
|
|
$this->polyY = array();
|
|
|
|
//pretvori koordinate obmocja
|
|
$this->convertPolyString($coordsObmocijNaSliki[$obmocjaNaSliki[$o]]);
|
|
|
|
//preveri, ce je trenutna tocka v trenutnem obmocju
|
|
$inside=$this->insidePoly($this->polyX, $this->polyY, $lat, $lng);
|
|
|
|
if($inside&&$izpisiObmocij==0){
|
|
$answer .= " v ".$obmocjaNaSliki[$o];
|
|
$izpisiObmocij = 1;
|
|
$point[$obmocjaNaSliki[$o]]++;
|
|
}elseif($inside&&$izpisiObmocij!=0){
|
|
$answer .= ", ".$obmocjaNaSliki[$o];
|
|
$point[$obmocjaNaSliki[$o]]++;
|
|
}
|
|
}
|
|
//echo "stevilo tock znotraj obmocja: ".$point["Besedilo"]."</br>";
|
|
}
|
|
#pridobitev podatkov o obmocjih in podatka o prisotnosti tocke v obmocju - konec
|
|
//echo $answer."</br>";
|
|
|
|
#priprava odgovora respondenta - konec ##############################################################################
|
|
|
|
|
|
//zacetek tabele
|
|
$tex .= $this->StartLatexTable($export_format, $parameterTabular, 'tabularx', 'tabular', 1, 1);
|
|
|
|
//izpis latex kode za prazen okvir oz. okvir z odgovori respondenta
|
|
$tex .= $this->LatexTextBox($export_format, $textboxHeightOdgovori, $textboxWidthOdgovori, $answer, $textboxAllignment, $noBordersOdgovori);
|
|
|
|
//zakljucek tabele
|
|
$tex .= $this->EndLatexTable($export_format, 'tabularx', 'tabular');
|
|
//$tex .= $texNewLine;
|
|
}
|
|
|
|
if(count($obmocjaNaSliki)!=0){ //ce imamo obmocja na sliki
|
|
//$tex .= '\par {';
|
|
//$tex .= $texNewLine.$lang['srv_export_respondent_data_heatmap_regions_number'].": ".$texNewLine;
|
|
$tex .= $lang['srv_export_respondent_data_heatmap_regions_number'].": ";
|
|
//$tex .= '\par }';
|
|
for($o=0; $o<count($obmocjaNaSliki);$o++){
|
|
//echo "stevilo tock znotraj obmocja: ".$obmocjaNaSliki[$o]." je ".$point[$obmocjaNaSliki[$o]]."</br>";
|
|
//srv_export_respondent_data_heatmap_regions_number
|
|
|
|
if($export_format == 'pdf'){
|
|
$answerRegions = $obmocjaNaSliki[$o].": \\textcolor{crta}{".$point[$obmocjaNaSliki[$o]]."}";
|
|
}else if($export_format == 'rtf'){
|
|
$answerRegions = $obmocjaNaSliki[$o].": ".$point[$obmocjaNaSliki[$o]]."";
|
|
}
|
|
|
|
//zacetek tabele
|
|
$tex .= $this->StartLatexTable($export_format, $parameterTabular, 'tabularx', 'tabular', 1, 1);
|
|
|
|
//izpis latex kode za prazen okvir oz. okvir z odgovori respondenta
|
|
$tex .= $this->LatexTextBox($export_format, $textboxHeightOdgovori, $textboxWidthOdgovori, $answerRegions, $textboxAllignment, $noBordersOdgovori);
|
|
|
|
//zakljucek tabele
|
|
$tex .= $this->EndLatexTable($export_format, 'tabularx', 'tabular');
|
|
//$tex .= $texNewLine;
|
|
}
|
|
|
|
}
|
|
/* if($point){ //ce je kaksna tocka v obmocju, izpisi tabelo
|
|
//zacetek tabele
|
|
$tex .= $this->StartLatexTable($export_format, $parameterTabular, 'tabularx', 'tabular', 1, 1);
|
|
|
|
//izpis latex kode za prazen okvir oz. okvir z odgovori respondenta
|
|
$tex .= $this->LatexTextBox($export_format, $textboxHeightOdgovori, $textboxWidthOdgovori, ': '.$point, $textboxAllignment, $noBordersOdgovori);
|
|
|
|
//zakljucek tabele
|
|
$tex .= $this->EndLatexTable($export_format, 'tabularx', 'tabular');
|
|
$tex .= $texNewLine;
|
|
} */
|
|
}
|
|
|
|
$tex .= $this->texBigSkip;
|
|
$tex .= $this->texBigSkip;
|
|
/* $tex .= $texNewLine;
|
|
$tex .= $texNewLine; */
|
|
if($export_format == 'pdf'){ //ce je pdf
|
|
//$tex .= '\\end{absolutelynopagebreak}'; //zakljucimo environment, da med vprasanji ne bo prelomov strani
|
|
}else{ //ce je rtf
|
|
|
|
}
|
|
|
|
return $tex;
|
|
}
|
|
}
|
|
|
|
|
|
#funkcija, ki skrbi za pretvorbo stringa koordinat obmocja v polja
|
|
function convertPolyString($polypoints=null){
|
|
$poly = [];
|
|
//$tmpX;
|
|
//$tmpY;
|
|
$j = 0;
|
|
|
|
$poly = explode(",", $polypoints);
|
|
//echo count($poly);
|
|
|
|
for($i=0; $i<count($poly); $i++){
|
|
if($i == 0 || $i%2 == 0){
|
|
$tmpX = (int)$poly[$i];
|
|
//echo "x: ".$tmpX."</br>";
|
|
}else{
|
|
$tmpY = (int)$poly[$i];
|
|
//echo "y: ".$tmpY."</br>";
|
|
array_push($this->polyX, $tmpX);
|
|
array_push($this->polyY, $tmpY);
|
|
}
|
|
}
|
|
//echo ("dolzina polja za x je: ".count($this->polyX));
|
|
//echo ("dolzina polja za y je: ".count($this->polyY));
|
|
}
|
|
#funkcija, ki skrbi za pretvorbo stringa koordinat obmocja v polja - konec
|
|
|
|
#funkcija, ki preveri, ali je dolocena tocka v notranjosti dolocenega obmocja
|
|
function insidePoly($polyX=null, $polyY=null, $pointx=null, $pointy=null) {
|
|
//echo("Za poly: je x: ".$pointx." y: ".$pointy."</br>");
|
|
$inside = false;
|
|
for ($i = 0, $j = count($polyX) - 1; $i < count($polyX); $j = $i++) {
|
|
//echo $polyX[$i]." ".$polyY[$i]."</br>";
|
|
if((($polyY[$i] > $pointy) != ($polyY[$j] > $pointy)) && ($pointx < ($polyX[$j]-$polyX[$i]) * ($pointy-$polyY[$i]) / ($polyY[$j]-$polyY[$i]) + $polyX[$i]) ) $inside = !$inside;
|
|
}
|
|
//echo "inside je: ".$inside."</br>";
|
|
return $inside;
|
|
}
|
|
#funkcija, ki preveri, ali je dolocena tocka v notranjosti dolocenega obmocja - konec
|
|
|
|
} |