summaryrefslogblamecommitdiffstats
path: root/admin/survey/export/latexclasses/Vprasanja/HeatmapLatex.php
blob: 94e86fb62700eb8af0c7f1cd55531e0d120891f4 (plain) (tree)
















































































































































































































































































































































                                                                                                                                                                                                                                    
<?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
	
}