Wikiquiz - Quiz.php

From ChekMate Security Group

<?php

#apd_set_pprof_trace();
# Main wiki script; see design.doc
#
$wgRequestTime = microtime();

unset( $IP );
@ini_set( 'allow_url_fopen', 0 ); # For security...
if( !file_exists( '../LocalSettings.php' ) ) {
  if ( file_exists( '../config/LocalSettings.php' ) ) {
    die( "To complete the installation, move <tt>config/LocalSettings.php</tt> to the parent directory.\n" );
  } else {
    die( "You'll have to <a href='config/index.php'>set the wiki up</a> first!" );
  }
}

# Valid web server entry point, enable includes.
# Please don't move this line to includes/Defines.php. This line essentially defines
# a valid entry point. If you put it in includes/Defines.php, then any script that includes
# it becomes an entry point, thereby defeating its purpose.
define( 'MEDIAWIKI', true );

require_once( '../includes/Defines.php' );
require_once( '../LocalSettings.php' );
require_once( '../includes/Setup.php' );

wfProfileIn( 'main-misc-setup' );
OutputPage::setEncodings(); # Not really used yet

# Debug statement for user levels
# print_r($wgUser);

# If the user is not logged in, the Namespace:title of the article must be in
# the Read array in order for the user to see it. (We have to check here to
# catch special pages etc. We check again in Article::view())
if ( !is_null( $wgTitle ) && !$wgTitle->userCanRead() ) {
$wgOut->loginToUse();
$wgOut->output();
exit;
}

if ($wgUser->getID() != 0) {
$wgOut->setArticleFlag( false );

$wgTitle = Title::makeTitle( NS_SPECIAL, "Custom" );

$wgOut->setArticleRelated( false );
$wgOut->setRobotPolicy( "noindex,follow" );

############################################
# Start of wrapper - insert code below
############################################

////////////////////////////////////////////////////////////
//
// xmlQuiz v1.1 - a simple quiz script
//
////////////////////////////////////////////////////////////
//
// This script allows you to quiz users on any number of
// questions and calculate the score.
//
// See readme.txt for more information.
//
// Author: Jon Thomas <http://www.fromthedesk.com/>
// Last Modified: 12/18/2005
//
// You may freely use, modify, and distribute this script.
//
////////////////////////////////////////////////////////////

//
// SET VARIABLES
//

// name of XML file which contains your quiz data
$xmlFile = "Quiz.xml";

//
// GET QUIZ DATA
//

// get XML data
$data = implode("", file($xmlFile));

// create XML parser
$parser = xml_parser_create();

// set parser options
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);

// parse XML data into arrays
xml_parse_into_struct($parser, $data, $values, $tags);

// free parser
xml_parser_free($parser);

//
// STRUCTURE XML DATA INTO ARRAY
//

// set counter variable for to-be-created questions array
$questionNo = 0;

// cycle through parsed XML data to look for text and answer tags
foreach ($values as $key=>$val) {

        // a TITLE tag
        if ($val[tag] == "TITLE") {
                $wTitle = $val[value];
        }

        // save value to "questions" array if this is a TEXT tag
        if ($val[tag] == "TEXT") {
                $questions[$questionNo]['text'] = $val[value];
        }

        // save value to "questions" array if this is a CHOICES tag
        if ($val[tag] == "CHOICES") {
                $questions[$questionNo]['choices'] = $val[value];
        }

        // save value to "questions" array if this is an ANSWER tag
        if ($val[tag] == "ANSWER") {
                $questions[$questionNo]['answer'] = $val[value];

                // increment question counter variable
                $questionNo++;
        }
}

//
// IMPORT POST VARIABLES
//

import_request_variables("p", "post_");

//
// PRINT FIRST QUESTION
//

if (!isset($post_answers)) {
        $wtext .= "== Question 1 of " . ($questionNo) . ": ==\n\n";
        $wtext .= "<b>" . $questions[0]['text'] . "</b>\n";
        $text .= "<form action=\"$PHP_SELF\" method=\"post\">\n";

        // split choices into "choices" array
        $choices = explode(", ", $questions[0]['choices']);

        // print text field if there are no choices
        if (count($choices) == 1) {
                $text .= "<input type=\"text\" name=\"answers[0]\" size=10>\n";
        }

        // print radio fields if there are multiple choices
        else {
                // print a radio button for each choice
                for ($i = 0; $i < count($choices); $i++) {
                        $text .= "<input type=\"radio\" name=\"answers[0]\" value=\"" . $choices[$i] . "\"> " . $choices[$i] . "<br>\n";
                }
        }

        $text .= "<input type=\"submit\" value=\"Next Question\">\n";
        $text .= "</form>\n";
}


//
// PRINT NEXT QUESTION
//

