<commit_before><?php
namespace Zertifizierungstool\Controller;


use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

use Zertifizierungstool\Model\Pruefung;
use Zertifizierungstool\Model\User;
use Zertifizierungstool\Model\Frage;
use Zertifizierungstool\Model\Antwort;
use Zertifizierungstool\Model\Beantwortet;
use Zertifizierungstool\Model\Kurs;
use Zertifizierungstool\Model\SchreibtPruefung;

/**
 * Controller, der Aufgaben verarbeitet, die sich auf die Entitten "Frage" und "Antwort" bzw. "Beantwortet" beziehen.
 * Beinhaltet Actions zum Anlegen, Bearbeiten, Beantworten und Lschen von Fragen und Antworten.
 *
 * @author martin
 */
class FrageController extends AbstractActionController {
	
	private $frage;
	
	public function answerAction() {
		// Alle Fragen zur Prfung laden
		$schreibt_pruefung_id = $this->params()->fromRoute('id');
		$schreibt_pruefung = new SchreibtPruefung();
		$schreibt_pruefung->load($schreibt_pruefung_id);
		
		$fragen = Frage::loadList($schreibt_pruefung->getPruefungId());
		// TODO wenn leer oder Fehler
		
		// Fragen sortieren und in einem Array speichern mit der Frage-Id als Schlssel
		$fragen_map = array();
		
		foreach ($fragen as $frage) {
			$fragen_map[(string)$frage->getId()] = $frage;
		}
		
		ksort($fragen_map);
		
		if (isset($_REQUEST['next_id'])) {
			// 
			$current_question = $_REQUEST['next_id'];
		} else {
			// Es wurde noch keine Frage beantwortet -> Schlssel = Id der ersten Frage im Array
			$current_question = key($fragen_map);
		}

		echo $current_question;
		echo 'vardump:<br>';
		var_dump($fragen_map);
		
		$frage_to_answer = $fragen_map[(string)$current_question];
		
		echo '<br><br>FrageToAnswer';
		echo $frage_to_answer->getText();
		
		// Alle Antworten zu dieser Frage laden
		$antworten = Antwort::loadList($frage_to_answer->getId());
		// TODO wenn leer oder Fehler
		
		// Fr jede Antwortmglichkeit den Eintrag aus der Tabelle 'beantwortet' laden, um die Ankreuzfelder zu befllen
		$beantwortete = array();
		foreach ($antworten as $antwort) {
			$beantwortet = new Beantwortet();
			$beantwortet->load($schreibt_pruefung_id, $antwort->getId());
			array_push($beantwortete, array('antwort' => $antwort, 'status' => $beantwortet->getStatus()));
		}
		
		
		// Ermitteln der nchsten Frage in der Reihenfolge
		while (key($fragen_map) !== (string)$current_question) {
			echo '<br>' .key($fragen_map) != $current_question;
			next($fragen_map);
		}
		if (!next($fragen_map)) {
			// Ende des Array wurde erreicht -> Wieder zurck zur ersten Frage
			reset($fragen_map);
		}
		
		// Nachdem Formular angesendet wurde:
		if ($_REQUEST['speichern']) {
			if ($_REQUEST['typ'] == 'TF') {
				if ($_REQUEST['tf'] == true) {
					$success = Beantwortet::setTrue($schreibt_pruefung_id, $_REQUEST['antwort_id']);
				} else {
					$success = Beantwortet::setFalse($schreibt_pruefung_id, $_REQUEST['antwort_id']);
				}
				
			} else {
				foreach ($antworten as $antwort) {
					if ($_REQUEST['check' .$antwort->getId()]) {
						$success = Beantwortet::setTrue($schreibt_pruefung_id, $antwort->getId());
					} else {
						$success = Beantwortet::setFalse($schreibt_pruefung_id, $antwort->getId());
					}
				}
			}
			
			if ($success) {
				header ("refresh:0; url = /frage/answer/" .$schreibt_pruefung_id .'?next_id=' .key($fragen_map));
			}
			
		}
			
		return new ViewModel([
				'frage'		=> $frage_to_answer,
				'fragen'	=> $fragen,
				'antworten' => $beantwortete,
				'schreibt_pruefung_id' => $schreibt_pruefung_id,
		]);
	}
	private function handleForm($request, $mode) {
		// Array, das mit eventuellen Fehlermeldungen gefllt wird
		$errors = array();
		
		// Diesen Teil doch in die Methoden?
		$this->frage = new Frage();
		$pruefung = new Pruefung();
		if ($mode == PruefungController::editFragen) {
			$frageid = $_REQUEST["id"];
			
			if (empty($frageid)) {
				$frageid = $this->params()->fromRoute('id');
			}
			$this->frage->load($frageid);
			$pruefungid = $this->frage->getPruefungId();
			
		}elseif ($mode == PruefungController::createFragen) {
			$pruefungid = $_REQUEST["pruefung_id"];
			if (empty($pruefungid)) {
				$pruefungid = $this->params()->fromRoute('id');
			}
		}
			
		if (!$pruefung->load($pruefungid)) {
			array_push($errors, "Fehler beim Laden der Prfung!");
		}
		
		$kurs = new Kurs();
		$kurs->load($pruefung->getKursId());
		// Der angemeldete Benutzer muss Admin und/oder Leiter des Kurses sein
		if (!User::currentUser()->istAdmin() && $kurs->getBenutzername() != User::currentUser()->getBenutzername()) {
			array_push($errors, "Sie sind nicht der Leiter dieses Kurses!");
		}
		
		if (strtotime($pruefung->getTermin()) <= time() ) {
			array_push($errors, "Der Prfungszeitraum hat bereits begonnen. Die Prfung kann nicht mehr bearbeitet werden!");
		}
		
		if (empty($errors) && isset($request['speichernFrage'])) {
			// Neues Frage-Objekt mit den Daten aus dem gesendeten Formular erzeugen und in der DB speichern bzw. aktualisieren
			$this->frage = new Frage(
							$request["id"],
							$request["frage_text"],
							$request["punkte"],
							$request["pruefung_id"],
							$request["frage_typ"]);
		
			if (!$this->frage->save()) {
				array_push($errors, "Fehler beim Speichern der Frage. Bitte erneut versuchen!");
				
			}else {
				// Frage konnte gespeichert werden -> Speichern der zugehregen Antwort(en)				
				switch ($request["frage_typ"]) {
					case "TF":
						$status = 0;
						if ($request["tf"] == "true") {
							$status = 1;
						}
				
						$antwort = new Antwort($request["antwort_id"], "", $this->frage->getId(), $status);
				
						if (!$antwort->save()) array_push($errors, "Fehler beim Speichern der Antwort. Bitte erneut versuchen!");
				
						break;
				
					case "MC":
						// Alle Schlssel aus dem Request-Array auslesen, die sich auf die Antworten beziehen
						$id_keys	= preg_grep('/^antwort_id[\d]*/',      array_keys($_REQUEST));
						$text_keys  = preg_grep('/^antwort_text[\d]*/',    array_keys($_REQUEST));
						$check_keys = preg_grep('/^antwort_checked[\d]*/', array_keys($_REQUEST));
						
						print_r($id_keys);
						print_r($text_keys);
						print_r($check_keys);
						
						while (next($id_keys)) {
							$status = 0;
							if ($request[next($check_keys)]) {
								$status = 1;
							}
							
							
							echo 'Status: ' .$request[current($check_keys)];
							
							$antwort = new Antwort(
									$request[current($id_keys)],
									$request[next($text_keys)],
									$this->frage->getId(),
									$status);
						}
						/*
						$index = 1;
						while (!empty($request["antwort_text" .$index])) {
							$status = 0;
							if ($request["antwort_checked" .$index]) {
								$status = 1;
							}
				
							$antwort = new Antwort(
									$request["antwort_id" .$index],
									$request["antwort_text" .$index],
									$this->frage->getId(),
									$status);
								
							if (!$antwort->save()) array_push($errors, "Fehler beim Speichern der Antwort. Bitte erneut versuchen!");
								
							$index++;
						}
						break;
						*/
				}

			}
	
			if (empty($errors)) {
				header ("refresh:0; url = /frage/create/" .$this->frage->getPruefungId());
			}
		}
		
		$viewModel = new ViewModel([
				'pruefung' => $pruefung,
				'fragen'   => Frage::loadList($pruefung->getId()), // Fragen laden -> Was bei Fehler?
				'errors'   => $errors,
				'mode'	   	  => $mode,
				'frageToEdit' => $this->frage
		]);
		
		$viewModel->setTemplate(PruefungController::pathToHtml);
		return $viewModel;
	}
	
