Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
HFTSoftwareProject
MoodleDTA
Commits
8b78ca5e
Commit
8b78ca5e
authored
Oct 16, 2024
by
Kurzenberger
Browse files
implemented a filter for the recommendation
parent
812cd760
Pipeline
#10263
passed with stage
Changes
3
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
dta.zip
View file @
8b78ca5e
No preview for this file type
dta/classes/view.php
View file @
8b78ca5e
...
...
@@ -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(
}
}
dta/locallib.php
View file @
8b78ca5e
...
...
@@ -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
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment