annotate test_base.php @ 22:1f375b7d75fd tip

updated warning for breaks during test
author Giulio Moro <giuliomoro@yahoo.it>
date Fri, 13 May 2016 19:01:08 +0100
parents d2eb0e6ccaaf
children
rev   line source
giuliomoro@0 1 <?php
giuliomoro@0 2 function fisherYatesShuffle(&$items, $seed) // http://stackoverflow.com/questions/6557805/randomize-a-php-array-with-a-seed
giuliomoro@0 3 {
giuliomoro@0 4 @mt_srand($seed);
giuliomoro@0 5 for ($i = count($items) - 1; $i > 0; $i--)
giuliomoro@0 6 {
giuliomoro@0 7 $j = @mt_rand(0, $i);
giuliomoro@0 8 $tmp = $items[$i];
giuliomoro@0 9 $items[$i] = $items[$j];
giuliomoro@0 10 $items[$j] = $tmp;
giuliomoro@0 11 }
giuliomoro@0 12 }
giuliomoro@0 13 function url_origin( $s, $use_forwarded_host = false ) //http://stackoverflow.com/questions/6768793/get-the-full-url-in-php
giuliomoro@0 14 {
giuliomoro@0 15 $ssl = ( ! empty( $s['HTTPS'] ) && $s['HTTPS'] == 'on' );
giuliomoro@0 16 $sp = strtolower( $s['SERVER_PROTOCOL'] );
giuliomoro@0 17 $protocol = substr( $sp, 0, strpos( $sp, '/' ) ) . ( ( $ssl ) ? 's' : '' );
giuliomoro@0 18 $port = $s['SERVER_PORT'];
giuliomoro@0 19 $port = ( ( ! $ssl && $port=='80' ) || ( $ssl && $port=='443' ) ) ? '' : ':'.$port;
giuliomoro@0 20 $host = ( $use_forwarded_host && isset( $s['HTTP_X_FORWARDED_HOST'] ) ) ? $s['HTTP_X_FORWARDED_HOST'] : ( isset( $s['HTTP_HOST'] ) ? $s['HTTP_HOST'] : null );
giuliomoro@0 21 $host = isset( $host ) ? $host : $s['SERVER_NAME'] . $port;
giuliomoro@0 22 return $protocol . '://' . $host;
giuliomoro@0 23 }
giuliomoro@0 24
giuliomoro@0 25 function full_url( $s, $use_forwarded_host = false )
giuliomoro@0 26 {
giuliomoro@0 27 return url_origin( $s, $use_forwarded_host ) . $s['REQUEST_URI'];
giuliomoro@0 28 }
giuliomoro@0 29 $toAppendToUrl = '';
giuliomoro@0 30 if(isset($_GET["id"])){
giuliomoro@0 31 $id = $_GET["id"];
giuliomoro@0 32 } else {
giuliomoro@0 33 $max = pow(2, 24);
giuliomoro@0 34 $rand = openssl_random_pseudo_bytes($max);
giuliomoro@0 35 $id = sha1($rand);
giuliomoro@0 36 if(sizeof($_GET) == 0){ // if the query string is empty
giuliomoro@0 37 $toAppendToUrl = '?'; // start the query string
giuliomoro@0 38 } else {
giuliomoro@0 39 $toAppendToUrl = '&'; // otherwise, append to it
giuliomoro@0 40 }
giuliomoro@0 41 $toAppendToUrl .= 'id='.$id;
giuliomoro@0 42 }
giuliomoro@0 43 if(isset($_GET["next"])){
giuliomoro@0 44 $next = $_GET["next"];
giuliomoro@0 45 } else {
giuliomoro@0 46 $next = 0;
giuliomoro@0 47 }
giuliomoro@0 48
giuliomoro@0 49 $absoluteUrl = full_url($_SERVER).$toAppendToUrl;
giuliomoro@0 50 // echo "<br \>".$absoluteUrl."<br \>";
giuliomoro@0 51 // if there is a "next" in the query string, create a version of $absoluteUrl with
giuliomoro@0 52 // next:=next+1
giuliomoro@0 53 $absoluteUrlSplit = explode('?', $absoluteUrl);
giuliomoro@0 54 $absoluteUrlNextPlusOne = $absoluteUrl;
giuliomoro@0 55 if(sizeof($absoluteUrlSplit) === 2){
giuliomoro@0 56 $queryString = $absoluteUrlSplit[1];
giuliomoro@0 57 parse_str($queryString, $queryStringParsed);
giuliomoro@0 58 $queryStringParsed['next'] += 1;
giuliomoro@0 59 $queryString = http_build_query($queryStringParsed);
giuliomoro@0 60 $absoluteUrlNextPlusOne = $absoluteUrlSplit[0]."?".$queryString;
giuliomoro@0 61 }
giuliomoro@0 62 $defaultTestEntry = Array('url' => null, 'string' => null, 'class' => 'disabled', 'a' => false, 'editable' => false);
giuliomoro@0 63
giuliomoro@0 64 require_once('test_list.php'); //this returns $tests
giuliomoro@0 65
giuliomoro@0 66 if($next == sizeof($tests)){
giuliomoro@0 67 // we are done
giuliomoro@0 68 $bottomBox = 'The test is complete, thank you for your participation.';
giuliomoro@0 69 } else {
giuliomoro@0 70 $bottomBox = 'If you want to have a break, come back to this page and continue from where you left, just come back to this URL:<br /><div id="currentUrl">'.$absoluteUrl.'</div>';
giuliomoro@0 71 }
giuliomoro@0 72 // until this point, the content of $tests will always be the same for a given $id,
giuliomoro@0 73 // regardless of how many times we visited this page.
giuliomoro@0 74 for($n = 0; $n < sizeof($tests); $n++ ){
giuliomoro@0 75 //TODO: check if the corresponding file exists
giuliomoro@0 76 // meantime, let us just rely on the GET variable 'next'
giuliomoro@0 77 if($n <= $next){
giuliomoro@0 78 $tests[$n]['a'] = true;
giuliomoro@0 79 $tests[$n]['class'] = 'enabled done';
giuliomoro@0 80 // if we are going to re-run a test, return to the same page
giuliomoro@0 81 $tests[$n]['returnUrl'] = urlencode($absoluteUrl);
giuliomoro@0 82 }
giuliomoro@0 83 if($n == $next){
giuliomoro@0 84 $tests[$n]['editable'] = true;
giuliomoro@0 85 $tests[$n]['class'] = 'enabled editable';
giuliomoro@0 86 // if we are going to run a new test, return to the same page with next:=next+1
giuliomoro@0 87 $tests[$n]['returnUrl'] = urlencode($absoluteUrlNextPlusOne);
giuliomoro@0 88 }
giuliomoro@0 89 }
giuliomoro@0 90 ?>
giuliomoro@0 91 <html>
giuliomoro@0 92 <head>
giuliomoro@0 93 <style>
giuliomoro@0 94 ul.tests-list li{
giuliomoro@0 95 margin: 10px 0 5px 0;
giuliomoro@0 96
giuliomoro@0 97 }
giuliomoro@0 98 .done {
giuliomoro@0 99 list-style-image: url('assets/images/checkbox-checked.png');
giuliomoro@0 100 }
giuliomoro@0 101 .done a {
giuliomoro@0 102 color: green;
giuliomoro@0 103 }
giuliomoro@0 104 .editable{
giuliomoro@0 105 list-style-image: url('assets/images/arrow-checkbox-unchecked.png');
giuliomoro@0 106 list-style-position: inside;
giuliomoro@0 107 margin-left: -30px;
giuliomoro@0 108 }
giuliomoro@0 109 .disabled{
giuliomoro@0 110 color: grey;
giuliomoro@0 111 text-decoration: line-through;
giuliomoro@0 112 list-style-image: url('assets/images/checkbox-unchecked-disabled.png');
giuliomoro@0 113 }
giuliomoro@0 114 #currentUrl{
giuliomoro@0 115 font-weight: bold;
giuliomoro@0 116 padding-left: 20px;
giuliomoro@0 117 padding-top: 5px;
giuliomoro@0 118 }
giuliomoro@0 119
giuliomoro@0 120 </style>
giuliomoro@0 121 <script src="jquery-2.1.4.js"></script>
giuliomoro@0 122 <script>
giuliomoro@0 123 function confirmEditing(e){
giuliomoro@0 124 var message = 'Are you sure you want to edit this item? All previous changes will be lost';
giuliomoro@0 125 return window.confirm(message);
giuliomoro@0 126 }
giuliomoro@0 127 var elements;
giuliomoro@0 128 $(document).ready(function(){
giuliomoro@0 129 lis = $('ul');
giuliomoro@0 130 elements = $('li.done:not(.editable)', lis);
giuliomoro@0 131 for(var n = 0; n < elements.length; n++){
giuliomoro@0 132 elements[n].onclick = confirmEditing;
giuliomoro@0 133 }
giuliomoro@0 134 history.pushState({}, null, location.pathname+location.search+'<?php echo $toAppendToUrl; ?>');
giuliomoro@0 135
giuliomoro@0 136 // elements = $('li:not(.editable.done)', lis);
giuliomoro@0 137 // for(var element in elements){
giuliomoro@0 138 // element.onclick = confirmEditing;
giuliomoro@0 139 // }
giuliomoro@0 140 });
giuliomoro@0 141 </script>
giuliomoro@0 142 </head>
giuliomoro@0 143 <body>
giuliomoro@0 144
giuliomoro@0 145 <ul class = "tests-list">
giuliomoro@0 146 <?php foreach($tests as $n => $test) : ?>
giuliomoro@0 147 <li class="test-element <?php echo $test['class'] ?>">
giuliomoro@0 148 <?php
giuliomoro@0 149 if($test['a'] === true) {
giuliomoro@0 150 // parameters passed to the test are used to keep track of the state and should be returned back to
giuliomoro@0 151 // this page when it is called again.
giuliomoro@0 152 // These parameters are:
giuliomoro@0 153 // id= keeps track of the user and of the sorting of the tests in this page
giuliomoro@0 154 // next= keeps track of the first test not yet undertaken
giuliomoro@0 155
giuliomoro@0 156 echo '<a href="'.$test['url'].'&returnUrl='.$test['returnUrl'].'">'.($n+1).' - '.$test['string'].'</a>';
giuliomoro@0 157 } else {
giuliomoro@0 158 echo ($n+1).' - '.$test['string'];
giuliomoro@0 159 }
giuliomoro@0 160 ?>
giuliomoro@0 161 </li>
giuliomoro@0 162 <?php endforeach; ?>
giuliomoro@0 163 </ul>
giuliomoro@0 164
giuliomoro@0 165 <div id="bottomBox">
giuliomoro@0 166 <?php if($bottomBox!=='') echo $bottomBox ?>
giuliomoro@0 167 </div>
giuliomoro@0 168 </body>
giuliomoro@0 169 </html>