	public function createAction() {
		// Berechtigungsprfung
		if (!User::currentUser()->istAdmin() && !User::currentUser()->istZertifizierer()) {
			header ("refresh:0; url = /user/login/");
		}
		
		return $this->handleForm($_REQUEST, PruefungController::createFragen);
	}
	
	public function editAction() {
		// Berechtigungsprfung
		if (!User::currentUser()->istAdmin() && !User::currentUser()->istZertifizierer()) {
			header ("refresh:0; url = /user/login/");
		}
	
		return $this->handleForm($_REQUEST, PruefungController::editFragen);
	}

	
	public function deleteAction() {
		// TODO Berechtigungsprfungen
		// TODO Prfen ob Prfungstermin schon erreicht ist
		// Die Prfung kann dann nicht mehr bearbeitet werden
		$frage_id_toDelete = $this->params()->fromRoute('id');
		$frage = new Frage();
		$frage->load($frage_id_toDelete);
		
		$antwortenToDelete = Antwort::loadList($frage_id_toDelete);
		
		foreach ($antwortenToDelete as $antwort) {
			Antwort::delete($antwort->getId());
			// TODO Fehler abfangen
		}
		
		Frage::delete($frage_id_toDelete);
		// TODO Fehler abfangen
		
		header ("refresh:5; url = /frage/create/" .$frage->getPruefungId());
	}
	
