Files
System-testowy/components/com_testquestions/src/View/Questions/HtmlView.php
T
2026-10-15 12:48:46 +02:00

102 lines
3.3 KiB
PHP

<?php
namespace Komponent\Component\Testquestions\Site\View\Questions;
defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
use Joomla\CMS\Factory;
class HtmlView extends BaseHtmlView
{
protected $items;
protected $symbol;
protected $symbols;
protected $results;
public function formatSheetLabel($sheet)
{
$qualification = (string) ($sheet->category_title ?: '');
if (preg_match('/^([A-Z]+)(\d+)$/i', $qualification, $matches)) {
$qualification = strtoupper($matches[1]) . '.' . $matches[2];
}
$months = [
1 => 'Styczeń', 2 => 'Luty', 3 => 'Marzec', 4 => 'Kwiecień',
5 => 'Maj', 6 => 'Czerwiec', 7 => 'Lipiec', 8 => 'Sierpień',
9 => 'Wrzesień', 10 => 'Październik', 11 => 'Listopad', 12 => 'Grudzień',
];
$period = '';
if (preg_match('/-(\d{2})\.(\d{2})$/', (string) $sheet->test_symbol, $matches)) {
$month = (int) $matches[2];
$year = (int) $sheet->exam_year ?: 2000 + (int) $matches[1];
$period = ($months[$month] ?? '') . ' ' . $year;
} elseif ($sheet->exam_year) {
$period = (string) $sheet->exam_year;
}
return trim('Kwalifikacja ' . $qualification . ($period ? ' - ' . $period : '') . ' (' . $sheet->test_symbol . ')');
}
public function display($tpl = null)
{
$this->getDocument()->getWebAssetManager()->registerAndUseStyle(
'com_testquestions.exam',
'media/com_testquestions/egzamin.css'
);
$this->items = $this->get('Items');
$this->symbol = $this->get('State')->get('filter.test_symbol');
$this->symbols = $this->get('TestSymbols');
$this->results = $this->buildResults($this->items);
return parent::display($tpl);
}
protected function buildResults(array $items)
{
$input = Factory::getApplication()->getInput();
if ($input->getCmd('task') !== 'check' || $input->getMethod() !== 'POST') {
return null;
}
$answers = (array) $input->post->get('answers', [], 'array');
$results = [];
$correct = 0;
foreach ($items as $item) {
$selected = isset($answers[$item->id]) ? trim((string) $answers[$item->id]) : '';
$isCorrect = false;
if ($item->question_type === 'open') {
$patterns = preg_split('/\s*\|\s*/', (string) $item->answer_open, -1, PREG_SPLIT_NO_EMPTY);
foreach ($patterns as $pattern) {
if (mb_strtolower(trim($pattern), 'UTF-8') === mb_strtolower($selected, 'UTF-8')) {
$isCorrect = true;
break;
}
}
} else {
$isCorrect = (string) $item->correct_answer === $selected;
}
if ($isCorrect) {
$correct++;
}
$results[$item->id] = [
'selected' => $selected,
'correct' => $isCorrect,
];
}
return [
'items' => $results,
'correct' => $correct,
'total' => count($items),
'percentage' => count($items) ? round(($correct / count($items)) * 100, 2) : 0,
];
}
}