Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f3efb81af4 |
@@ -30,6 +30,6 @@ Szkielet komponentu Joomla 6 do gromadzenia pytań testowych.
|
|||||||
|
|
||||||
## Instalacja
|
## Instalacja
|
||||||
|
|
||||||
W Joomla wybierz **System → Install → Install from Folder** i wskaż ten katalog. Manifestem instalacyjnym jest `com_testquestions.xml` (wersja 1.19.1).
|
W Joomla wybierz **System → Install → Install from Folder** i wskaż ten katalog. Manifestem instalacyjnym jest `com_testquestions.xml` (wersja 1.20.0).
|
||||||
|
|
||||||
Po instalacji komponent jest dostępny w panelu administratora jako **Pytania testowe**.
|
Po instalacji komponent jest dostępny w panelu administratora jako **Pytania testowe**.
|
||||||
|
|||||||
@@ -70,6 +70,9 @@ COM_TESTQUESTIONS_RESULT_SCORE="Wynik"
|
|||||||
COM_TESTQUESTIONS_RESULT_DATE="Data zakończenia"
|
COM_TESTQUESTIONS_RESULT_DATE="Data zakończenia"
|
||||||
COM_TESTQUESTIONS_RESULT_ANSWERS="Odpowiedzi"
|
COM_TESTQUESTIONS_RESULT_ANSWERS="Odpowiedzi"
|
||||||
COM_TESTQUESTIONS_RESULT_EXECUTION_TIME="Czas wykonania"
|
COM_TESTQUESTIONS_RESULT_EXECUTION_TIME="Czas wykonania"
|
||||||
|
COM_TESTQUESTIONS_RESULT_AWARDED_POINTS="Uznane punkty"
|
||||||
|
COM_TESTQUESTIONS_RESULT_COMMENT="Komentarz"
|
||||||
|
COM_TESTQUESTIONS_RESULT_SAVED="Dane wyniku zostały zapisane."
|
||||||
COM_TESTQUESTIONS_RESULTS_SEARCH="Szukaj po użytkowniku lub zestawie..."
|
COM_TESTQUESTIONS_RESULTS_SEARCH="Szukaj po użytkowniku lub zestawie..."
|
||||||
COM_TESTQUESTIONS_YOUR_ANSWER="Twoja odpowiedź"
|
COM_TESTQUESTIONS_YOUR_ANSWER="Twoja odpowiedź"
|
||||||
COM_TESTQUESTIONS_SELECTED_ANSWER="Zaznaczona odpowiedź"
|
COM_TESTQUESTIONS_SELECTED_ANSWER="Zaznaczona odpowiedź"
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
-- Per-question awarded points and comments are stored in the existing answers JSON column.
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Komponent\Component\Testquestions\Administrator\Controller;
|
||||||
|
|
||||||
|
defined('_JEXEC') or die;
|
||||||
|
|
||||||
|
use Joomla\CMS\Factory;
|
||||||
|
use Joomla\CMS\Language\Text;
|
||||||
|
use Joomla\CMS\MVC\Controller\BaseController;
|
||||||
|
use Joomla\CMS\Router\Route;
|
||||||
|
use Joomla\CMS\Session\Session;
|
||||||
|
|
||||||
|
class ResultController extends BaseController
|
||||||
|
{
|
||||||
|
public function save(): void
|
||||||
|
{
|
||||||
|
if (!Session::checkToken()) {
|
||||||
|
throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$input = Factory::getApplication()->getInput();
|
||||||
|
$id = $input->post->getInt('id');
|
||||||
|
$points = (array) $input->post->get('awarded_points', [], 'array');
|
||||||
|
$comments = (array) $input->post->get('comments', [], 'array');
|
||||||
|
$model = $this->getModel('Result');
|
||||||
|
|
||||||
|
if (!$model->saveAssessment($id, $points, $comments)) {
|
||||||
|
throw new \RuntimeException(Text::_('COM_TESTQUESTIONS_RESULT_NOT_FOUND'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->setRedirect(
|
||||||
|
Route::_('index.php?option=com_testquestions&view=result&id=' . $id, false),
|
||||||
|
Text::_('COM_TESTQUESTIONS_RESULT_SAVED')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,7 +33,7 @@ class ResultModel extends BaseDatabaseModel
|
|||||||
if ($ids) {
|
if ($ids) {
|
||||||
$item->questions = $db->setQuery(
|
$item->questions = $db->setQuery(
|
||||||
$db->getQuery(true)
|
$db->getQuery(true)
|
||||||
->select(['id', 'question_type', 'question', 'answer_a', 'answer_b', 'answer_c', 'answer_d', 'answer_open', 'correct_answer'])
|
->select(['id', 'question_type', 'question', 'answer_a', 'answer_b', 'answer_c', 'answer_d', 'answer_open', 'correct_answer', 'points'])
|
||||||
->from($db->quoteName('#__testquestions_questions'))
|
->from($db->quoteName('#__testquestions_questions'))
|
||||||
->where('id IN (' . implode(',', $ids) . ')')
|
->where('id IN (' . implode(',', $ids) . ')')
|
||||||
)->loadObjectList('id');
|
)->loadObjectList('id');
|
||||||
@@ -41,4 +41,28 @@ class ResultModel extends BaseDatabaseModel
|
|||||||
|
|
||||||
return $item;
|
return $item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function saveAssessment(int $id, array $awardedPoints, array $comments): bool
|
||||||
|
{
|
||||||
|
$item = $this->getItem($id);
|
||||||
|
|
||||||
|
if (!$item) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($item->answers as $questionId => &$answer) {
|
||||||
|
$key = (string) $questionId;
|
||||||
|
$answer['awarded_points'] = max(0, (int) ($awardedPoints[$key] ?? 0));
|
||||||
|
$answer['comment'] = trim((string) ($comments[$key] ?? ''));
|
||||||
|
}
|
||||||
|
unset($answer);
|
||||||
|
|
||||||
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
||||||
|
$row = (object) [
|
||||||
|
'id' => $id,
|
||||||
|
'answers' => json_encode($item->answers, JSON_UNESCAPED_UNICODE),
|
||||||
|
];
|
||||||
|
|
||||||
|
return (bool) $db->updateObject('#__testquestions_results', $row, 'id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
<?php defined('_JEXEC') or die; ?>
|
<?php defined('_JEXEC') or die; ?>
|
||||||
|
<?php use Joomla\CMS\HTML\HTMLHelper; ?>
|
||||||
|
<?php use Joomla\CMS\Router\Route; ?>
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<dl class="row">
|
<dl class="row">
|
||||||
<div class="row"<?php echo (int) $this->item->extra_time > 0 ? ' style="background-color: #fff3cd;"' : ''; ?>>
|
<div class="row"<?php echo (int) $this->item->extra_time > 0 ? ' style="background-color: #fff3cd;"' : ''; ?>>
|
||||||
@@ -12,6 +14,7 @@
|
|||||||
<dt class="col-sm-3"><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_EXECUTION_TIME'); ?></dt>
|
<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>
|
<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>
|
</dl>
|
||||||
|
<form action="<?php echo Route::_('index.php?option=com_testquestions&view=result&id=' . (int) $this->item->id); ?>" method="post" name="resultForm" id="result-form">
|
||||||
<h2><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_ANSWERS'); ?></h2>
|
<h2><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_ANSWERS'); ?></h2>
|
||||||
<?php foreach ($this->item->answers as $questionId => $answer) : ?>
|
<?php foreach ($this->item->answers as $questionId => $answer) : ?>
|
||||||
<?php $question = $this->item->questions[(int) $questionId] ?? null; if (!$question) continue; ?>
|
<?php $question = $this->item->questions[(int) $questionId] ?? null; if (!$question) continue; ?>
|
||||||
@@ -25,6 +28,21 @@
|
|||||||
<div><strong><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_CORRECT_ANSWER'); ?>:</strong> <?php echo chr(64 + (int) $question->correct_answer); ?></div>
|
<div><strong><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_CORRECT_ANSWER'); ?>:</strong> <?php echo chr(64 + (int) $question->correct_answer); ?></div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<div class="mt-2 <?php echo !empty($answer['correct']) ? 'text-success' : 'text-danger'; ?>"><?php echo !empty($answer['correct']) ? '✓ ' . \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_ANSWER_CORRECT') : '✗ ' . \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_ANSWER_INCORRECT'); ?></div>
|
<div class="mt-2 <?php echo !empty($answer['correct']) ? 'text-success' : 'text-danger'; ?>"><?php echo !empty($answer['correct']) ? '✓ ' . \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_ANSWER_CORRECT') : '✗ ' . \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_ANSWER_INCORRECT'); ?></div>
|
||||||
|
<div class="row mt-3">
|
||||||
|
<div class="col-md-3">
|
||||||
|
<label for="awarded-points-<?php echo (int) $questionId; ?>" class="form-label"><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_AWARDED_POINTS'); ?></label>
|
||||||
|
<input type="number" min="0" name="awarded_points[<?php echo (int) $questionId; ?>]" id="awarded-points-<?php echo (int) $questionId; ?>" class="form-control" value="<?php echo (int) ($answer['awarded_points'] ?? 0); ?>">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-9">
|
||||||
|
<label for="result-comment-<?php echo (int) $questionId; ?>" class="form-label"><?php echo \Joomla\CMS\Language\Text::_('COM_TESTQUESTIONS_RESULT_COMMENT'); ?></label>
|
||||||
|
<textarea name="comments[<?php echo (int) $questionId; ?>]" id="result-comment-<?php echo (int) $questionId; ?>" class="form-control" rows="2"><?php echo htmlspecialchars((string) ($answer['comment'] ?? ''), ENT_QUOTES, 'UTF-8'); ?></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</article>
|
</article>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
<button type="submit" class="btn btn-primary"><?php echo \Joomla\CMS\Language\Text::_('JSAVE'); ?></button>
|
||||||
|
<input type="hidden" name="task" value="result.save">
|
||||||
|
<input type="hidden" name="id" value="<?php echo (int) $this->item->id; ?>">
|
||||||
|
<?php echo HTMLHelper::_('form.token'); ?>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<creationDate>2026-10-14</creationDate>
|
<creationDate>2026-10-14</creationDate>
|
||||||
<author>Komponent</author>
|
<author>Komponent</author>
|
||||||
<license>GNU General Public License version 2 or later</license>
|
<license>GNU General Public License version 2 or later</license>
|
||||||
<version>1.19.1</version>
|
<version>1.20.0</version>
|
||||||
<description>COM_TESTQUESTIONS_DESCRIPTION</description>
|
<description>COM_TESTQUESTIONS_DESCRIPTION</description>
|
||||||
<element>com_testquestions</element>
|
<element>com_testquestions</element>
|
||||||
<namespace path="src">Komponent\Component\Testquestions</namespace>
|
<namespace path="src">Komponent\Component\Testquestions</namespace>
|
||||||
|
|||||||
Reference in New Issue
Block a user