	public function deleteAntwortAction() {
		Antwort::delete($antwort->getId());
		header ("refresh:5; url = /frage/edit/" .$this->params()->fromRoute('id'));
	}
	
	/**
	 * Prft, ob eine bestimmte Frage bei einem bestimmten Prfungsversuch richtig beantwortet wurde.
	 * 
	 * @param $frage_id Id der Frage, die geprft werden soll.
	 * @param $schreibt_pruefung_id Id des Prfungsversuches.
	 * @return boolean true, falls die Frage richtig beantwortet wurde, sonst false.
	 */
	public static function check($frage_id, $schreibt_pruefung_id) {
		// Alle Antwort(en) zur Frage laden
		$antworten = Antwort::loadList($frage_id);
			
		// Zu jeder Antwort den Eintrag in "beantwortet" laden und die abgegebene Antwort berprfen
		foreach ($antworten as $antwort) {
			$beantwortet = new Beantwortet();
			$beantwortet->load($schreibt_pruefung_id, $antwort->getId());
		
			// Wenn mindestens eine Antwort falsch ist, false zurckgeben 
			if ($antwort->getStatus() != $beantwortet->getStatus()) {
				return false;
			}
		}
		
		// Es wurde keine falsche Antwort abgegeben
		return true;
			
	}
}<commit_msg>Daten ausgeben Fehler finden<commit_after><?php
namespace Zertifizierungstool\Controller;


use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

