'; # id="srv_diagnostic"
}
/* Začetek ankete z neprimernimi vprašanji.
* Ni najbolje začeti z demografijo (razen v primeru specifičnih anket ali ko te podatke potrebujemo zaradi vejitev).
* Še slabše je začeti z občutljivim ali težkimi vprašanji.
* Prvo vprašanje mora namreč biti (a) enostavno, (b) prijazno in (c) zanimivo.
* Demografija (spol, starost, izobrazba ipd.) je običajno na koncu.
* Pri tem je treba posebej dobro razmisliti ali vsa ta vprašanja res potrebujemo.
* Pogosto sprašujemo npr. po regiji, čeprav je regija za naš problem irelevantna in na tej osnovi kasneje ne izvedemo nobene analize.
* Nepotrebno je tudi preveč podrobno spraševanje (npr. po starosti), če vemo, da nas v pogledu starosti zanima
* kvečjemu analiza treh večjih starostnih skupin (npr. do 30, 30-50, 50+) - v takem primeru zato tako tudi vprašamo.
* S tem se izognemo dodatnemu rekodiranju, hkrati pa seveda respondentom olajšamo odgovarjanje.
*/
function testUnapropriateStart() {
global $lang;
#Preverimo ali se v prvh 30% vprašanj pojavi beseda spol, starost, izobrazba
$cnt = 0;
$_30_percent = $this->cnt_spremenljivka / (100 / SPR_UNAPROPRIATE_START_LIMIT);
$_bad_words = $lang['srv_diagnostic_bad_start_words'];# = array('spol', 'starost', 'rojstva', 'izobrazba', 'šola');
foreach ( $this->struktura_spremenljivk AS $key => $spr_id ) {
if ( !in_array(DIAG_UNAPROPRIATE_START,$this->diagnostic_note)
&& $cnt < $_30_percent
&& $cnt < 5) {
# preverimo ali se kje pojavijo demografska vprašanja
$naslov = trim($this->spremenljivke[$spr_id]['naslov']);
foreach ($_bad_words AS $bad_word) {
if( !in_array(DIAG_UNAPROPRIATE_START,$this->diagnostic_note)
&& stristr($naslov, $bad_word) !== FALSE ) {
$this->diagnostic_note[] = DIAG_UNAPROPRIATE_START;
}
}
}
$cnt++;
}
}
/* Za pomembna vprašanja, npr. vprašanja na osnovi katerih temeljijo vejitve ali vprašanja,
* ki so bistvena za našo analizo, je smiselno nastaviti opozorilo, ki respondenta opozori na pomembnost odgovora.
* Le v zelo nujnih primerih pa respondentu tudi preprečimo nadaljevanje, če ne odgovori.
* Druga skrajnost so trdi opomniki za čisto vsako vprašanje, ki pa lahko odvrnejo respondenta od celotne ankete.
*/
# Hkrati potestiramo še za preveč podvprašanj v gridu
/*Znano je, da respondenti zapuščajo anketo predvsem pri blokih vprašanj,
* kjer se npr. zahteva strinjanje z več trditvami. V enem bloku naj bo zato
* praviloma do največ 8-10 vprašanj, nakar se naredi nov blok z novim (krajšim)
* nagovorom.
*/
function testHardRremindersAndSubQ() {
$_spr_reminders_checked = array();
# najprej preverimo ali imamo opomnike na vprašanja na katere se sklicujejo if-i
if ($this->cnt_conditions > 0) {
# zloopamo skozi pogoje
foreach ($this->conditions AS $iid => $condition) {
# zloopamo skozi posamezen pogoj
if ( !in_array(DIAG_REMINDER_ON_IF,$this->diagnostic_note)
&& $condition > 0) {
$sql_condition_spr = Cache::srv_condition($condition);
while($row_condition_spr = mysqli_fetch_array($sql_condition_spr)) {
# za vako posamezno spremenljivko preverimo ali imamo kakšen reminder
# vsako spremenljivko preverimo samo 1x :)
if ( !in_array(DIAG_REMINDER_ON_IF,$this->diagnostic_note)
&& !isset($_spr_reminders[$row_condition_spr['spr_id']])) {
if ((int)$this->spremenljivke[$row_condition_spr['spr_id']]['reminder'] == 0) {
$this->diagnostic_note[] = DIAG_REMINDER_ON_IF;
}
# zakeširamo spremenljivko, da ne gledamo večkrat
$_spr_reminders[$row_condition_spr['spr_id']] = true;
}
}
}
}
}
# preverimo še da nimamo remindejrev na vprašanja z ogromno odgovori. (multigrid > 10)
if ($this->cnt_spremenljivka > 0) {
foreach ($this->spremenljivke as $skey => $spremenljivka) {
# checkbox
if ( $spremenljivka['tip'] == 6 # m-radio
|| $spremenljivka['tip'] == 16 # m-check
|| $spremenljivka['tip'] == 19 # m-text
|| $spremenljivka['tip'] == 20 # m-number
) {
# Preštejemo variable
$sql_string = "SELECT count(*) AS cnt FROM srv_vrednost WHERE spr_id = '".$spremenljivka['id']."'";
$sql_query = sisplet_query($sql_string);
$sql_row = mysqli_fetch_assoc($sql_query);
if ($spremenljivka['reminder'] == 2 && $sql_row['cnt'] >= SPR_REMINDER_ON_MGRID_LIMIT) {
# če še ni nastavljeno
if (!in_array(DIAG_REMINDER_ON_MGRID,$this->diagnostic_note)) {
$this->diagnostic_note[] = DIAG_REMINDER_ON_MGRID;
}
}
if ($sql_row['cnt'] > SUB_Q_IN_GRID_LIMIT) {
$this->diagnostic_note[] = DIAG_SUB_Q_IN_GRID;
}
}
}
}
}
/* Večinoma - razen redkih primerov - je tudi smiselno, da je na eni spletni
* strani v grobem toliko vprašanj, kolikor jih je možno videti na običajnem ekranu pri običajni
* ločljivosti. V tem smislu tudi sicer dajemo na eno stran toliko vprašanj, kot jih gre na ekran,
* vključno s prvo stranjo, kjer poskrbimo, da je gumb "NAPREJ" viden brez uporabe drsnika.
* Le izjemoma in z dobrimi razlogi se odločimo, da dajemo na eno stran več al celo vsa vprašanja,
* kar seveda zahteva od uporabnika da se z miško premika po strani. Podobno velja tudi za tudi vprašanja,
* ki se prikažejo šele ob pogoju - običajno jh postavimo na novo stran, le v primeru manjših podvprašanj
* sprožimo prikaz na isti strani.
*/
function testTooManyQuestions() {
# preštejemo vprašanja na posamezni strani
foreach ($this->pages AS $pid => $page) {
if (count($page) > SPR_ON_PAGE_LIMIT) {
$this->diagnostic_note[] = DIAG_SPR_ON_PAGE;
}
}
# preštejemo vprašanja v posamezem bloku
foreach ($this->blocks AS $bid => $block) {
if (count($block) > SPR_IN_BLOCK_LIMIT) {
$this->diagnostic_note[] = DIAG_SPR_IN_BLOCK;
}
}
}
function testTime() {
$sas = new SurveyAdminSettings();
$total = $sas->testiranje_predvidenicas(2);
$this->time = array( $total,
(bcdiv($total, 60, 0)>0?bcdiv($total, 60, 0).'min ':'').''.round(bcmod($total, 60), 0).'s'
);
if ($total >= TIME_SOFT_LIMIT) {
if ($total <= TIME_HARD_LIMIT) {
$this->diagnostic_note[] = DIAG_TIME_SOFT_LIMIT;
} else {
$this->diagnostic_note[] = DIAG_TIME_HARD_LIMIT;
}
}
}
function testComments() {
$spr_id=array();
$threads=array();
if ( is_array($this->spremenljivke) && count($this->spremenljivke) > 0 ) {
foreach ($this->spremenljivke as $id=>$value) {
$spr_id[] = $id;
if ((int)$value['thread'] > 0) {
$threads[] = $value['thread'];
}
}
}
if (count($spr_id) > 0) {
$db_table = SurveyInfo::getInstance()->getSurveyArchiveDBString();
#preštejemo komentarje uporabnikov na vprašanja
# srv_data_text where spr_id = 0 AND vre_id IN (id-ji spremenljivk)
$strqr = "SELECT count(*) FROM srv_data_text".$db_table." WHERE spr_id=0 AND vre_id IN (".implode(',',$spr_id).")";
$sqlqr = sisplet_query($strqr);
list($rowqr) = mysqli_fetch_row($sqlqr);
#končani komentarji respondentov
#text2 = 2 => končan
#text2 = 3 => nerelevantno
$strqrf = "SELECT count(*) FROM srv_data_text".$db_table." WHERE spr_id=0 AND vre_id IN (".implode(',',$spr_id).") AND text2 IN (2,3)";
$sqlqrf = sisplet_query($strqrf);
list($rowqrf) = mysqli_fetch_row($sqlqrf);
# vsi komentarji na anketo
$strta = "SELECT count(*) FROM post WHERE tid='".$this->surveyInfo['thread']."' AND parent > 0";
$sqlta = sisplet_query($strta);
list($rowta) = mysqli_fetch_row($sqlta);
# nerešeni komentarji: only_unresolved => ocena <= 1
$strtu = "SELECT count(*) FROM post WHERE tid='".$this->surveyInfo['thread']."' AND parent > 0 AND ocena <= 1 ";
$sqltu = sisplet_query($strtu);
list($rowtu) = mysqli_fetch_row($sqltu);
# vsi komentarji na anketo respondentov
$strtar = "SELECT count(*) FROM srv_comment_resp WHERE ank_id='".$this->sid."'";
$sqltar = sisplet_query($strtar);
list($rowtar) = mysqli_fetch_row($sqltar);
# nerešeni komentarji respondentov na anketo: only_unresolved => ocena <= 1
$strtur = "SELECT count(*) FROM srv_comment_resp WHERE ank_id='".$this->sid."' AND ocena <= 1 ";
$sqltur = sisplet_query($strtur);
list($rowtur) = mysqli_fetch_row($sqltur);
$rowtqa = 0;
$rowtqu = 0;
# preštejemo
if (count($threads) > 0) {
# vsi komentarji na anketo
$strta = "SELECT count(*) FROM post WHERE tid IN (".implode(',',$threads).") AND parent > 0";
$sqlta = sisplet_query($strta);
list($rowtqa) = mysqli_fetch_row($sqlta);
# nerešeni komentarji: only_unresolved => ocena <= 1
$strtu = "SELECT count(*) FROM post WHERE tid IN (".implode(',',$threads).") AND parent > 0 AND ocena <= 1 ";
$sqltu = sisplet_query($strtu);
list($rowtqu) = mysqli_fetch_row($sqltu);
}
}
$this->comments = array($rowta,$rowtu,$rowtqa,$rowtqu,$rowqr,$rowqrf,$rowtar,$rowtur);
return $this->comments;
}
function testConditions() {
global $lang;
$code = true;
$b = new Branching($this->sid);
$code1 = $b->check_pogoji();
// ce je vse ok, preverimo se loope
$code2 = $b->check_loops();
if (($code1===true && $code2 === true ) !== true) {
$this->diagnostic_note[] = DIAG_INVALID_CONDITIONS;
}
$code4 = $b->check_validation();
if ($code4 !== true) {
$this->diagnostic_note[] = DIAG_INVALID_VALIDATIONS;
}
// preverimo podvojensot imen variabel
$code3 = $b->check_variable();
if ( $code3 !== true ) {
$this->diagnostic_note[] = DIAG_INVALID_VARIABLENAMES;
}
}
/** Skreiramo "postavitev" ankete
*
*/
function createStructure() {
$parent = '0';
$this->struktura = $this->getInlineBranching($parent);
$this->spremenljivk = count($this->struktura_spremenljivk);
$this->globina = ArrayDepth($this->struktura)-1;
}
function countHidden() {
if (count($this->spremenljivke) > 0) {
foreach ($this->spremenljivke as $spremenljivka) {
if ((int)$spremenljivka['visible'] == 0) {
$this->cnt_hidden++;
}
}
}
}
function getInlineBranching($parent) {
$_elements_in_block = Cache::srv_branching_parent($this->sid, $parent);
$result = array();
foreach ($_elements_in_block AS $key => $_element) {
if ($_element['element_if'] > 0) {
# če je if in je tip 1 imamo nov blok
$_if = Cache::srv_if($_element['element_if']);
if ($_if['tip'] == 1) {
# če je tip = 1 imamo blok
$this->cnt_blocks++;
} else {
# preštejemo navane ife
$this->conditions[$this->cnt_conditions] = $_element['element_if'];
$this->cnt_conditions++;
}
array_push($result, $this->getInlineBranching($_element['element_if']));
} else {
array_push($result, $_element['element_spr']);
# dodamo vrstni red spremenljivk
$this->struktura_spremenljivk[$this->cnt_spremenljivka] = $_element['element_spr'];
$this->cnt_spremenljivka++;
# ločimo spremenljivke po straneh
$this->pages[$this->cnt_pages][] = $_element['element_spr'];
if ($_element['pagebreak'] == 1) {
$this->cnt_pages++;
}
# ločimo spremenljivke po blokih, nov blok je označen kot if - z posebnim tipom
$this->blocks[$this->cnt_blocks][] = $_element['element_spr'];
}
}
return $result;
}
function printNote($show_link = false) {
global $lang;
# napake
$_napake = (int)in_array(DIAG_INVALID_CONDITIONS, $this->diagnostic_note);
$_napake += (int)in_array(DIAG_INVALID_VARIABLENAMES, $this->diagnostic_note);
# priporočila:
# DIAG_SPR_ON_PAGE
# DIAG_SPR_IN_BLOCK
# DIAG_SUB_Q_IN_GRID
# DIAG_UNAPROPRIATE_START
$_opozorila = (int)in_array(DIAG_SPR_ON_PAGE, $this->diagnostic_note)
+(int)in_array(DIAG_SPR_IN_BLOCK, $this->diagnostic_note)
+(int)in_array(DIAG_SUB_Q_IN_GRID, $this->diagnostic_note)
+(int)in_array(DIAG_UNAPROPRIATE_START, $this->diagnostic_note)
+(int)in_array(DIAG_TIME_HARD_LIMIT, $this->diagnostic_note);
# opozorila:
# DIAG_REMINDER_ON_IF
# DIAG_REMINDER_ON_MGRID
$_priporocila = (int)in_array(DIAG_REMINDER_ON_IF, $this->diagnostic_note)
+(int)in_array(DIAG_REMINDER_ON_MGRID, $this->diagnostic_note)
+(int)in_array(DIAG_TIME_SOFT_LIMIT, $this->diagnostic_note);
#print_r($this->diagnostic_note);
#echo $lang['srv_diagnostic_note'].' '.$lang['srv_diagnostic_note_1'].' ';
echo $lang['srv_diagnostic_note_1'].' ';
//$_comments = ($this->comments[1] + $this->comments[3] + $this->comments[4] - $this->comments[5]);
$_comments_survey = ($this->comments[1] + $this->comments[7]);
$_comments_question = ($this->comments[3] + $this->comments[4] - $this->comments[5]);
if((int)$_napake > 0) echo '';
echo $this->string_format((int)$_napake,'srv_cnt_napake');
if((int)$_napake > 0) echo '';
echo ', ';
if((int)$_opozorila > 0) echo '';
echo $this->string_format((int)$_opozorila,'srv_cnt_opozorila');
if((int)$_opozorila > 0) echo '';
echo ', ';
if((int)$_priporocila > 0) echo '';
echo $this->string_format((int)$_priporocila,'srv_cnt_priporocila');
if((int)$_priporocila > 0) echo '';
/*echo ' '.$lang['srv_and'].' ';
echo $this->string_format((int)$_comments, 'srv_cnt_komentarji');
echo '.';*/
echo ', ';
if((int)$_comments_survey > 0) echo '';
echo $this->string_format((int)$_comments_survey, 'srv_cnt_komentarji_survey');
if((int)$_comments_survey > 0) echo '';
echo ' '.$lang['srv_and'].' ';
if((int)$_comments_question > 0) echo ' ';
echo $this->string_format((int)$_comments_question, 'srv_cnt_komentarji_question');
if((int)$_comments_question > 0) echo '';
echo '.';
}
function string_format($cnt,$lang_root) {
global $lang;
$txt = '';
if ($cnt > 0) $txt .= '';
if (isset($lang[$lang_root.'_'.$cnt])) {
$txt .= $cnt.' '.$lang[$lang_root.'_'.$cnt];
} else {
$txt .= $cnt.' '.$lang[$lang_root.'_more'];
}
if ($cnt > 0) $txt .= '';
return $txt;
}
}
function ArrayDepth($Array,$DepthCount=-1) {
// Find maximum depth of an array
// Usage: int ArrayDepth( array $array )
// returns integer with max depth
// if Array is a string or an empty array it will return 0
$DepthArray=array(0);
$DepthCount++;
if (is_array($Array))
foreach ($Array as $Key => $Value) {
$DepthArray[]=ArrayDepth($Value,$DepthCount);
}
else
return $DepthCount;
return max($DepthCount,max($DepthArray));
}