--- /dev/null
+<?php
+
+
+namespace App\Http\Controllers\Admin\Operations;
+
+use App\Http\Middleware\VerifyCsrfToken;
+use App\Models\QuizAttempt;
+use DateTime;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Route;
+
+trait LogOperation
+{
+ protected function setupLogRoutes($segment, $routeName, $controller)
+ {
+ Route::match(['post'], $segment . '/{id}/log', $controller . '@log')->withoutMiddleware([VerifyCsrfToken::class]);
+ }
+
+ protected function log($id)
+ {
+ $request = request();
+
+ $log = new QuizAttempt();
+ $log->quiz = $id;
+ $log->score = $request->get('score');
+ $log->passed = $request->get('passed')?'1':'0';
+ $log->answers = json_encode($request->get('questions'));
+ $log->save();
+
+ return response()->json(['ok' => true])->header('Access-Control-Allow-Origin', '*');
+ }
+}
--- /dev/null
+<?php
+
+namespace App\Models;
+
+use Cubist\Backpack\app\Magic\Models\CubistMagicAbstractModel;
+
+class QuizAttempt extends CubistMagicAbstractModel
+{
+ protected $table = 'quiz_attempt';
+ protected $_options = ['name' => 'quizatttempt',
+ 'singular' => 'quiz attempt',
+ 'plural' => 'quiz attempts'];
+
+ public function setFields()
+ {
+ parent::setFields();
+
+ $this->addField(['type' => 'Number',
+ 'name' => 'quiz',
+ 'label' => 'Quiz ID']);
+
+ $this->addField(['type' => 'Number',
+ 'name' => 'score',
+ 'label' => 'Score']);
+
+ $this->addField(['type' => 'Checkbox',
+ 'name' => 'passed',
+ 'label' => 'Passed']);
+
+ $this->addField(['type' => 'Textarea',
+ 'name' => 'answers',
+ 'label' => 'Answers']);
+ }
+}
var correction = $('<div id="correction"><h2>' + getTranslation('reviewAnswer') + '</h2></div>');
var qn = 1;
+ countQuestions = 0;
// Create questions
$(data).find('questions question').each(function () {
+ if ($(this).attr('count') == '1') {
+ countQuestions++;
+ }
var type = $(this).attr('type');
var multiple = $(this).attr('multiple') == '1';
var multipleclass = multiple ? ' multiple' : '';
- var question = '<section class="question' + multipleclass + '" data-q="' + qn + '" data-type="' + type + '">';
+ var question = '<section class="question' + multipleclass + '" data-count="' + $(this).attr('count') + '" data-q="' + qn + '" data-type="' + type + '">';
question += '<div class="label"><h3>' + sprintf(getTranslation('question'), qn) + '</h3> ' + $(this).find('label').text() + '</div>';
question += '<div class="answers">';
question += '</div>';
qn++;
});
- totalQuestions = (qn - 1);
-
var defaultMessage = $(data).find('defaultMessage').length > 0 && $(data).find('defaultMessage').text() !== '' ? $(data).find('defaultMessage').text() : 'You have finished the quiz!';
var passedMessage = $(data).find('passedMessage').length > 0 && $(data).find('passedMessage').text() !== '' ? $(data).find('passedMessage').text() : defaultMessage;
var failedMessage = $(data).find('failedMessage').length > 0 && $(data).find('failedMessage').text() !== '' ? $(data).find('failedMessage').text() : defaultMessage;
'<h2 class="defaultMessage">' + defaultMessage + '</h2>' +
'<h2 class="passedMessage">' + passedMessage + '</h2>' +
'<h2 class="failedMessage">' + failedMessage + '</h2>' +
- '<div class="content">' + getTranslation('totalQuestions') + ' <span id="totalquestions">' + totalQuestions + '</span><br />' + getTranslation('correctAnswers') + ' <span id="correctanswers"></span></div></div></section>');
+ '<div class="content">' + getTranslation('totalQuestions') + ' <span id="totalquestions">' + countQuestions + '</span><br />' + getTranslation('correctAnswers') + ' <span id="correctanswers"></span></div></div></section>');
$(results).append(correction);
$("main").append(results);
var passed = checkScore();
if (logAttempts) {
- $.ajax('https://toolbox.fluidbook.com/quizlog/',
+ var logdata = {
+ passed: passed,
+ score: Math.round(100 * (score / countQuestions)),
+ questions: logQuestions,
+ };
+
+ $.ajax('https://toolbox.fluidbook.com/quiz/' + $(data).find('id').text() + '/log',
{
- method: 'post',
+ method: 'POST',
data: logdata,
+ crossDomain: true,
}
);
}
}
function checkScore() {
- var normalizedScore = score / totalQuestions;
+ var normalizedScore = score / countQuestions;
$('#results > h2').hide();
var passed;
if (threshold === 0) {
execAction(failedAction);
passed = false;
}
+ return passed;
}
function execAction(action) {
score = 0;
var answers = [];
var qn = 1;
+ logQuestions = [];
$('.question').each(function () {
var a = [];
var ok = true;
+ var count = $(this).attr('data-count') == '1';
+ var log = {
+ 'count': count,
+ };
+
+ if ($(this).data('type') === 'multiple') {
+ $(this).find('.answer').each(function () {
+ var correct = $(this).attr('data-correct') == '1';
+ var active = $(this).hasClass('active');
+ if (correct !== active) {
+ ok = false;
+ }
+ if (active) {
+ a.push($(this).data('a'))
+ }
+ });
+ answers.push(a);
+ log.anwser = a;
+ } else {
+ log.anwser = $(this).find('input').val();
+ }
- $(this).find('.answer').each(function () {
- var correct = $(this).attr('data-correct') == '1';
- var active = $(this).hasClass('active');
- if (correct !== active) {
- ok = false;
- }
- if (active) {
- a.push($(this).data('a'))
- }
- });
- answers.push(a);
var b = $("#correction .correction[data-i='" + qn + "'] .badge");
$(b).removeClass('correct').removeClass('incorrect').addClass(ok ? 'correct' : 'incorrect');
- if (ok) {
+ if (ok && count) {
score++;
+ log.score = 1;
+ } else {
+ log.score = 0;
}
+ logQuestions[qn] = log;
qn++;
});