use Zertifizierungstool\Model\Pruefung;
use Zertifizierungstool\Model\User;
use Zertifizierungstool\Model\Frage;
use Zertifizierungstool\Model\Antwort;
use Zertifizierungstool\Model\Beantwortet;
use Zertifizierungstool\Model\Kurs;
use Zertifizierungstool\Model\SchreibtPruefung;

/**
 * Controller, der Aufgaben verarbeitet, die sich auf die Entitten "Frage" und "Antwort" bzw. "Beantwortet" beziehen.
 * Beinhaltet Actions zum Anlegen, Bearbeiten, Beantworten und Lschen von Fragen und Antworten.
 *
 * @author martin
 */
class FrageController extends AbstractActionController {
	
	private $frage;
	
	public function answerAction() {
		// Alle Fragen zur Prfung laden
		$schreibt_pruefung_id = $this->params()->fromRoute('id');
		$schreibt_pruefung = new SchreibtPruefung();
		$schreibt_pruefung->load($schreibt_pruefung_id);
		
		$fragen = Frage::loadList($schreibt_pruefung->getPruefungId());
		// TODO wenn leer oder Fehler
		
		// Fragen sortieren und in einem Array speichern mit der Frage-Id als Schlssel
		$fragen_map = array();
		
		foreach ($fragen as $frage) {
			$fragen_map[(string)$frage->getId()] = $frage;
		}
		
		ksort($fragen_map);
		
		if (isset($_REQUEST['next_id'])) {
			// 
			$current_question = $_REQUEST['next_id'];
		} else {
			// Es wurde noch keine Frage beantwortet -> Schlssel = Id der ersten Frage im Array
			$current_question = key($fragen_map);
		}

		echo $current_question;
		echo 'vardump:<br>';
		var_dump($fragen_map);
		
		$frage_to_answer = $fragen_map[(string)$current_question];
		
		echo '<br><br>FrageToAnswer';
		echo $frage_to_answer->getText();
		
		// Alle Antworten zu dieser Frage laden
		$antworten = Antwort::loadList($frage_to_answer->getId());
		// TODO wenn leer oder Fehler
		
		// Fr jede Antwortmglichkeit den Eintrag aus der Tabelle 'beantwortet' laden, um die Ankreuzfelder zu befllen
		$beantwortete = array();
		foreach ($antworten as $antwort) {
			$beantwortet = new Beantwortet();
			$beantwortet->load($schreibt_pruefung_id, $antwort->getId());
			array_push($beantwortete, array('antwort' => $antwort, 'status' => $beantwortet->getStatus()));
		}
		
		
		// Ermitteln der nchsten Frage in der Reihenfolge
		while (key($fragen_map) !== (string)$current_question) {
			echo '<br>' .key($fragen_map) != $current_question;
			next($fragen_map);
		}
		if (!next($fragen_map)) {
			// Ende des Array wurde erreicht -> Wieder zurck zur ersten Frage
			reset($fragen_map);
		}
		
		// Nachdem Formular angesendet wurde:
		if ($_REQUEST['speichern']) {
			if ($_REQUEST['typ'] == 'TF') {
				if ($_REQUEST['tf'] == true) {
					$success = Beantwortet::setTrue($schreibt_pruefung_id, $_REQUEST['antwort_id']);
				} else {
					$success = Beantwortet::setFalse($schreibt_pruefung_id, $_REQUEST['antwort_id']);
				}
				
			} else {
				foreach ($antworten as $antwort) {
					if ($_REQUEST['check' .$antwort->getId()]) {
						$success = Beantwortet::setTrue($schreibt_pruefung_id, $antwort->getId());
					} else {
						$success = Beantwortet::setFalse($schreibt_pruefung_id, $antwort->getId());
					}
				}
			}
			
			if ($success) {
				header ("refresh:0; url = /frage/answer/" .$schreibt_pruefung_id .'?next_id=' .key($fragen_map));
			}
			
		}
			
		return new ViewModel([
				'frage'		=> $frage_to_answer,
				'fragen'	=> $fragen,
				'antworten' => $beantwortete,
				'schreibt_pruefung_id' => $schreibt_pruefung_id,
		]);
	}
	private function handleForm($request, $mode) {
		// Array, das mit eventuellen Fehlermeldungen gefllt wird
		$errors = array();
		
		// Diesen Teil doch in die Methoden?
		$this->frage = new Frage();
		$pruefung = new Pruefung();
		if ($mode == PruefungController::editFragen) {
			$frageid = $_REQUEST["id"];
			
			if (empty($frageid)) {
				$frageid = $this->params()->fromRoute('id');
			}
			$this->frage->load($frageid);
			$pruefungid = $this->frage->getPruefungId();
			
		}elseif ($mode == PruefungController::createFragen) {
			$pruefungid = $_REQUEST["pruefung_id"];
			if (empty($pruefungid)) {
				$pruefungid = $this->params()->fromRoute('id');
			}
		}
			
		if (!$pruefung->load($pruefungid)) {
			array_push($errors, "Fehler beim Laden der Prfung!");
		}
		
		$kurs = new Kurs();
		$kurs->load($pruefung->getKursId());
		// Der angemeldete Benutzer muss Admin und/oder Leiter des Kurses sein
		if (!User::currentUser()->istAdmin() && $kurs->getBenutzername() != User::currentUser()->getBenutzername()) {
			array_push($errors, "Sie sind nicht der Leiter dieses Kurses!");
		}
		
		if (strtotime($pruefung->getTermin()) <= time() ) {
			array_push($errors, "Der Prfungszeitraum hat bereits begonnen. Die Prfung kann nicht mehr bearbeitet werden!");
		}
		
		if (empty($errors) && isset($request['speichernFrage'])) {
			// Neues Frage-Objekt mit den Daten aus dem gesendeten Formular erzeugen und in der DB speichern bzw. aktualisieren
			echo $request["id"];
			echo $request["frage_text"];
			echo $request["punkte"];
			echo $request["pruefung_id"];
			echo $request["frage_typ"];
			
			
			$this->frage = new Frage(
							$request["id"],
							$request["frage_text"],
							$request["punkte"],
							$request["pruefung_id"],
							$request["frage_typ"]);
		
			if (!$this->frage->save()) {
				array_push($errors, "Fehler beim Speichern der Frage. Bitte erneut versuchen!");
				
			}else {
				// Frage konnte gespeichert werden -> Speichern der zugehregen Antwort(en)				
				switch ($request["frage_typ"]) {
					case "TF":
						$status = 0;
						if ($request["tf"] == "true") {
							$status = 1;
						}
				
						$antwort = new Antwort($request["antwort_id"], "", $this->frage->getId(), $status);
				
						if (!$antwort->save()) array_push($errors, "Fehler beim Speichern der Antwort. Bitte erneut versuchen!");
				
						break;
				
					case "MC":
						// Alle Schlssel aus dem Request-Array auslesen, die sich auf die Antworten beziehen
						$id_keys	= preg_grep('/^antwort_id[\d]*/',      array_keys($_REQUEST));
						$text_keys  = preg_grep('/^antwort_text[\d]*/',    array_keys($_REQUEST));
						$check_keys = preg_grep('/^antwort_checked[\d]*/', array_keys($_REQUEST));
						
						print_r($id_keys);
						print_r($text_keys);
						print_r($check_keys);
						
						while (next($id_keys)) {
							$status = 0;
							if ($request[next($check_keys)]) {
								$status = 1;
							}
							
							
							echo 'Status: ' .$request[current($check_keys)];
							
							$antwort = new Antwort(
									$request[current($id_keys)],
									$request[next($text_keys)],
									$this->frage->getId(),
									$status);
						}
						/*
						$index = 1;
						while (!empty($request["antwort_text" .$index])) {
							$status = 0;
							if ($request["antwort_checked" .$index]) {
								$status = 1;
							}
				
							$antwort = new Antwort(
									$request["antwort_id" .$index],
									$request["antwort_text" .$index],
									$this->frage->getId(),
									$status);
								
							if (!$antwort->save()) array_push($errors, "Fehler beim Speichern der Antwort. Bitte erneut versuchen!");
								
							$index++;
						}
						break;
						*/
				}

			}
	
			if (empty($errors)) {
				header ("refresh:0; url = /frage/create/" .$this->frage->getPruefungId());
			}
		}
		
		$viewModel = new ViewModel([
				'pruefung' => $pruefung,
				'fragen'   => Frage::loadList($pruefung->getId()), // Fragen laden -> Was bei Fehler?
				'errors'   => $errors,
				'mode'	   	  => $mode,
				'frageToEdit' => $this->frage
		]);
		
		$viewModel->setTemplate(PruefungController::pathToHtml);
		return $viewModel;
	}
	
