Compare commits

...
1 Commits
Author SHA1 Message Date
Wojtek dfc38e7eb0 Track test execution time 2026-10-15 20:52:15 +02:00
10 changed files with 23 additions and 5 deletions
+2 -1
View File
@@ -16,6 +16,7 @@ Szkielet komponentu Joomla 6 do gromadzenia pytań testowych.
- zegar odliczający czas testu i automatyczne zakończenie po jego upływie,
- zapisywanie wyników testów i zaznaczonych odpowiedzi w bazie danych,
- podgląd zapisanych testów w panelu administratora,
- zapisywanie i wyświetlanie czasu wykonania testu,
- pozycję menu „Arkusz egzaminacyjny” z opcjonalnym symbolem arkusza,
- listę wyboru dostępnych symboli arkuszy na stronie klienckiej,
- możliwość rozwiązania arkusza i wyświetlenia wyniku oraz odpowiedzi poprawnych i zaznaczonych,
@@ -29,6 +30,6 @@ Szkielet komponentu Joomla 6 do gromadzenia pytań testowych.
## Instalacja
W Joomla wybierz **System → Install → Install from Folder** i wskaż ten katalog. Manifestem instalacyjnym jest `com_testquestions.xml` (wersja 1.18.1).
W Joomla wybierz **System → Install → Install from Folder** i wskaż ten katalog. Manifestem instalacyjnym jest `com_testquestions.xml` (wersja 1.19.0).
Po instalacji komponent jest dostępny w panelu administratora jako **Pytania testowe**.
@@ -69,6 +69,7 @@ COM_TESTQUESTIONS_RESULT_PARTICIPANT="Użytkownik"
COM_TESTQUESTIONS_RESULT_SCORE="Wynik"
COM_TESTQUESTIONS_RESULT_DATE="Data zakończenia"
COM_TESTQUESTIONS_RESULT_ANSWERS="Odpowiedzi"
COM_TESTQUESTIONS_RESULT_EXECUTION_TIME="Czas wykonania"
COM_TESTQUESTIONS_RESULTS_SEARCH="Szukaj po użytkowniku lub zestawie..."
COM_TESTQUESTIONS_YOUR_ANSWER="Twoja odpowiedź"
COM_TESTQUESTIONS_SELECTED_ANSWER="Zaznaczona odpowiedź"
@@ -78,6 +78,8 @@ CREATE TABLE IF NOT EXISTS `#__testquestions_results` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`set_id` int unsigned NOT NULL,
`participant_name` varchar(255) NOT NULL DEFAULT '',
`started` datetime NULL DEFAULT NULL,
`execution_time` int unsigned NOT NULL DEFAULT 0,
`extra_time` smallint unsigned NOT NULL DEFAULT 0,
`correct_count` smallint unsigned NOT NULL DEFAULT 0,
`total_count` smallint unsigned NOT NULL DEFAULT 0,
@@ -0,0 +1,3 @@
ALTER TABLE `#__testquestions_results`
ADD COLUMN `started` datetime NULL DEFAULT NULL AFTER `participant_name`,
ADD COLUMN `execution_time` int unsigned NOT NULL DEFAULT 0 AFTER `started`;
@@ -1,12 +1,16 @@
<?php defined('_JEXEC') or die; ?>
<div class="container-fluid">
<dl class="row">
<dt class="col-sm-3"><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_PARTICIPANT'); ?></dt>
<dd class="col-sm-9"><?php echo $this->escape($this->item->participant_name); ?></dd>
<div class="row <?php echo (int) $this->item->extra_time > 0 ? 'table-warning' : ''; ?>">
<dt class="col-sm-3"><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_PARTICIPANT'); ?></dt>
<dd class="col-sm-9"><?php echo $this->escape($this->item->participant_name); ?></dd>
</div>
<dt class="col-sm-3"><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_SET_TITLE'); ?></dt>
<dd class="col-sm-9"><?php echo $this->escape(($this->item->subject_title ? $this->item->subject_title . ' — ' : '') . $this->item->set_title); ?></dd>
<dt class="col-sm-3"><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_SCORE'); ?></dt>
<dd class="col-sm-9"><?php echo (int) $this->item->correct_count; ?> / <?php echo (int) $this->item->total_count; ?> (<?php echo htmlspecialchars((string) $this->item->percentage, ENT_QUOTES, 'UTF-8'); ?>%)</dd>
<dt class="col-sm-3"><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_EXECUTION_TIME'); ?></dt>
<dd class="col-sm-9"><?php echo floor((int) $this->item->execution_time / 60); ?>:<?php echo str_pad((string) ((int) $this->item->execution_time % 60), 2, '0', STR_PAD_LEFT); ?></dd>
</dl>
<h2><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_ANSWERS'); ?></h2>
<?php foreach ($this->item->answers as $questionId => $answer) : ?>
@@ -17,6 +17,7 @@ use Joomla\CMS\Router\Route;
<th><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_PARTICIPANT'); ?></th>
<th><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_SET_TITLE'); ?></th>
<th><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_SCORE'); ?></th>
<th><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_EXECUTION_TIME'); ?></th>
<th><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_DATE'); ?></th>
</tr></thead>
<tbody>
@@ -25,6 +26,7 @@ use Joomla\CMS\Router\Route;
<th><a href="<?php echo Route::_('index.php?option=com_testquestions&view=result&id=' . (int) $item->id); ?>"><?php echo $this->escape($item->participant_name); ?></a></th>
<td><?php echo $this->escape(($item->subject_title ? $item->subject_title . ' — ' : '') . $item->set_title); ?></td>
<td><?php echo (int) $item->correct_count; ?> / <?php echo (int) $item->total_count; ?> (<?php echo htmlspecialchars((string) $item->percentage, ENT_QUOTES, 'UTF-8'); ?>%)</td>
<td><?php echo floor((int) $item->execution_time / 60); ?>:<?php echo str_pad((string) ((int) $item->execution_time % 60), 2, '0', STR_PAD_LEFT); ?></td>
<td><?php echo HTMLHelper::_('date', $item->created, 'Y-m-d H:i'); ?></td>
</tr>
<?php endforeach; ?>
+1 -1
View File
@@ -4,7 +4,7 @@
<creationDate>2026-10-14</creationDate>
<author>Komponent</author>
<license>GNU General Public License version 2 or later</license>
<version>1.18.1</version>
<version>1.19.0</version>
<description>COM_TESTQUESTIONS_DESCRIPTION</description>
<element>com_testquestions</element>
<namespace path="src">Komponent\Component\Testquestions</namespace>
@@ -71,7 +71,7 @@ class SetModel extends BaseDatabaseModel
)->loadObjectList();
}
public function saveResult(string $participantName, int $extraTime, array $result): bool
public function saveResult(string $participantName, int $extraTime, int $startedAt, array $result): bool
{
$db = Factory::getContainer()->get('DatabaseDriver');
$setId = $this->getSetId();
@@ -84,6 +84,8 @@ class SetModel extends BaseDatabaseModel
$row = (object) [
'set_id' => $setId,
'participant_name' => trim($participantName),
'started' => $startedAt > 0 ? gmdate('Y-m-d H:i:s', $startedAt) : null,
'execution_time' => $startedAt > 0 ? max(0, time() - $startedAt) : 0,
'extra_time' => max(0, $extraTime),
'correct_count' => (int) ($result['correct'] ?? 0),
'total_count' => (int) ($result['total'] ?? 0),
@@ -34,6 +34,7 @@ class HtmlView extends BaseHtmlView
$this->getModel()->saveResult(
$input->post->getString('participant_name', ''),
$input->post->getInt('extra_time', 0),
$input->post->getInt('test_started_at', 0),
$this->results
);
}
@@ -31,6 +31,7 @@ use Joomla\CMS\Factory;
</select>
</div>
<input type="submit" class="egzamin" value="<?php echo htmlspecialchars(\Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_START_TEST'), ENT_QUOTES, 'UTF-8'); ?>">
<input type="hidden" name="test_started_at" value="<?php echo time(); ?>">
</form>
<?php endif; ?>
<?php if (!$this->started) : ?>
@@ -96,6 +97,7 @@ use Joomla\CMS\Factory;
<input type="hidden" name="set_id" value="<?php echo (int) $this->set->id; ?>">
<input type="hidden" name="participant_name" value="<?php echo htmlspecialchars(Factory::getApplication()->getInput()->post->getString('participant_name', ''), ENT_QUOTES, 'UTF-8'); ?>">
<input type="hidden" name="extra_time" value="<?php echo (int) $extraTime; ?>">
<input type="hidden" name="test_started_at" value="<?php echo (int) Factory::getApplication()->getInput()->post->getInt('test_started_at', time()); ?>">
<input type="hidden" name="task" value="check">
<?php echo \Joomla\CMS\HTML\HTMLHelper::_('form.token'); ?>
<?php if (!$this->results) : ?>