elseif (count($questions) > count($post_answers)) {
        // get number of next question
        $nextQuestion = count($post_answers);

        // print question
        $wtext .= "== Question " . ($nextQuestion + 1) .  " of " . ($questionNo) . " ==\n\n";
        $wtext .= "<b>" . $questions[$nextQuestion]['text'] . "</b>\n";
        $text .= "<form action=\"$PHP_SELF\" method=\"post\">\n";

        // print answers to previous questions as hidden form fields
        for ($i = 0; $i < count($post_answers); $i++) {
                $text .= "<input type=\"hidden\" name=\"answers[$i]\" value=\"$post_answers[$i]\">\n";
        }

        // split choices into "choices" array
        $choices = explode(", ", $questions[$nextQuestion]['choices']);

        // print text field if there are no choices
        if (count($choices) == 1) {
                $text .= "<input type=\"text\" name=\"answers[$nextQuestion]\" size=10>\n";
        }

        // print radio fields if there are multiple choices
        else {
                // print a radio button for each choice
                for ($i = 0; $i < count($choices); $i++) {
                        $text .= "<input type=\"radio\" name=\"answers[$nextQuestion]\" value=\"" . $choices[$i] . "\">" . $choices[$i] . "<br>\n";
                }
        }

        // print appropriate button label
        if (count($questions) == count($post_answers) + 1) {
                $text .= "<input type=\"submit\" value=\"Calculate Score\">\n";
        }
        else {
                $text .= "<input type=\"submit\" value=\"Next Question\">\n";
        }

        $text .= "</form>\n";
}


//
// CALCULATE AND PRINT SCORE
//

else {
        // get number of questions
        $noQuestions = count($questions);

        // get number of correct answers
        for ($i = 0; $i < $noQuestions; $i++) {
                // increment "noCorrectAnswers" variable if user has correct answer
                if ($questions[$i]['answer'] == $post_answers[$i]) {
                        $noCorrectAnswers++;
                }
        }

        // calculate score
        $score = ($noCorrectAnswers / $noQuestions) * 100;

        // round score to nearest whole precentage point
        $score = round($score);

        // print score
        $wtext .= "__NOTOC__\n== Quiz Results ==\n";
        $wtext .= "=== You have scored $score% on this quiz.===\n";

        if ($noCorrectAnswers == 0) {
                $text .= "<p>You answered no questions correctly.  <a href=" . $PHP_SELF . ">Try again.</a></p>";
                $text .= "<p>Return to the <a href=\"/wiki/index.php\">Main Page</a></p>";
        }

        if ($noCorrectAnswers == 1) {
                $text .= "<p>You answered 1 out of $noQuestions questions correctly.  <a href=" . $PHP_SELF . ">Try again.</a></p>";
                $text .= "<p>Return to the <a href=\"/wiki/index.php\">Main Page</a></p>";
        }

        if ($noCorrectAnswers > 1 && $noCorrectAnswers < $noQuestions) {
                $text .= "<p>You answered $noCorrectAnswers out of $noQuestions questions correctly.  <a href=" . $PHP_SELF . ">Try again.</a></p>";
                $text .= "<p>Return to the <a href=\"/wiki/index.php\">Main Page</a></p>";
        }

        if ($noCorrectAnswers == $noQuestions) {
                $text .= "<p>You answered all questions correctly!</p>";
                $text .= "<p>Return to the <a href=\"/wiki/index.php\">Main Page</a></p>";

        }

        for ($i = 0; $i < $noQuestions; $i++) {

          // print question
          $wtext .= "== Question " . ($i + 1) . " ==\n\n";
          $wtext .= "<b>" . $questions[$i]['text'] . "</b>\n";

          // split choices into "choices" array
          $choices = explode(", ", $questions[$i]['choices']);

          // print radio fields if there are multiple choices


        // print text field if there are no choices
        if (count($choices) == 1) {
           if ($post_answers[$i] == $questions[$i]['answer']) {
                $wtext .= "<ul><li><b>" . $post_answers[$i]. "</b> <font color=blue><b>CORRECT</b></font><br></ul>\n";
           } else {
                $wtext .= "<ul><li><b>" . $post_answers[$i]. "</b> <font color=red><b>INCORRECT</b></font><br></ul>\n";
           }
        } else {

                $wtext .= "<ul>\n";
                // print a radio button for each choice
                for ($x = 0; $x < count($choices); $x++) {

                if (($questions[$i]['answer'] == $post_answers[$i]) && ($post_answers[$i] == $choices[$x])) {
                   $wtext .=  "<li> <b>" . $choices[$x] . "</b> <font color=blue><b>CORRECT</b></font><br>\n";
                } else {
                   if ($post_answers[$i] == $choices[$x]) {
                     $wtext .=  "<li> <b>" . $choices[$x] . "</b> <font color=red><b>INCORRECT</b></font><br>\n";
                   } else {
                     $wtext .=  "<li> " . $choices[$x] . "<br>\n";
                   }

                }
        }
                $wtext .= "</ul>\n";
        }
 }


}

############################################
# End of wrapper - insert code above
############################################

$wgOut->setPageTitle($wTitle);

$wgOut->addWikiText( "<br clear=all>\n" );
$wgOut->addWikiText( $wtext );
$wgOut->addWikiText( "<br clear=all>\n" );


$wgOut->addHTML( $text );
$wgOut->output();
exit;

} else {
$wgOut->loginToUse();
$wgOut->output();
exit;
}
?>