	public function createAction() {
		// Berechtigungsprfung
		if (!User::currentUser()->istAdmin() && !User::currentUser()->istZertifizierer()) {
			header ("refresh:0; url = /user/login/");
		}
		
		return $this->handleForm($_REQUEST, PruefungController::createFragen);
	}
	
	public function editAction() {
		// Berechtigungsprfung
		if (!User::currentUser()->istAdmin() && !User::currentUser()->istZertifizierer()) {
			header ("refresh:0; url = /user/login/");
		}
	
		return $this->handleForm($_REQUEST, PruefungController::editFragen);
	}

	
	public function deleteAction() {
		// TODO Berechtigungsprfungen
		// TODO Prfen ob Prfungstermin schon erreicht ist
		// Die Prfung kann dann nicht mehr bearbeitet werden
		$frage_id_toDelete = $this->params()->fromRoute('id');
		$frage = new Frage();
		$frage->load($frage_id_toDelete);
		
		$antwortenToDelete = Antwort::loadList($frage_id_toDelete);
		
		foreach ($antwortenToDelete as $antwort) {
			Antwort::delete($antwort->getId());
			// TODO Fehler abfangen
		}
		
		Frage::delete($frage_id_toDelete);
		// TODO Fehler abfangen
		
		header ("refresh:5; url = /frage/create/" .$frage->getPruefungId());
	}
	
