Add frontend test view for question sets
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
namespace Komponent\Component\Testquestions\Site\Model;
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
|
||||
|
||||
class SetModel extends BaseDatabaseModel
|
||||
{
|
||||
protected function getSetId(): int
|
||||
{
|
||||
$application = Factory::getApplication();
|
||||
$menu = $application->getMenu()->getActive();
|
||||
$menuSetId = $menu ? (int) $menu->getParams()->get('set_id', 0) : 0;
|
||||
|
||||
return $application->getInput()->getInt('set_id', $menuSetId);
|
||||
}
|
||||
|
||||
public function getSet()
|
||||
{
|
||||
$db = Factory::getContainer()->get('DatabaseDriver');
|
||||
$setId = $this->getSetId();
|
||||
|
||||
if ($setId < 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $db->setQuery(
|
||||
$db->getQuery(true)
|
||||
->select(['s.*', 'sub.title AS subject_title'])
|
||||
->from($db->quoteName('#__testquestions_sets', 's'))
|
||||
->leftJoin($db->quoteName('#__testquestions_subjects', 'sub') . ' ON sub.id = s.subject_id')
|
||||
->where('s.id = ' . $setId)
|
||||
->where('s.published = 1')
|
||||
)->loadObject();
|
||||
}
|
||||
|
||||
public function getItems()
|
||||
{
|
||||
$db = Factory::getContainer()->get('DatabaseDriver');
|
||||
$setId = $this->getSetId();
|
||||
|
||||
if ($setId < 1) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return $db->setQuery(
|
||||
$db->getQuery(true)
|
||||
->select(['q.id', 'q.question_type', 'q.question', 'q.answer_a', 'q.answer_b', 'q.answer_c', 'q.answer_d', 'q.answer_open', 'q.correct_answer', 'q.image'])
|
||||
->from($db->quoteName('#__testquestions_set_questions', 'sq'))
|
||||
->innerJoin($db->quoteName('#__testquestions_questions', 'q') . ' ON q.id = sq.question_id')
|
||||
->where('sq.set_id = ' . $setId)
|
||||
->where('q.published = 1')
|
||||
->order('sq.ordering ASC, q.id ASC')
|
||||
)->loadObjectList();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace Komponent\Component\Testquestions\Site\View\Set;
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
||||
|
||||
class HtmlView extends BaseHtmlView
|
||||
{
|
||||
protected $set;
|
||||
protected $items;
|
||||
protected $results;
|
||||
|
||||
public function display($tpl = null)
|
||||
{
|
||||
$this->set = $this->get('Set');
|
||||
$this->items = $this->get('Items');
|
||||
$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,
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user