mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
33aa7b7163
- Studienplan in tbl_ablauf - Aktiv-Attribut bei Frage und Vorschlag - Bezeichnung mehrsprachig in Gebiet - GUI für Ablauf-Pflege inkl. Studienplan - GUI für Gebiete hinzufügen - GUI für Pflege der mehrsprachigen Gebietsbezeichnung - Aktiv/Inaktiv setzen von Fragen und Vorschlägen in GUI - !!! Aktiv-Attribute greifen noch nicht im Testtool selbst !!!
892 lines
24 KiB
PHP
892 lines
24 KiB
PHP
<?php
|
|
/* Copyright (C) 2007 Technikum-Wien
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
|
*
|
|
* Authors: Christian Paminger <christian.paminger@technikum-wien.at>,
|
|
* Andreas Oesterreicher <andreas.oesterreicher@technikum-wien.at>,
|
|
* Rudolf Hangl <rudolf.hangl@technikum-wien.at> and
|
|
* Gerald Simane-Sequens <gerald.simane-sequens@technikum-wien.at>
|
|
*/
|
|
/**
|
|
* Klasse fuer die Fragen des Reihungstesttools
|
|
*/
|
|
require_once(dirname(__FILE__).'/basis_db.class.php');
|
|
require_once(dirname(__FILE__).'/gebiet.class.php');
|
|
require_once(dirname(__FILE__).'/pruefling.class.php');
|
|
|
|
class frage extends basis_db
|
|
{
|
|
//Tabellenspalten
|
|
public $frage_id;
|
|
public $gebiet_id;
|
|
public $nummer;
|
|
public $demo;
|
|
public $level;
|
|
public $kategorie_kurzbz;
|
|
public $aktiv;
|
|
|
|
public $sprache;
|
|
public $audio;
|
|
public $text;
|
|
public $bild;
|
|
public $pruefling_id;
|
|
public $prueflingfrage_id;
|
|
public $begintime;
|
|
public $endtime;
|
|
|
|
public $insertamum;
|
|
public $updateamum;
|
|
public $insertvon;
|
|
public $updatevon;
|
|
|
|
// ErgebnisArray
|
|
public $result=array();
|
|
public $num_rows=0;
|
|
public $new;
|
|
|
|
/**
|
|
* Konstruktor - Uebergibt die Connection und laedt optional eine frage
|
|
* @param $frage_id Frage die geladen werden soll (default=null)
|
|
*/
|
|
public function __construct($frage_id=null)
|
|
{
|
|
parent::__construct();
|
|
|
|
if(!is_null($frage_id))
|
|
$this->load($frage_id);
|
|
}
|
|
|
|
/**
|
|
* Laedt Frage mit der uebergebenen ID
|
|
* @param $frage_id ID der Frage die geladen werden soll
|
|
*/
|
|
public function load($frage_id)
|
|
{
|
|
if(!is_numeric($frage_id) || $frage_id=='')
|
|
{
|
|
$this->errormsg = 'Frage_id ist ungueltig';
|
|
return false;
|
|
}
|
|
|
|
$qry = "SELECT * FROM testtool.tbl_frage LEFT OUTER JOIN testtool.tbl_frage_sprache USING (frage_id) WHERE frage_id=".$this->db_add_param($frage_id, FHC_INTEGER);
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$this->frage_id = $row->frage_id;
|
|
$this->gebiet_id = $row->gebiet_id;
|
|
$this->nummer = $row->nummer;
|
|
$this->demo = $this->db_parse_bool($row->demo);
|
|
$this->kategorie_kurzbz = $row->kategorie_kurzbz;
|
|
$this->updateamum = $row->updateamum;
|
|
$this->updatevon = $row->updatevon;
|
|
$this->insertamum = $row->insertamum;
|
|
$this->insertvon = $row->insertvon;
|
|
$this->level = $row->level;
|
|
$this->aktiv = $row->aktiv;
|
|
$this->bild = $row->bild;
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = "Kein Eintrag gefunden";
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = "Fehler beim Laden";
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prueft die Variablen vor dem Speichern
|
|
* auf Gueltigkeit.
|
|
* @return true wenn ok, false im Fehlerfall
|
|
*/
|
|
private function validate()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Speichert die Benutzerdaten in die Datenbank
|
|
* Wenn $new auf true gesetzt ist wird ein neuer Datensatz angelegt
|
|
* ansonsten der Datensatz mit $uid upgedated
|
|
* @return true wenn erfolgreich, false im Fehlerfall
|
|
*/
|
|
public function save()
|
|
{
|
|
//Variablen auf Gueltigkeit pruefen
|
|
if(!$this->validate())
|
|
return false;
|
|
|
|
if($this->new) //Wenn new true ist dann ein INSERT absetzen ansonsten ein UPDATE
|
|
{
|
|
$qry = 'BEGIN;INSERT INTO testtool.tbl_frage (kategorie_kurzbz, gebiet_id, level, nummer, demo,
|
|
insertamum, insertvon, aktiv, updateamum, updatevon) VALUES('.
|
|
$this->db_add_param($this->kategorie_kurzbz).','.
|
|
$this->db_add_param($this->gebiet_id, FHC_INTEGER).','.
|
|
$this->db_add_param($this->level).','.
|
|
$this->db_add_param($this->nummer).','.
|
|
$this->db_add_param($this->demo, FHC_BOOLEAN).','.
|
|
$this->db_add_param($this->insertamum).','.
|
|
$this->db_add_param($this->insertvon).','.
|
|
$this->db_add_param($this->aktiv, FHC_BOOLEAN).','.
|
|
'null,null);';
|
|
}
|
|
else
|
|
{
|
|
$qry = 'UPDATE testtool.tbl_frage SET'.
|
|
' gebiet_id='.$this->db_add_param($this->gebiet_id, FHC_INTEGER).','.
|
|
' kategorie_kurzbz='.$this->db_add_param($this->kategorie_kurzbz).','.
|
|
' level='.$this->db_add_param($this->level).','.
|
|
' nummer='.$this->db_add_param($this->nummer).','.
|
|
' demo='.$this->db_add_param($this->demo, FHC_BOOLEAN).','.
|
|
' updateamum='.$this->db_add_param($this->updateamum).','.
|
|
' updatevon='.$this->db_add_param($this->updatevon).','.
|
|
' aktiv='.$this->db_add_param($this->aktiv, FHC_BOOLEAN).
|
|
" WHERE frage_id=".$this->db_add_param($this->frage_id, FHC_INTEGER, false).";";
|
|
}
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
if($this->new)
|
|
{
|
|
$qry = "SELECT currval('testtool.tbl_frage_frage_id_seq') as id";
|
|
if($this->db_query($qry))
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$this->frage_id = $row->id;
|
|
$this->db_query('COMMIT');
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Lesen der Sequence';
|
|
$this->db_query('ROLLBACK');
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Lesen der Sequence';
|
|
$this->db_query('ROLLBACK');
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Speichern der Frage';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Speichert die Frage in der angegebenen Sprache
|
|
*
|
|
* @return true wenn ok, false im Fehlerfall
|
|
*/
|
|
public function save_fragesprache()
|
|
{
|
|
if($this->new) //Wenn new true ist dann ein INSERT absetzen ansonsten ein UPDATE
|
|
{
|
|
$qry = 'INSERT INTO testtool.tbl_frage_sprache (frage_id, sprache, text, bild, audio,
|
|
insertamum, insertvon, updateamum, updatevon) VALUES('.
|
|
$this->db_add_param($this->frage_id, FHC_INTEGER).','.
|
|
$this->db_add_param($this->sprache).','.
|
|
$this->db_add_param($this->text).','.
|
|
$this->db_add_param($this->bild).','.
|
|
$this->db_add_param($this->audio).','.
|
|
$this->db_add_param($this->insertamum).','.
|
|
$this->db_add_param($this->insertvon).','.
|
|
'null,null);';
|
|
}
|
|
else
|
|
{
|
|
$qry = 'UPDATE testtool.tbl_frage_sprache SET'.
|
|
' text='.$this->db_add_param($this->text).','.
|
|
' bild='.$this->db_add_param($this->bild).','.
|
|
' audio='.$this->db_add_param($this->audio).','.
|
|
' updateamum='.$this->db_add_param($this->updateamum).','.
|
|
' updatevon='.$this->db_add_param($this->updatevon).
|
|
" WHERE frage_id=".$this->db_add_param($this->frage_id, FHC_INTEGER, false)." AND sprache=".$this->db_add_param($this->sprache).";";
|
|
}
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Speichern der Frage';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Liefert die Fragen eines Gebietes mit der nummer $nummer
|
|
*
|
|
* @param $gebiet_id
|
|
* @param $nummer
|
|
* @return true wenn ok, sonst false
|
|
*/
|
|
public function getFragen($gebiet_id, $nummer)
|
|
{
|
|
$qry = "SELECT * FROM testtool.tbl_frage
|
|
WHERE gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND nummer=".$this->db_add_param($nummer);
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
while($row = $this->db_fetch_object())
|
|
{
|
|
$obj = new frage();
|
|
|
|
$obj->frage_id = $row->frage_id;
|
|
$obj->kategorie_kurzbz = $row->kategorie_kurzbz;
|
|
$obj->gebiet_id = $row->gebiet_id;
|
|
$obj->level = $row->level;
|
|
$obj->nummer = $row->nummer;
|
|
$obj->demo = $this->db_parse_bool($row->demo);
|
|
$obj->aktiv = $this->db_parse_bool($row->aktiv); //TODO
|
|
|
|
$this->result[] = $obj;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Laden der Daten';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Liefert die Fragen eines Gebietes
|
|
*
|
|
* @param integer $gebiet_id
|
|
* @return true wenn ok, sonst false
|
|
*/
|
|
public function getFragenGebiet($gebiet_id)
|
|
{
|
|
$qry = "SELECT * FROM testtool.tbl_frage
|
|
WHERE gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." ORDER BY nummer";
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
while($row = $this->db_fetch_object())
|
|
{
|
|
$obj = new frage();
|
|
|
|
$obj->frage_id = $row->frage_id;
|
|
$obj->kategorie_kurzbz = $row->kategorie_kurzbz;
|
|
$obj->gebiet_id = $row->gebiet_id;
|
|
$obj->level = $row->level;
|
|
$obj->nummer = $row->nummer;
|
|
$obj->demo = $this->db_parse_bool($row->demo);
|
|
$obj->aktiv = $this->db_parse_bool($row->aktiv);
|
|
|
|
$this->result[] = $obj;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Laden der Daten';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Laedt die naechste Frage eines Gebiets
|
|
*
|
|
* @param $gebiet_id
|
|
* @param $pruefling_id
|
|
* @param $frage_id ID der vorherigen Frage. wenn Null dann wird die erste Frage geliefert
|
|
* @param $demo
|
|
* @param $levelgebiet
|
|
* @return frage_id der naechsten Frage oder false wenn Fehler
|
|
*/
|
|
public function getNextFrage($gebiet_id, $pruefling_id, $frage_id=null, $demo=false, $levelgebiet=false)
|
|
{
|
|
if($demo)
|
|
{
|
|
$qry = "SELECT frage_id FROM testtool.tbl_frage
|
|
WHERE tbl_frage.gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)."
|
|
AND demo ";
|
|
if(!is_null($frage_id))
|
|
$qry.=" AND nummer<(SELECT nummer FROM testtool.tbl_frage WHERE frage_id=".$this->db_add_param($frage_id, FHC_INTEGER).")";
|
|
$qry .= " ORDER BY nummer DESC LIMIT 1";
|
|
}
|
|
else
|
|
{
|
|
$qry = "SELECT frage_id FROM testtool.tbl_pruefling_frage JOIN testtool.tbl_frage USING(frage_id)
|
|
WHERE
|
|
tbl_frage.gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND
|
|
tbl_pruefling_frage.pruefling_id=".$this->db_add_param($pruefling_id, FHC_INTEGER)." AND
|
|
NOT demo ";
|
|
|
|
if(!is_null($frage_id))
|
|
$qry.=" AND tbl_pruefling_frage.nummer>(SELECT nummer FROM testtool.tbl_pruefling_frage WHERE pruefling_id=".$this->db_add_param($pruefling_id, FHC_INTEGER)." AND frage_id=".$this->db_add_param($frage_id, FHC_INTEGER)." LIMIT 1)";
|
|
elseif(is_null($frage_id) && $levelgebiet)
|
|
$qry.=" AND tbl_pruefling_frage.endtime is null";
|
|
|
|
$qry.="ORDER BY tbl_pruefling_frage.nummer ASC LIMIT 1";
|
|
}
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
return $row->frage_id;
|
|
else
|
|
return false;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Laedt die Frage in der angegebenen Sprache
|
|
*
|
|
* @param $frage_id
|
|
* @param $sprache
|
|
* @return true wenn ok, false im Fehlerfall
|
|
*/
|
|
public function getFrageSprache($frage_id, $sprache)
|
|
{
|
|
$qry = "SELECT * FROM testtool.tbl_frage_sprache JOIN testtool.tbl_frage USING(frage_id)
|
|
WHERE frage_id=".$this->db_add_param($frage_id, FHC_INTEGER)." AND sprache=".$this->db_add_param($sprache);
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$this->frage_id = $row->frage_id;
|
|
$this->sprache = $row->sprache;
|
|
$this->text = $row->text;
|
|
$this->bild = $row->bild;
|
|
$this->audio = $row->audio;
|
|
$this->insertaum = $row->insertamum;
|
|
$this->insertvon = $row->insertvon;
|
|
$this->updateamum = $row->updateamum;
|
|
$this->updatevon = $row->updatevon;
|
|
|
|
$this->level = $row->level;
|
|
$this->demo = $this->db_parse_bool($row->demo);
|
|
$this->nummer = $row->nummer;
|
|
$this->aktiv = $this->db_parse_bool($row->aktiv);
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Laden der Frage';
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Laden der Frage';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Liefert das naechste Level zu dem noch Fragen fehlen
|
|
*
|
|
* @param $levelarr Array mit den Levels und der Anzahl der noch zu liefernden Fragen
|
|
* @return naechstes level bzw null wenn keines mehr vorhanden
|
|
*/
|
|
private function getNextFrageLevel($levelarr)
|
|
{
|
|
foreach ($levelarr as $key=>$row)
|
|
{
|
|
if($row>0)
|
|
return $key;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Generiert den Fragenpool fuer den Pruefling bzw
|
|
* die naechste Frage bei gelevelten Gebieten
|
|
*
|
|
* @param $pruefling_id
|
|
* @param $gebiet_id
|
|
*/
|
|
public function generateFragenpool($pruefling_id, $gebiet_id)
|
|
{
|
|
$gebiet = new gebiet($gebiet_id);
|
|
|
|
//Bei Levelgesteuerten Fragen wird nur die erste Frage angelegt
|
|
if($gebiet->level_start!='')
|
|
{
|
|
// Anzahl der bereits vorhandenen Fragen holen
|
|
$qry = "SELECT count(*) as anzahl FROM testtool.tbl_pruefling_frage JOIN testtool.tbl_frage USING(frage_id)
|
|
WHERE gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND pruefling_id=".$this->db_add_param($pruefling_id, FHC_INTEGER);
|
|
if($this->db_query($qry))
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
if($row->anzahl>=$gebiet->maxfragen)
|
|
{
|
|
// maximale Fragenanzahl erreicht
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
$maxfragen=1;
|
|
}
|
|
else
|
|
{
|
|
$maxfragen = $gebiet->maxfragen;
|
|
|
|
// Wie viele Fragen gibt es in diesem Gebiet
|
|
$qry = "SELECT count(*) as anzahl FROM testtool.tbl_frage WHERE NOT demo AND gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER);
|
|
if($this->db_query($qry))
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$fragengesamt = $row->anzahl;
|
|
}
|
|
}
|
|
|
|
// Wenn im Gebiet keine Maximalzahl angegeben ist, dann kommen alle Fragen in den Pool
|
|
if($maxfragen=='')
|
|
{
|
|
$maxfragen = $fragengesamt;
|
|
}
|
|
|
|
$level = array();
|
|
|
|
// Bei Levelgleichverteilung die Anzahl der Fragen pro level ermitteln
|
|
if($gebiet->levelgleichverteilung)
|
|
{
|
|
$qry = "SELECT level, count(*) as anzahl FROM testtool.tbl_frage
|
|
WHERE NOT demo AND gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)."
|
|
GROUP BY level
|
|
ORDER BY level";
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
while($row = $this->db_fetch_object())
|
|
{
|
|
$level[$row->level]=round(($row->anzahl/$fragengesamt)*$maxfragen);
|
|
}
|
|
}
|
|
|
|
// Von jedem Gebiet muss mindestens eine Frage kommen
|
|
foreach ($level as $key=>$row)
|
|
{
|
|
if($level[$key]==0)
|
|
{
|
|
$level[$key]=1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->db_query('BEGIN;');
|
|
|
|
while($maxfragen>0)
|
|
{
|
|
//Bei levelgleichverteilung das Level der naechsten Frage holen
|
|
if($gebiet->levelgleichverteilung)
|
|
{
|
|
$nextlevel=$this->getNextFrageLevel($level);
|
|
if(isset($level[$nextlevel]))
|
|
$level[$nextlevel]=$level[$nextlevel]-1;
|
|
}
|
|
else
|
|
{
|
|
$nextlevel=null;
|
|
}
|
|
|
|
$this->frage_id=$this->getNewFrage($gebiet_id, $pruefling_id, $nextlevel);
|
|
|
|
if($this->frage_id=='')
|
|
break;
|
|
|
|
$this->pruefling_id=$pruefling_id;
|
|
|
|
//hoechste Nummer holen
|
|
$qry = "SELECT
|
|
tbl_pruefling_frage.nummer
|
|
FROM
|
|
testtool.tbl_pruefling_frage JOIN testtool.tbl_frage USING(frage_id)
|
|
WHERE
|
|
tbl_frage.gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND
|
|
tbl_pruefling_frage.pruefling_id=".$this->db_add_param($pruefling_id, FHC_INTEGER)."
|
|
ORDER BY nummer DESC LIMIT 1;";
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
$this->nummer = $row->nummer+1;
|
|
else
|
|
$this->nummer = 1;
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Generieren des Fragenpools';
|
|
$this->db_query('ROLLBACK');
|
|
return false;
|
|
}
|
|
|
|
$this->begintime='';
|
|
$this->endtime='';
|
|
|
|
//PrueflingFrage speichern
|
|
if(!$this->save_prueflingfrage(true))
|
|
{
|
|
$this->db_query('ROLLBACK');
|
|
return false;
|
|
}
|
|
|
|
$maxfragen--;
|
|
}
|
|
|
|
$this->db_query('COMMIT;');
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Laedt eine Prueflingfrage
|
|
*
|
|
* @param $prueflingfrage_id
|
|
* @return true wenn ok, false im Fehlerfall
|
|
*/
|
|
public function load_prueflingfrage($prueflingfrage_id)
|
|
{
|
|
if(!is_numeric($prueflingfrage_id) || $prueflingfrage_id=='')
|
|
{
|
|
$this->errormsg = 'prueflingfrage_id ist ungueltig';
|
|
return false;
|
|
}
|
|
|
|
$qry = "SELECT * FROM testtool.tbl_pruefling_frage WHERE prueflingfrage_id=".$this->db_add_param($prueflingfrage_id, FHC_INTEGER);
|
|
if($this->db_query($qry))
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$this->prueflingfrage_id = $row->prueflingfrage_id;
|
|
$this->pruefling_id = $row->pruefling_id;
|
|
$this->frage_id = $row->frage_id;
|
|
$this->nummer = $row->nummer;
|
|
$this->begintime = $row->begintime;
|
|
$this->endtime = $row->endtime;
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Es wurde keine PrueflingFrage mit der uebergebenen ID gefunden';
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Laden der PrueflingFrage';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Laedt eine Prueflingfrage
|
|
*
|
|
* @param $pruefling_id
|
|
* @param $frage_id
|
|
* @return true wenn ok, false wenn Fehler oder kein Eintrag vorhanden
|
|
*/
|
|
public function getPrueflingfrage($pruefling_id, $frage_id)
|
|
{
|
|
if(!is_numeric($pruefling_id) || $pruefling_id=='')
|
|
{
|
|
$this->errormsg = 'Pruefling_id ist ungueltig';
|
|
return false;
|
|
}
|
|
|
|
if(!is_numeric($frage_id) || $frage_id=='')
|
|
{
|
|
$this->errormsg = 'Frage_id ist ungueltig';
|
|
return false;
|
|
}
|
|
|
|
$qry = "SELECT * FROM testtool.tbl_pruefling_frage WHERE pruefling_id=".$this->db_add_param($pruefling_id, FHC_INTEGER)." AND frage_id=".$this->db_add_param($frage_id, FHC_INTEGER);
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$this->prueflingfrage_id = $row->prueflingfrage_id;
|
|
$this->pruefling_id = $row->pruefling_id;
|
|
$this->frage_id = $row->frage_id;
|
|
$this->nummer = $row->nummer;
|
|
$this->begintime = $row->begintime;
|
|
$this->endtime = $row->endtime;
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Laden der PrueflingFrage';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prueft die Daten vor dem Speichern in die Tabelle tbl_pruefling_frage
|
|
*
|
|
*/
|
|
private function validate_prueflingfrage()
|
|
{
|
|
if(!is_numeric($this->pruefling_id) || $this->pruefling_id=='')
|
|
{
|
|
$this->errormsg = 'Pruefling_id ist ungueltig';
|
|
return false;
|
|
}
|
|
|
|
if(!is_numeric($this->frage_id) || $this->frage_id=='')
|
|
{
|
|
$this->errormsg = 'Frage_id ist ungueltig';
|
|
return false;
|
|
}
|
|
|
|
if(!is_numeric($this->nummer))
|
|
{
|
|
$this->errormsg = 'Nummer ist ungueltig';
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Speichert einen Eintrag in der Tabelle tbl_pruefling_frage
|
|
*
|
|
* @param $new
|
|
*/
|
|
public function save_prueflingfrage($new=null)
|
|
{
|
|
if(!$this->validate_prueflingfrage())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if(is_null($new))
|
|
$new = $this->new;
|
|
|
|
if($new)
|
|
{
|
|
$qry = 'INSERT INTO testtool.tbl_pruefling_frage(pruefling_id, frage_id, nummer, begintime, endtime) VALUES('.
|
|
$this->db_add_param($this->pruefling_id, FHC_INTEGER).','.
|
|
$this->db_add_param($this->frage_id, FHC_INTEGER).','.
|
|
$this->db_add_param($this->nummer).','.
|
|
$this->db_add_param($this->begintime).','.
|
|
$this->db_add_param($this->endtime).');';
|
|
}
|
|
else
|
|
{
|
|
$qry = 'UPDATE testtool.tbl_pruefling_frage SET'.
|
|
' pruefling_id='.$this->db_add_param($this->pruefling_id, FHC_INTEGER).','.
|
|
' frage_id='.$this->db_add_param($this->frage_id, FHC_INTEGER).','.
|
|
' nummer='.$this->db_add_param($this->nummer).','.
|
|
' begintime='.$this->db_add_param($this->begintime).','.
|
|
' endtime='.$this->db_add_param($this->endtime).
|
|
" WHERE prueflingfrage_id=".$this->db_add_param($this->prueflingfrage_id, FHC_INTEGER, false);
|
|
}
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Speichern in tbl_pruefling_frage';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sucht eine neue Frage fuer einen Pruefling
|
|
*
|
|
* @param $gebiet_id
|
|
* @param $pruefling_id
|
|
* @param $level (nur bei Levelgleichverteilung)
|
|
*/
|
|
private function getNewFrage($gebiet_id, $pruefling_id, $level=null)
|
|
{
|
|
$gebiet = new gebiet($gebiet_id);
|
|
$pruefling = new pruefling();
|
|
|
|
|
|
//Frage suchen die dem pruefling noch nicht zugeordnet ist
|
|
$qry = "SELECT frage_id FROM testtool.tbl_frage
|
|
WHERE gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND
|
|
frage_id NOT IN (SELECT frage_id FROM testtool.tbl_pruefling_frage
|
|
WHERE pruefling_id=".$this->db_add_param($pruefling_id, FHC_INTEGER, false)."
|
|
)
|
|
AND NOT demo";
|
|
|
|
// Wenn die Frage abhaengig vom level sein soll, dann den aktuellen Level ermitteln und dazuhaengen
|
|
if($gebiet->level_start!='')
|
|
{
|
|
$level2 = $pruefling->getPrueflingLevel($pruefling_id, $gebiet_id);
|
|
$qry.=" AND level=".$this->db_add_param($level2);
|
|
}
|
|
|
|
// Bei Levelgleichverteilung wird der Level mituebergeben
|
|
if(!is_null($level))
|
|
{
|
|
$qry.=" AND level=".$this->db_add_param($level);
|
|
}
|
|
|
|
//Sortierung
|
|
if($gebiet->zufallfrage)
|
|
$qry .= " ORDER BY random()";
|
|
else
|
|
$qry .= " ORDER BY nummer ASC";
|
|
|
|
$qry .= " LIMIT 1";
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
return $row->frage_id;
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Es gibt keine Fragen die den Kriterien entsprechen';
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim Holen der Frage';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public function delete($frage_id)
|
|
{
|
|
$qry = "SELECT * FROM
|
|
testtool.tbl_antwort
|
|
JOIN testtool.tbl_vorschlag USING(vorschlag_id)
|
|
WHERE tbl_vorschlag.frage_id=".$this->db_add_param($frage_id, FHC_INTEGER);
|
|
if($result = $this->db_query($qry))
|
|
{
|
|
if($this->db_num_rows($result)>0)
|
|
{
|
|
$this->errormsg = 'Frage kann nicht gelöscht werden da bereits Antworten vorhanden sind';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
$qry = "
|
|
DELETE FROM testtool.tbl_vorschlag_sprache WHERE vorschlag_id IN (SELECT vorschlag_id FROM testtool.tbl_vorschlag WHERE frage_id=".$this->db_add_param($frage_id, FHC_INTEGER).");
|
|
DELETE FROM testtool.tbl_vorschlag WHERE frage_id=".$this->db_add_param($frage_id, FHC_INTEGER).";
|
|
DELETE FROM testtool.tbl_frage_sprache WHERE frage_id=".$this->db_add_param($frage_id, FHC_INTEGER).";
|
|
DELETE FROM testtool.tbl_frage WHERE frage_id=".$this->db_add_param($frage_id, FHC_INTEGER);
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg = 'Fehler beim loeschen der Frage';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gibt die Nummer der naechsten Frage zurueck (nicht fuer den test sondern fuer die testtool-administrationsseite)
|
|
*
|
|
* @param $frage_nummer Nummer der aktuellen Frage
|
|
* @param $gebiet_id Gebiet der Fragen
|
|
* @param $aktiv true wenn nur aktiv, false wenn nur inaktiv, null wenn beides
|
|
*/
|
|
public function getNextFrageNummer($frage_nummer, $gebiet_id, $aktiv=null)
|
|
{
|
|
$erg = '';
|
|
$qry = "SELECT nummer FROM testtool.tbl_frage
|
|
WHERE gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)."
|
|
AND nummer>".$this->db_add_param($frage_nummer, FHC_INTEGER);
|
|
|
|
if (!is_null($aktiv) && $aktiv)
|
|
$qry .= " AND aktiv";
|
|
if (!is_null($aktiv) && !$aktiv)
|
|
$qry .= " AND NOT aktiv";
|
|
|
|
$qry .= " ORDER BY nummer ASC LIMIT 1"; //Es wird immer nur ein Maximum geben, deswegen kein max()
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
while($row = $this->db_fetch_object())
|
|
{
|
|
$erg .= $row->nummer;
|
|
}
|
|
return $erg;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gibt die letzte (hoechste) Nummer eines Gebiets zurueck
|
|
*
|
|
* @param integer $gebiet_id Gebiet der Fragen
|
|
* @return integer $number Nummer der letzten Frage des Gebiets, wenn gefunden, sonst false
|
|
*/
|
|
public function getMaxNummer($gebiet_id)
|
|
{
|
|
$number = '';
|
|
$qry = "SELECT nummer FROM testtool.tbl_frage
|
|
WHERE gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." ORDER BY nummer DESC LIMIT 1";
|
|
|
|
if($this->db_query($qry))
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$number = $row->nummer;
|
|
}
|
|
return $number;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
?>
|