	public function deleteAntwortAction() {
		Antwort::delete($antwort->getId());
		header ("refresh:5; url = /frage/edit/" .$this->params()->fromRoute('id'));
	}
	
	/**
	 * Prft, ob eine bestimmte Frage bei einem bestimmten Prfungsversuch richtig beantwortet wurde.
	 * 
	 * @param $frage_id Id der Frage, die geprft werden soll.
	 * @param $schreibt_pruefung_id Id des Prfungsversuches.
	 * @return boolean true, falls die Frage richtig beantwortet wurde, sonst false.
	 */
	public static function check($frage_id, $schreibt_pruefung_id) {
		// Alle Antwort(en) zur Frage laden
		$antworten = Antwort::loadList($frage_id);
			
		// Zu jeder Antwort den Eintrag in "beantwortet" laden und die abgegebene Antwort berprfen
		foreach ($antworten as $antwort) {
			$beantwortet = new Beantwortet();
			$beantwortet->load($schreibt_pruefung_id, $antwort->getId());
		
			// Wenn mindestens eine Antwort falsch ist, false zurckgeben 
			if ($antwort->getStatus() != $beantwortet->getStatus()) {
				return false;
			}
		}
		
		// Es wurde keine falsche Antwort abgegeben
		return true;
			
	}
}
{'fraction_non_alphanumeric': 0.14945784897919312, 'fraction_numerical': 0.0012699032919800722, 'mean_word_length': 3.0336879432624113, 'pattern_counts': {'":': 4, '<': 15, '<?xml version=': 0, '>': 167, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6270683', 'n_tokens_mistral': 8845, 'n_tokens_neox': 7299, 'n_words': 1427}