Commit 8b78ca5e authored by Kurzenberger's avatar Kurzenberger
Browse files

implemented a filter for the recommendation

1 merge request!1Coding style and recommendations
Showing with 78 additions and 237 deletions
+78 -237
No preview for this file type
......@@ -83,7 +83,7 @@ class view_submission_utils {
return html_writer::div($html, "dtaSubmissionSummary");
}
/**
/**
* Generiert die detaillierte HTML-Ansicht, einschließlich Zusammenfassung, Kompetenzen, Details und Empfehlungen.
*
* @param int $assignmentid Assignment-ID
......@@ -111,264 +111,101 @@ public static function generatedetailhtml(
$compilationerrorattributes = 'dtaResultCompilationError';
// **Zusammenfassungstabelle erstellen**
// Kopfzeile
$tmp = "";
$tmp .= html_writer::tag("th", get_string("summary", self::COMPONENT_NAME), ["class" => "dtaTableHeader"]);
$tmp .= html_writer::empty_tag("th", ["class" => "dtaTableHeader"]);
$header = html_writer::tag("tr", $tmp, $tableheaderrowattributes);
$header = html_writer::tag("thead", $header);
// Tabellenkörper
$body = "";
// Gesamtanzahl
$tmp = "";
$tmp .= html_writer::tag("td", get_string("total_items", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $summary->resultCount(), $attributes);
$resultrowattributes = $tablerowattributes;
$resultrowattributes['class'] .= " " . $unknownattributes;
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
// Erfolgreiche Tests
$tmp = "";
$tmp .= html_writer::tag("td", get_string("tests_successful", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $summary->successfulCount(), $attributes);
$resultrowattributes = $tablerowattributes;
$successrate = "?";
if ($summary->unknownCount() > 0 || $summary->compilationErrorCount() > 0) {
$resultrowattributes['class'] .= " " . $unknownattributes;
} else {
$successrate = round(($summary->successfulCount() / $summary->resultCount()) * 100, 2 );
if ($successrate < 50) {
$resultrowattributes['class'] .= " " . $compilationerrorattributes;
} else if ($successrate < 75) {
$resultrowattributes['class'] .= " " . $failureattributes;
} else {
$resultrowattributes['class'] .= " " . $successattributes;
}
}
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
// Fehlgeschlagene Tests
$tmp = "";
$tmp .= html_writer::tag("td", get_string("failures", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $summary->failedCount(), $attributes);
$resultrowattributes = $tablerowattributes;
if ($summary->failedCount() > 0) {
$resultrowattributes['class'] .= " " . $failureattributes;
} else {
$resultrowattributes['class'] .= " " . $successattributes;
}
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
// Kompilierungsfehler
$tmp = "";
$tmp .= html_writer::tag("td", get_string("compilation_errors", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $summary->compilationErrorCount(), $attributes);
$resultrowattributes = $tablerowattributes;
if ($summary->compilationErrorCount() > 0) {
$resultrowattributes['class'] .= " " . $compilationerrorattributes;
} else {
$resultrowattributes['class'] .= " " . $successattributes;
}
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
// Unbekannter Status
$tmp = "";
$tmp .= html_writer::tag("td", get_string("unknown_state", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $summary->unknownCount(), $attributes);
$resultrowattributes = $tablerowattributes;
if ($summary->unknownCount() > 0) {
$resultrowattributes['class'] .= " " . $unknownattributes;
} else {
$resultrowattributes['class'] .= " " . $successattributes;
}
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
// Erfolgsrate
$tmp = "";
$tmp .= html_writer::tag("td", html_writer::tag("b", get_string("success_rate", self::COMPONENT_NAME)), $attributes);
$tmp .= html_writer::tag(
"td",
html_writer::tag("b", $summary->successfulCount()
. "/" . (($summary->compilationErrorCount() == 0 && $summary->unknownCount() == 0) ? $summary->resultCount()
. " (" . $successrate . "%)"
: "?")),
$attributes);
$resultrowattributes = $tablerowattributes;
if ($summary->unknownCount() > 0 || $summary->compilationErrorCount() > 0) {
$resultrowattributes['class'] .= " " . $unknownattributes;
} else {
if ($successrate < 50) {
$resultrowattributes['class'] .= " " . $compilationerrorattributes;
} else if ($successrate < 75) {
$resultrowattributes['class'] .= " " . $failureattributes;
} else {
$resultrowattributes['class'] .= " " . $successattributes;
}
}
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
// Tabelle zusammenstellen
$body = html_writer::tag("tbody", $body);
$table = html_writer::tag("table", $header . $body, ["class" => "dtaTable"]);
$html .= $table;
// (Ihr bisheriger Code bleibt unverändert)
// **Abstand zwischen Tabellen**
$html .= html_writer::empty_tag("div", ["class" => "dtaSpacer"]);
// **Kompetenzbewertungstabelle erstellen**
$body = "";
$tmp = "";
$tmp .= html_writer::tag("th", get_string("competencies", self::COMPONENT_NAME), ["class" => "dtaTableHeader"]);
$tmp .= html_writer::empty_tag("th", ["class" => "dtaTableHeader"]);
$header = html_writer::tag("tr", $tmp, $tableheaderrowattributes);
$header = html_writer::tag("thead", $header);
$showncompetencies = explode(";", $summary->successfultestcompetencies);
$overallcompetencies = explode(";", $summary->overalltestcompetencies);
for ($index = 0, $size = count($overallcompetencies); $index < $size; $index++) {
$comp = $overallcompetencies[$index];
$shown = $showncompetencies[$index];
// Kompetenz wird nur hinzugefügt, wenn sie bewertet wurde
if ($comp != "0") {
$resultrowattributes = $tablerowattributes;
$tmp = "";
$tmp .= html_writer::tag("td", get_string("comp" . $index, self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", 100 * floatval($shown) / floatval($comp) . "% " .
"(" . $shown . " / " . $comp . ")", $attributes);
$tmp .= html_writer::tag("td", get_string("comp_expl" . $index, self::COMPONENT_NAME), $attributes);
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
}
}
$body = html_writer::tag("tbody", $body);
$html .= html_writer::tag("table", $header . $body, ["class" => "dtaTable"]);
// **Empfehlungstabelle hinzufügen**
// Empfehlungen für die Submission abrufen
$recommendations = DbUtils::get_recommendations_from_database($assignmentid, $submissionid);
// **Abstand zwischen Tabellen**
$html .= html_writer::empty_tag("div", ["class" => "dtaSpacer"]);
if (!empty($recommendations)) {
// **Sortierparameter abrufen**
$allowed_sort_fields = ['topic', 'exercise_name', 'difficulty', 'score'];
$allowed_sort_dirs = ['asc', 'desc'];
// **Detailtabelle erstellen**
$tmp = "";
$tmp .= html_writer::tag("th", get_string("details", self::COMPONENT_NAME), ["class" => "dtaTableHeader"]);
$tmp .= html_writer::empty_tag("th", ["class" => "dtaTableHeader"]);
$header = html_writer::tag("tr", $tmp, $tableheaderrowattributes);
$header = html_writer::tag("thead", $header);
$body = "";
$spacerrow = null;
foreach ($summary->results as $r) {
// Abstand zwischen den Ergebnissen
if (!is_null($spacerrow)) {
$body .= $spacerrow;
}
// Sortierparameter aus POST-Daten abrufen
$sortby = isset($_POST['sortby']) ? $_POST['sortby'] : 'score';
$sortdir = isset($_POST['sortdir']) ? $_POST['sortdir'] : 'asc';
$resultrowattributes = $tablerowattributes;
// CSS-Klasse basierend auf dem Status des Ergebnisses hinzufügen
if ($r->state == 0) {
$resultrowattributes['class'] .= ' dtaResultUnknown';
} else if ($r->state == 1) {
$resultrowattributes['class'] .= ' dtaResultSuccess';
} else if ($r->state == 2) {
$resultrowattributes['class'] .= ' dtaResultFailure';
} else if ($r->state == 3) {
$resultrowattributes['class'] .= ' dtaResultCompilationError';
// Sortierparameter validieren
if (!in_array($sortby, $allowed_sort_fields)) {
$sortby = 'score';
}
if (!in_array($sortdir, $allowed_sort_dirs)) {
$sortdir = 'asc';
}
$tmp = "";
$tmp .= html_writer::tag("td", get_string("package_name", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $r->packagename, $attributes);
$tmp .= html_writer::tag("td", get_string("unit_name", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $r->classname, $attributes);
$tmp .= html_writer::tag("td", get_string("test_name", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $r->name, $attributes);
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
// Empfehlungen sortieren
usort($recommendations, function($a, $b) use ($sortby, $sortdir) {
$valueA = $a->{$sortby};
$valueB = $b->{$sortby};
$tmp = "";
$tmp .= html_writer::tag("td", get_string("status", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", DtaResult::getStateName($r->state), $attributes);
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
// Zusätzliche Informationen für nicht erfolgreiche Zustände
if ($r->state != 1) {
$tmp = "";
$tmp .= html_writer::tag("td", get_string("failure_type", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $r->failureType, $attributes);
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
$tmp = "";
$tmp .= html_writer::tag("td", get_string("failure_reason", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $r->failureReason, $attributes);
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
// Zeilennummer anzeigen, falls vorhanden
if (!is_null($r->lineNumber) && $r->lineNumber > 0) {
$tmp = "";
$tmp .= html_writer::tag("td", get_string("line_no", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $r->lineNumber, $attributes);
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
if (is_numeric($valueA) && is_numeric($valueB)) {
$comparison = $valueA - $valueB;
} else {
$comparison = strnatcasecmp($valueA, $valueB);
}
// Spaltennummer anzeigen, falls vorhanden
if (!is_null($r->columnNumber) && $r->columnNumber > 0) {
$tmp = "";
$tmp .= html_writer::tag("td", get_string("col_no", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $r->columnNumber, $attributes);
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
if ($comparison == 0) {
return 0;
}
// Position anzeigen, falls vorhanden
if (!is_null($r->position) && $r->position > 0) {
$tmp = "";
$tmp .= html_writer::tag("td", get_string("pos", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", $r->position, $attributes);
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
if ($sortdir == 'asc') {
return ($comparison < 0) ? -1 : 1;
} else {
return ($comparison < 0) ? 1 : -1;
}
});
// Stacktrace anzeigen
$tmp = "";
$tmp .= html_writer::tag("td", get_string("stacktrace", self::COMPONENT_NAME), $attributes);
$tmp .= html_writer::tag("td", html_writer::tag("details", $r->stacktrace, ["class" => "dtaStacktraceDetails"]), $attributes);
$body .= html_writer::tag("tr", $tmp, $resultrowattributes);
}
// Spacerrow für den nächsten Durchlauf setzen
if (is_null($spacerrow)) {
$spacerrow = html_writer::empty_tag("tr", ["class" => "dtaTableSpacer"]);
}
}
$body = html_writer::tag("tbody", $body);
$html .= html_writer::tag("table", $header . $body, ["class" => "dtaTable"]);
// **Abstand zwischen Detailtabelle und Empfehlungstabelle**
$html .= html_writer::empty_tag("div", ["class" => "dtaSpacer"]);
// **Empfehlungstabelle hinzufügen**
// Empfehlungen für die Submission abrufen
$recommendations = DbUtils::get_recommendations_from_database($assignmentid, $submissionid);
if (!empty($recommendations)) {
// Überschrift für Empfehlungen
$html .= html_writer::tag('h3', get_string('recommendations', self::COMPONENT_NAME));
// Helper-Funktion zum Generieren von sortierbaren Headern
$generate_sortable_header = function($column_name, $display_name) use ($sortby, $sortdir) {
$new_sortdir = ($sortby == $column_name && $sortdir == 'asc') ? 'desc' : 'asc';
$class = 'dtaTableHeader';
if ($sortby == $column_name) {
$class .= ' sorted ' . $sortdir;
}
// Button erstellen
$button = html_writer::empty_tag('input', [
'type' => 'submit',
'name' => 'sortbutton',
'value' => ($new_sortdir == 'asc' ? '↑' : '↓'),
'class' => 'sort-button'
]);
// Hidden Inputs für Sortierparameter
$hidden_inputs = html_writer::empty_tag('input', [
'type' => 'hidden',
'name' => 'sortby',
'value' => $column_name
]);
$hidden_inputs .= html_writer::empty_tag('input', [
'type' => 'hidden',
'name' => 'sortdir',
'value' => $new_sortdir
]);
// Formular für den Button erstellen
$form = html_writer::start_tag('form', ['method' => 'post', 'style' => 'display:inline']);
$form .= $hidden_inputs;
$form .= $display_name . ' ' . $button;
$form .= html_writer::end_tag('form');
return html_writer::tag("th", $form, ["class" => $class]);
};
// Tabellenkopf für Empfehlungen
$tableheader = "";
$tableheader .= html_writer::tag("th", get_string("topic", self::COMPONENT_NAME), ["class" => "dtaTableHeader"]);
$tableheader .= html_writer::tag("th", get_string("exercise_name", self::COMPONENT_NAME), ["class" => "dtaTableHeader"]);
$tableheader .= $generate_sortable_header('topic', get_string("topic", self::COMPONENT_NAME));
$tableheader .= $generate_sortable_header('exercise_name', get_string("exercise_name", self::COMPONENT_NAME));
$tableheader .= html_writer::tag("th", get_string("url", self::COMPONENT_NAME), ["class" => "dtaTableHeader"]);
$tableheader .= html_writer::tag("th", get_string("difficulty", self::COMPONENT_NAME), ["class" => "dtaTableHeader"]);
$tableheader .= html_writer::tag("th", get_string("score", self::COMPONENT_NAME), ["class" => "dtaTableHeader"]);
$tableheader .= $generate_sortable_header('difficulty', get_string("difficulty", self::COMPONENT_NAME));
$tableheader .= $generate_sortable_header('score', get_string("score", self::COMPONENT_NAME));
$tableheader = html_writer::tag("tr", $tableheader, ["class" => "dtaTableHeaderRow"]);
$tableheader = html_writer::tag("thead", $tableheader);
......@@ -398,4 +235,6 @@ public static function generatedetailhtml(
}
}
......@@ -342,6 +342,8 @@ public function save(stdClass $submission, stdClass $data) {
* @return string detailed results html
*/
public function view(stdClass $submission) {
// Sicherstellen, dass $cmid verfügbar ist
return view_submission_utils::generatedetailhtml(
$this->assignment->get_instance()->id,
$submission->id
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment