Отправка результатов MyTestXPro методом POST на веб-сервер в Интернет: различия между версиями

Материал из MyTestXPro Wiki Help
Перейти к навигации Перейти к поиску
(не показаны 23 промежуточные версии этого же участника)
Строка 14: Строка 14:
 
<pre>
 
<pre>
 
<?php
 
<?php
   # скрипт для приёма и сохранения результатов тестирования от модуля тестирования или автономного теста MyTestXPro методом POST
+
   ## MyTestXPro http://mytestx.pro
   # в настройках программы в "настройки POST" адрес указыаем типа  
+
  ## скрипт для приёма и сохранения результатов тестирования от модуля тестирования или автономного теста MyTestXPro методом POST
   # http://ВАШ-САЙТ/E86D3AB5-2F02-4E8F-8F50-349656C9272E/SaveResult.php.php?key=8F480FED-621A-41E1-8CB7-E6D4CC9DB76B
+
   ## в настройках программы MyTestXPro (точнее в модуле тестирования) в "настройки POST" адрес указываем типа  
 
+
   ## http://ВАШ-САЙТ/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/SaveResult.php?key=8F480FED-621A-41E1-8CB7-E6D4CC9DB76B
   //можно проверить ключ (произвольная переменная (метод GET) в адресе скрипта)
+
 
   if ($_GET['key'] != '8F480FED-621A-41E1-8CB7-E6D4CC9DB76B') return;  
+
   # можно проверить ключ (произвольная переменная (метод GET) в адресе скрипта)
 
+
   //if ($_GET['key'] != '8F480FED-621A-41E1-8CB7-E6D4CC9DB76B') return;  
   //проверка связи
+
 
   if($_POST['Test'] == 'Test'){  
+
   # проверка связи
 +
   if(isset($_POST['Test']) and $_POST['Test'] == 'Test'){  
 
     echo 'OK';
 
     echo 'OK';
 
     return;
 
     return;
 
   }
 
   }
 +
  # проверка данных
 +
  if(!isset($_POST['UId'])){
 +
    echo 'Нет данных!';
 +
    return;
 +
  }
 +
 +
  # временная зона
 +
  date_default_timezone_set('Europe/Moscow'); 
 
    
 
    
   //папка с результатами (не забудьте задать права доступа к этой папке, чтобы можно было в нее записывать файлы)
+
   # папка с результатами (не забудьте задать права доступа 766 к этой папке, чтобы можно было в нее записывать файлы)
   $file_dir = $_SERVER['DOCUMENT_ROOT'].'/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/Results/';
+
  # можно задать как-то, например, $_SERVER['DOCUMENT_ROOT'].'/results/'
   //текстовый файл с результатами (в папке с результатами)
+
   $file_dir = $_SERVER['DOCUMENT_ROOT'].'/ab5ff96b-afc0-48e6-8157-39ee02df3ce9/results/';
 +
   # текстовый файл с результатами (в папке с результатами)
 
   $file_name = $file_dir . 'data.txt';
 
   $file_name = $file_dir . 'data.txt';
   //папка для файлов результатов *.mtxpr (можно задать проще, например, $_SERVER['DOCUMENT_ROOT'].'/MyTestXProResults/Data/')
+
   //$file_name_csv = $file_dir . 'data.csv';
   $upload_path_files = $_SERVER['DOCUMENT_ROOT'].'/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/Results/';
+
  # папка для файлов результатов *.mtxpr  
 
+
   $upload_path_files = $_SERVER['DOCUMENT_ROOT'].'/ab5ff96b-afc0-48e6-8157-39ee02df3ce9/results/';  
   $SecretKey = '858374A9-EB92-4DAE-AF9C-C3D917C6E152'; //должен быть такой как в программе (задается в настройках)
+
 
 +
  # секретный ключ должен быть такой как в программе (задается в настройках ini-файла, для защиты необходимо указать/изменить)
 +
   $SecretKey = '858374A9-EB92-4DAE-AF9C-C3D917C6E152';  
 
   $md5SecretKey = md5($SecretKey);
 
   $md5SecretKey = md5($SecretKey);
 
    
 
    
  //получаем данные, отправленные методом POST
 
 
    
 
    
 +
  # получаем данные, отправленные методом POST 
 
   $Key0 = $_POST['Key0']; //случайная строка от программы для проверки Key1 и Key2
 
   $Key0 = $_POST['Key0']; //случайная строка от программы для проверки Key1 и Key2
 
   $md5Key0 = md5($Key0);   
 
   $md5Key0 = md5($Key0);   
 
   $Key1 = $_POST['Key1']; //Key1 - проверка хеша файла теста = md5(md5(файла теста).md5(SecretKey).md5(Key0))
 
   $Key1 = $_POST['Key1']; //Key1 - проверка хеша файла теста = md5(md5(файла теста).md5(SecretKey).md5(Key0))
 
   $Key2 = $_POST['Key2']; //Key2 - проверка хеша UId теста = md5(md5(UId теста).md5(SecretKey).md5(Key0))
 
   $Key2 = $_POST['Key2']; //Key2 - проверка хеша UId теста = md5(md5(UId теста).md5(SecretKey).md5(Key0))
 +
  $Key3 = $_POST['Key3']; //Key3 - проверка хеша = md5(UTF8(UID теста, имя, оценка, секрет, key0))
 
    
 
    
   $UId = $_POST['UId'];
+
  # текст полей в кодировке UTF-8 
 
+
   $UId = $_POST['UId'];   
  $_Key2 = md5(md5($UId).$md5SecretKey.$md5Key0); 
 
  if ($Key2 != $_Key2) return;
 
 
 
  # текст полей в кодировке UTF-8, данный скрипт сохранить данные в текстовом файл в кодировке Windows-1251
 
  # для перекодирования используется функция iconv("UTF-8", "Windows-1251", ...);
 
  # если файл должен быть в кодировке UTF-8, то строки с iconv нужно убрать или закомментировать
 
    
 
 
   $UserName = $_POST['UserName'];
 
   $UserName = $_POST['UserName'];
  $UserName = iconv("UTF-8", "Windows-1251", $UserName);
+
   if ($UserName == '') return;
   if ($UserName == '') return;
+
   $UserGroup = $_POST['UserGroup'];   
 
 
   $UserGroup = $_POST['UserGroup'];
 
  $UserGroup = iconv("UTF-8", "Windows-1251", $UserGroup);   
 
 
 
 
   $Mark = $_POST['Mark'];
 
   $Mark = $_POST['Mark'];
  $Mark = iconv("UTF-8", "Windows-1251", $Mark); 
+
   $Result = $_POST['Result'];
 
+
   $MaskOfResult = $_POST['MaskOfResult'];  
   $Result = $_POST['Result'];
 
   $Result = iconv("UTF-8", "Windows-1251", $Result);  
 
 
    
 
    
 
   $ip = $_SERVER['REMOTE_ADDR'];
 
   $ip = $_SERVER['REMOTE_ADDR'];
 
   $today = date("d.m.Y H:i:s");   
 
   $today = date("d.m.Y H:i:s");   
 +
 
 +
  //$Version = $_POST['Version'];
  
   //$CSV = $_POST['CSV']; //строка с данными разделенными ";", такая же какую MyTestServer может дописывать к CSV файлу с результатами (можно открыть в электронных таблицах или разобрать как-то самому).
+
   # строка с данными разделенными ";", можно открыть в электронных таблицах или разобрать как-то самому
   //$CSV = iconv("UTF-8", "Windows-1251", $CSV);
+
  $CSV = $_POST['CSV']; 
 +
 
 +
  # для защиты нужно раскомментировать нужные строки
 +
  //$_Key2 = md5(md5($UId).$md5SecretKey.$md5Key0); 
 +
  //if ($Key2 != $_Key2) return; 
 +
 
 +
   //$_Key3 = md5($UId.$UserName.$Mark.$SecretKey.$Key0);
 +
  //if ($_Key3 != $Key3) return;  
 
    
 
    
   //файл с результатами
+
   # файл с результатами
 
   if(isset($_FILES['file']['name']) && !empty($_FILES['file']['name'])){
 
   if(isset($_FILES['file']['name']) && !empty($_FILES['file']['name'])){
     if($_FILES['file']['error'] != UPLOAD_ERR_OK) return; //проверка, что нет ошибок при загрузке
+
    # проверка, что нет ошибок при загрузке
+
     if($_FILES['file']['error'] != UPLOAD_ERR_OK) return;  
 +
 
 +
    # проверка расширения файла результатов
 
     $upload_fn = explode(".", $_FILES['file']['name']);
 
     $upload_fn = explode(".", $_FILES['file']['name']);
     if(empty($upload_fn[1]) || ($upload_fn[1] != 'mtxpr')) return; //проверка расширения    
+
     if(empty($upload_fn[1]) || ($upload_fn[1] != 'mtxpr')) return;   
     if($_FILES['file']['size'] > 1000000) return;    //Загружаемый файл превысил допустимое значение ... байт
+
   
 +
    # загружаемый файл превысил допустимое значение ... байт
 +
     if($_FILES['file']['size'] > 1000000) return;     
  
     //проверка что файл результатов начинается с MyTestXResult
+
     # проверка что файл результатов начинается с MyTestXResult
 
     $handle = fopen($_FILES['file']['tmp_name'], "r");
 
     $handle = fopen($_FILES['file']['tmp_name'], "r");
 
     $contents = fread($handle, 13);
 
     $contents = fread($handle, 13);
     fclose($handle);
+
     fclose($handle);
 
     if ($contents != 'MyTestXResult') return;
 
     if ($contents != 'MyTestXResult') return;
+
   
 +
    # имя файла под которым сохраним результат
 
     $upload_file_name = time() . '_' . $_FILES['file']['name'];  
 
     $upload_file_name = time() . '_' . $_FILES['file']['name'];  
 
     $upload_file_name = str_replace('/', '', $upload_file_name);
 
     $upload_file_name = str_replace('/', '', $upload_file_name);
 
     $upload_file_name = str_replace('\\', '', $upload_file_name);
 
     $upload_file_name = str_replace('\\', '', $upload_file_name);
    $upload_file_name = str_replace('..', '', $upload_file_name);
 
 
     $upload_new_file_name = $upload_path_files . $upload_file_name;
 
     $upload_new_file_name = $upload_path_files . $upload_file_name;
+
 
     //Добавляем файл в каталог (сохраняем файл с результатами)
+
     # добавляем файл в каталог (сохраняем файл с результатами)
     if(!move_uploaded_file($_FILES['file']['tmp_name'], $upload_new_file_name)) $upload_new_file_name = '';
+
     if(!move_uploaded_file($_FILES['file']['tmp_name'], $upload_new_file_name)) $upload_new_file_name = '';
 
   }  
 
   }  
   $_Key1 =  md5(md5_file($upload_new_file_name).$md5SecretKey.$md5Key0);
+
   //$_Key1 =  md5(md5_file($upload_new_file_name).$md5SecretKey.$md5Key0);
   if ($Key1 != $_Key1) return;   
+
   //if ($Key1 != $_Key1) return;   
 
    
 
    
   //теперь сохраним данные в текстовый файл (или можно сделать сохранение в БД)
+
   # теперь сохраним данные в текстовый файл (или можно сделать сохранение в БД)
 
    
 
    
 +
  # имя файла результатов запишем с путем от корня сайта
 
   $upload_new_file_name = str_replace($_SERVER['DOCUMENT_ROOT'], '', $upload_new_file_name);
 
   $upload_new_file_name = str_replace($_SERVER['DOCUMENT_ROOT'], '', $upload_new_file_name);
 
   $upload_size = $_FILES['file']['size'];
 
   $upload_size = $_FILES['file']['size'];
 
    
 
    
  //строка для записи в текстовый файл
+
   $str = $today . "\t" . $ip . "\t" . $UserName . "\t" . $UserGroup . "\t" . $Mark . "\t" . $Result . "\t" . $MaskOfResult . "\t" . $upload_new_file_name . "\t" . $upload_size . "\t" . $CSV . "\r\n";  
   $str = $today . "\t" . $ip . "\t" . $UserName . "\t" . $UserGroup . "\t" . $Mark . "\t" . $Result . "\t" . $upload_new_file_name . "\t" . $upload_size . "\r\n";   
+
  # если файл должен быть в кодировке Windows-1251, то строки с iconv нужно убрать или закомментировать  
 +
  //$str = iconv("UTF-8", "Windows-1251", $str);
 
    
 
    
 +
  # пишем результаты в текстовый файл
 
   $fd = fopen($file_name, 'a') or die('error');
 
   $fd = fopen($file_name, 'a') or die('error');
 
   flock($fd,2);
 
   flock($fd,2);
Строка 112: Строка 128:
  
 
   flock($fd,3);
 
   flock($fd,3);
   fclose($fd);  
+
   fclose($fd);
 
    
 
    
   //если все хорошо, отправим обратно ОК
+
   # если все хорошо, отправим обратно ОК
 
   echo 'OK';  
 
   echo 'OK';  
 
?>
 
?>
 
</pre>
 
</pre>
  
Данный скрипт сохранит результаты в текстовый файл и сохранить файл с (защищенными) результатами. Данные передаются методом POST, как обычной формой. Кодировка UFT8, в данном примере мы конвертируем текст в кодировку win-1251.
+
Данный скрипт сохранит результаты в текстовый файл и сохранит файл с (защищенными) результатами. Данные передаются методом POST, как обычной формой.
 +
 +
Пример скрипта, который отображает полученные результаты таблицей и дает скачать каждый отдельный результат:
  
Пример скрипта, который отображает полученные результаты таблицей и дает скачать каждый отдельный результат:
 
 
<pre>
 
<pre>
 
<?php
 
<?php
 +
  ## MyTestXPro http://mytestx.pro
 +
  ## скрипт показа результатов
 +
 
   echo '<!DOCTYPE HTML>';
 
   echo '<!DOCTYPE HTML>';
 
   echo '<html>';
 
   echo '<html>';
 
   echo ' <head>';
 
   echo ' <head>';
 
   echo '  <title>Результаты</title>';
 
   echo '  <title>Результаты</title>';
   echo '  <meta charset="windows-1251">';
+
   echo '  <meta charset="UTF-8">';
 
   echo '  <link rel="stylesheet" type="text/css" href="style.css">';
 
   echo '  <link rel="stylesheet" type="text/css" href="style.css">';
 
   echo ' </head>';
 
   echo ' </head>';
 
   echo ' <body>';
 
   echo ' <body>';
    $file_dir = $_SERVER['DOCUMENT_ROOT'].'/E86D3AB5-2F02-4E8F-8F50-349656C9272E/Results/';
+
 
   $file_name = $file_dir . '1.txt';
+
 
    $f = file($file_name);
+
  # папка с результатами
 +
  $file_dir = $_SERVER['DOCUMENT_ROOT'].'/ab5ff96b-afc0-48e6-8157-39ee02df3ce9/results/';
 +
  # текстовый файл с результатами (в папке с результатами)
 +
   $file_name = $file_dir . 'data.txt';
 +
 
 +
  # открываем файл и формируем таблицу 
 +
  $f = file($file_name);
 
   $table = '<table>';
 
   $table = '<table>';
   $table .= '<tr><th>№</th><th>Дата</th><th>IP</th><th>Имя</th><th>Группа</th><th>Оценка</th><th>Результат в % от макс. баллов</th><th>Файл результата</th><th>Размер файла</th><tr>';
+
   $table .= '<tr><th>№</th><th>Дата</th><th>IP</th><th>Имя</th><th>Группа</th><th>Оценка</th><th>Результат в % от макс. баллов</th><th>Маска результата</th><th>Файл результата</th><th>Размер файла</th><tr>'; //+<th>CSV</th>
 +
 
 
   $count_res = count($f);
 
   $count_res = count($f);
 
   for($i=0; $i<$count_res; $i++){
 
   for($i=0; $i<$count_res; $i++){
Строка 143: Строка 170:
 
     $r = explode("\t", $line);
 
     $r = explode("\t", $line);
 
     $count_col = count($r);
 
     $count_col = count($r);
$tr = '<td>'.strval($i+1).'</td>';
+
    $tr = '<td>'.strval($i+1).'</td>';
for($j=0; $j<$count_col; $j++){
+
    for($j=0; $j<$count_col-1; $j++){
  if($j==$count_col-2) {
+
      if($j==$count_col-3) {
    $url = 'http://'.$_SERVER['HTTP_HOST'].$r[$j];
+
        $url = 'http://'.$_SERVER['HTTP_HOST'].$r[$j];
    $str = '<a href="'.$url.'">'.basename($r[$j]).'</a>';
+
        $str = '<a href="'.$url.'">Скачать</a>';
  }else  
+
      }else  
  $str = $r[$j];
+
        $str = $r[$j];
  $tr .= '<td>'.$str.'</td>';
+
        $tr .= '<td>'.$str.'</td>';
}
+
      }
  $table .= '<tr>'.$tr.'</tr>';
+
    $table .= '<tr>'.$tr.'</tr>';
 
   }  
 
   }  
 
   $table .= '<table>';
 
   $table .= '<table>';
 
   echo $table;  
 
   echo $table;  
 +
 
 
   echo ' </body>';
 
   echo ' </body>';
 
   echo '</html>';   
 
   echo '</html>';   
 
?>
 
?>
 
</pre>
 
</pre>
 +
 +
Или еще один вариант:
 +
 +
<pre>
 +
<?php
 +
  ## MyTestXPro http://mytestx.pro
 +
  ## скрипт показа результатов 2
 +
 +
  echo '<!DOCTYPE HTML>';
 +
  echo '<html>';
 +
  echo ' <head>';
 +
  echo '  <title>Результаты</title>';
 +
  echo '  <meta charset="UTF-8">';
 +
  echo '  <link rel="stylesheet" type="text/css" href="style.css">';
 +
  echo '  <script src="sorttable.js" type="text/javascript"></script>';
 +
  echo ' </head>';
 +
  echo ' <body>';
 +
 
 +
  # данные в таблице
 +
  $title = 'Today,IP,UserName,UserGroup,Mark,Result,MaskOfResult,FileName,FileSize';
 +
  $a_title = explode(",", $title);   
 +
 
 +
  # заголовок для csv 
 +
  $csv_title = 'Uid,Date,Time,UserName,UserGroup,Mark,Result,ScoreMax,ScoreMax2,Score,CountTask,CountAskTask,CountCheckTask,CountCorrectTask,CountPartiallyTask,CountErrorTask,CountMissTask,CountUsePrompt,CountUsePrompt2,CorrectByCount,TimeBegin,TimeEnd,Duration,TestTitle,TestFileName,CRCFile,TetUId,ModeEnd,ComputerNetName,IP,ComputerUserName,Note';
 +
  $a_csv_title = explode(",", $csv_title);   
 +
 
 +
 
 +
  # папка с результатами
 +
  $file_dir = $_SERVER['DOCUMENT_ROOT'].'/ab5ff96b-afc0-48e6-8157-39ee02df3ce9/results/';
 +
  # текстовый файл с результатами (в папке с результатами)
 +
  $file_name = $file_dir . 'data.txt';
 +
 
 +
  # открываем файл и формируем таблицу 
 +
  $f = file($file_name);
 +
  $table = '<table>';
 +
  $table .= '<thead><tr><th>№</th><th>Дата</th><th>IP/комп</th><th>Имя/Группа</th><th>Оценка</th><th>Результат</th><th>Файл результата</th><th>Тест</th><tr></thead><tbody>';
 +
 +
 +
  $count_res = count($f);
 +
  for($i=0; $i<$count_res; $i++){
 +
    //$line = iconv('utf-8', 'windows-1251', trim($f[$i])); 
 +
    $line = trim($f[$i]);
 +
    $r = explode("\t", $line);
 +
    $count_col = count($r);
 +
    $csv_data = $r[$count_col-1];
 +
    array_splice($r, $count_col-1);
 +
 +
    $a1 = array_combine($a_title, $r);
 +
    $a_csv = str_getcsv($csv_data, ';');   
 +
    $a2 = array_combine($a_csv_title, $a_csv);
 +
 +
    $a1['Today'] = str_replace(' ', '<br>', $a1['Today']) . '<br> ~' . $a2['Duration'] . '~';
 +
    $a1['UserName'] .= '<br>' . $a1['UserGroup'];     
 +
    $a1['IP'] .= '<br>' . $a2['ComputerNetName'] . '<br>' . $a2['ComputerUserName'];
 +
    $a1['Result'] .= '%' . '<br>' . $a2['Score'] . ' из '. $a2['ScoreMax'] . '<br>' . $a1['MaskOfResult'];
 +
   
 +
    $url2 = 'http://'.$_SERVER['HTTP_HOST'] . $a1['FileName'];
 +
    $a1['FileName'] = '<a href="'.$url2.'">Скачать</a>';
 +
    $a1['FileName'] .= '<br>' . $a1['FileSize'] . ' Байт' . '<br>' . $a2['ModeEnd'];
 +
   
 +
    $a1['Test'] = $a2['TestFileName'] . '<br>' . $a2['TestTitle'] . '<br>' .  $a2['CRCFile'];
 +
   
 +
    unset($a1['UserGroup']);
 +
    unset($a1['MaskOfResult']);
 +
    unset($a1['FileSize']);   
 +
 +
    $tr = '<td>'.strval($i+1).'</td>';
 +
    foreach ($a1 as $key => $value) {
 +
      $tr .= '<td>'.$value.'</td>';
 +
    }   
 +
    $table .= '<tr>'.$tr.'</tr>';
 +
  }
 +
  $table .= '</tbody></table>';
 +
  echo $table;
 +
 
 +
  echo ' </body>';
 +
  echo '</html>'; 
 +
?>
 +
</pre>
 +
  
 
Вот пример его работы:
 
Вот пример его работы:
  
[[File:post_web.png|400px]]
+
[[File:post_show2.png|600px]]
  
  
Образец файлов можно скачать по ссылке http://yadi.sk/d/DVQTFO5UK3Si6
+
[[Файл:Save 48.png|24px|мини|слева|link=https://yadi.sk/d/L6BSvAmdgfNqlA]]
 +
Образец файлов можно скачать по ссылке https://yadi.sk/d/L6BSvAmdgfNqlA
 
В архиве папка. Поместите эту папку в корень вашего сайта. Возможно потребуется для вложенной папки для результатов задать права на запись.  
 
В архиве папка. Поместите эту папку в корень вашего сайта. Возможно потребуется для вложенной папки для результатов задать права на запись.  
  
 +
<spoiler text="Алгоритм действий:">
 +
Самый простой вариант отправки результатов тестирования на свой сайт.
 +
 +
0) Зарегистрироваться на хостинге с поддержкой PHP, например, на бесплатном https://ru.000webhost.com (или, если уже есть, использовать свой хостинг).
 +
 +
1) Закинуть архив ab5ff96b-afc0-48e6-8157-39ee02df3ce9.zip на сервер в public_html (корневую папку для веб-страниц).
 +
 +
2) Распаковать этот архив в текущую папку (поставить путь "." (точку без кавычек)). Если в другую папку, то потом не забудьте поменять пути для результатов.
 +
 +
3) Зайти в папку ab5ff96b-afc0-48e6-8157-39ee02df3ce9 и папке results поставить права неё запись (777).
 +
 +
4) В настройках POST программы тестирования указать адрес отправки http://ВАШСАЙТ/ab5ff96b-afc0-48e6-8157-39ee02df3ce9/save.php и галочку "отправлять результаты в web".
 +
 +
5) Проверить, что в параметрах теста стоит "отправлять результаты в web".
  
 +
Файлы результатов будут складываться в папке results, просмотр таблицы результатов через в браузере по ссылке https://ВАШСАЙТ/ab5ff96b-afc0-48e6-8157-39ee02df3ce9/show2.php
 +
</spoiler>
  
Пример пользовательских скриптов, использующих базы данных, вы можете найти на форуме программы.
+
<youtube>n_bByzNL5Ug</youtube>
 +
<youtube>qhQu_Q1gxeY</youtube>

Версия 13:13, 24 июня 2020

Иногда отправлять результаты в модуль Журнал (MyTestServer) нет возможности или не целесообразно. В этом случае можно организовать автоматическую отправку результатов по электронной почте или на web-сервер. Первый способ (по эл. почте) более прост в использовании, но менее удобен. Отправка результатов на веб-сервер требуется наличия веб-сервера, где можно организовать прием, все нужные права доступа и знания по программированию для веб, например на PHP.

Логика приема и обработки результатов на веб-сервере может быть у каждого своя, в этом разделе приведем один из примеров от которого можно отталкиваться. В данном примере не будем использовать базы данных, а для простоты только файлы, вы же можете организовывать работу более сложным и гибким образом.

Но учитывайте, что ориентироваться только на текстовые поля не очень надежно, т.к. данные присылаются так же как и обычной веб-формой. Поэтому в важных случаях обращайте внимание на файл с защ. результатами, который тоже присылается.

Для того чтобы модуль тестирования мог отправлять результаты на веб-сервер необходимо в параметрах теста разрешить данную операцию – Параметры теста → Сохранение и вывод результатов → Отправлять результаты в веб.

Так же необходимо настроить модуль тестирования. В настройках нужно установить переключатель "Разрешить отправлять результаты в web" и указать адрес (URL) страницы, которой будут передаваться результаты. Так же можно задать параметры прокси-сервера (через правку файла настроек). В настройках модуля тестирования и настройках автономного теста данные опции (в этой версии) находятся на вкладке с настройками отправки данных по эл. почте.

И, естественно, у вас должен быть веб-сервер, где вы разместите страницу (скрипт) приема и обработки результатов.

Например, скрипт на PHP для приема и сохранения результатов может выглядеть так:

<?php
  ## MyTestXPro http://mytestx.pro
  ## скрипт для приёма и сохранения результатов тестирования от модуля тестирования или автономного теста MyTestXPro методом POST
  ## в настройках программы MyTestXPro (точнее в модуле тестирования) в "настройки POST" адрес указываем типа 
  ## http://ВАШ-САЙТ/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/SaveResult.php?key=8F480FED-621A-41E1-8CB7-E6D4CC9DB76B

  # можно проверить ключ (произвольная переменная (метод GET) в адресе скрипта)
  //if ($_GET['key'] != '8F480FED-621A-41E1-8CB7-E6D4CC9DB76B') return; 

  # проверка связи
  if(isset($_POST['Test']) and $_POST['Test'] == 'Test'){ 
    echo 'OK';
    return;
  }
  # проверка данных
  if(!isset($_POST['UId'])){
    echo 'Нет данных!';
    return;
  } 

  # временная зона
  date_default_timezone_set('Europe/Moscow');  
  
  # папка с результатами (не забудьте задать права доступа 766 к этой папке, чтобы можно было в нее записывать файлы)
  # можно задать как-то, например, $_SERVER['DOCUMENT_ROOT'].'/results/' 
  $file_dir = $_SERVER['DOCUMENT_ROOT'].'/ab5ff96b-afc0-48e6-8157-39ee02df3ce9/results/';
  # текстовый файл с результатами (в папке с результатами)
  $file_name = $file_dir . 'data.txt';
  //$file_name_csv = $file_dir . 'data.csv';
  # папка для файлов результатов *.mtxpr 
  $upload_path_files = $_SERVER['DOCUMENT_ROOT'].'/ab5ff96b-afc0-48e6-8157-39ee02df3ce9/results/';    
  
  # секретный ключ должен быть такой как в программе (задается в настройках ini-файла, для защиты необходимо указать/изменить)
  $SecretKey = '858374A9-EB92-4DAE-AF9C-C3D917C6E152'; 
  $md5SecretKey = md5($SecretKey);
  
  
  # получаем данные, отправленные методом POST  
  $Key0 = $_POST['Key0']; //случайная строка от программы для проверки Key1 и Key2
  $md5Key0 = md5($Key0);  
  $Key1 = $_POST['Key1']; //Key1 - проверка хеша файла теста = md5(md5(файла теста).md5(SecretKey).md5(Key0))
  $Key2 = $_POST['Key2']; //Key2 - проверка хеша UId теста = md5(md5(UId теста).md5(SecretKey).md5(Key0))
  $Key3 = $_POST['Key3']; //Key3 - проверка хеша = md5(UTF8(UID теста, имя, оценка, секрет, key0))
  
  # текст полей в кодировке UTF-8  
  $UId = $_POST['UId'];   
  $UserName = $_POST['UserName'];
  if ($UserName == '') return;  
  $UserGroup = $_POST['UserGroup'];  
  $Mark = $_POST['Mark'];
  $Result = $_POST['Result'];  
  $MaskOfResult = $_POST['MaskOfResult']; 
  
  $ip = $_SERVER['REMOTE_ADDR'];
  $today = date("d.m.Y H:i:s");  
  
  //$Version = $_POST['Version']; 

  # строка с данными разделенными ";", можно открыть в электронных таблицах или разобрать как-то самому
  $CSV = $_POST['CSV'];  
  
  # для защиты нужно раскомментировать нужные строки
  //$_Key2 = md5(md5($UId).$md5SecretKey.$md5Key0);  
  //if ($Key2 != $_Key2) return;  
  
  //$_Key3 = md5($UId.$UserName.$Mark.$SecretKey.$Key0); 
  //if ($_Key3 != $Key3) return;   	
  
  # файл с результатами
  if(isset($_FILES['file']['name']) && !empty($_FILES['file']['name'])){
    # проверка, что нет ошибок при загрузке
    if($_FILES['file']['error'] != UPLOAD_ERR_OK) return; 
  
    # проверка расширения файла результатов
    $upload_fn = explode(".", $_FILES['file']['name']);
    if(empty($upload_fn[1]) || ($upload_fn[1] != 'mtxpr')) return;   
    
    # загружаемый файл превысил допустимое значение ... байт
    if($_FILES['file']['size'] > 1000000) return;    

    # проверка что файл результатов начинается с MyTestXResult
    $handle = fopen($_FILES['file']['tmp_name'], "r");
    $contents = fread($handle, 13);
    fclose($handle);  
    if ($contents != 'MyTestXResult') return;
    
    # имя файла под которым сохраним результат
    $upload_file_name = time() . '_' . $_FILES['file']['name']; 
    $upload_file_name = str_replace('/', '', $upload_file_name);
    $upload_file_name = str_replace('\\', '', $upload_file_name);
    $upload_new_file_name = $upload_path_files . $upload_file_name;
  
    # добавляем файл в каталог (сохраняем файл с результатами)
    if(!move_uploaded_file($_FILES['file']['tmp_name'], $upload_new_file_name)) $upload_new_file_name = '';  
  } 
  //$_Key1 =  md5(md5_file($upload_new_file_name).$md5SecretKey.$md5Key0);
  //if ($Key1 != $_Key1) return;  
  
  # теперь сохраним данные в текстовый файл (или можно сделать сохранение в БД)
  
  # имя файла результатов запишем с путем от корня сайта
  $upload_new_file_name = str_replace($_SERVER['DOCUMENT_ROOT'], '', $upload_new_file_name);
  $upload_size = $_FILES['file']['size'];
  
  $str = $today . "\t" . $ip . "\t" . $UserName . "\t" . $UserGroup . "\t" . $Mark . "\t" . $Result . "\t" . $MaskOfResult . "\t" . $upload_new_file_name . "\t" . $upload_size . "\t" . $CSV . "\r\n";   
  # если файл должен быть в кодировке Windows-1251, то строки с iconv нужно убрать или закомментировать  
  //$str = iconv("UTF-8", "Windows-1251", $str);
  
  # пишем результаты в текстовый файл
  $fd = fopen($file_name, 'a') or die('error');
  flock($fd,2);
  
  fputs($fd,$str);

  flock($fd,3);
  fclose($fd);  
  
  # если все хорошо, отправим обратно ОК
  echo 'OK'; 
?>

Данный скрипт сохранит результаты в текстовый файл и сохранит файл с (защищенными) результатами. Данные передаются методом POST, как обычной формой.

Пример скрипта, который отображает полученные результаты таблицей и дает скачать каждый отдельный результат:

<?php
  ## MyTestXPro http://mytestx.pro
  ## скрипт показа результатов

  echo '<!DOCTYPE HTML>';
  echo '<html>';
  echo ' <head>';
  echo '  <title>Результаты</title>';
  echo '  <meta charset="UTF-8">';
  echo '  <link rel="stylesheet" type="text/css" href="style.css">';
  echo ' </head>';
  echo ' <body>';
  
  
  # папка с результатами
  $file_dir = $_SERVER['DOCUMENT_ROOT'].'/ab5ff96b-afc0-48e6-8157-39ee02df3ce9/results/';
  # текстовый файл с результатами (в папке с результатами)
  $file_name = $file_dir . 'data.txt';
  
  # открываем файл и формируем таблицу  
  $f = file($file_name);
  $table = '<table>';
  $table .= '<tr><th>№</th><th>Дата</th><th>IP</th><th>Имя</th><th>Группа</th><th>Оценка</th><th>Результат в % от макс. баллов</th><th>Маска результата</th><th>Файл результата</th><th>Размер файла</th><tr>'; //+<th>CSV</th>

  $count_res = count($f);
  for($i=0; $i<$count_res; $i++){
    //$line = iconv('utf-8', 'windows-1251', trim($f[$i]));  
    $line = trim($f[$i]);
    $r = explode("\t", $line);
    $count_col = count($r);
    $tr = '<td>'.strval($i+1).'</td>';
    for($j=0; $j<$count_col-1; $j++){
      if($j==$count_col-3) {
        $url = 'http://'.$_SERVER['HTTP_HOST'].$r[$j];
        $str = '<a href="'.$url.'">Скачать</a>';
      }else 
        $str = $r[$j];
        $tr .= '<td>'.$str.'</td>';
      }
    $table .= '<tr>'.$tr.'</tr>';
  } 
  $table .= '<table>';
  echo $table; 
  
  echo ' </body>';
  echo '</html>';  
?>

Или еще один вариант:

<?php
  ## MyTestXPro http://mytestx.pro
  ## скрипт показа результатов 2

  echo '<!DOCTYPE HTML>';
  echo '<html>';
  echo ' <head>';
  echo '  <title>Результаты</title>';
  echo '  <meta charset="UTF-8">';
  echo '  <link rel="stylesheet" type="text/css" href="style.css">';
  echo '  <script src="sorttable.js" type="text/javascript"></script>';
  echo ' </head>';
  echo ' <body>';
  
  # данные в таблице 
  $title = 'Today,IP,UserName,UserGroup,Mark,Result,MaskOfResult,FileName,FileSize';
  $a_title = explode(",", $title);    
  
  # заголовок для csv  
  $csv_title = 'Uid,Date,Time,UserName,UserGroup,Mark,Result,ScoreMax,ScoreMax2,Score,CountTask,CountAskTask,CountCheckTask,CountCorrectTask,CountPartiallyTask,CountErrorTask,CountMissTask,CountUsePrompt,CountUsePrompt2,CorrectByCount,TimeBegin,TimeEnd,Duration,TestTitle,TestFileName,CRCFile,TetUId,ModeEnd,ComputerNetName,IP,ComputerUserName,Note';
  $a_csv_title = explode(",", $csv_title);    
  
  
  # папка с результатами
  $file_dir = $_SERVER['DOCUMENT_ROOT'].'/ab5ff96b-afc0-48e6-8157-39ee02df3ce9/results/';
  # текстовый файл с результатами (в папке с результатами)
  $file_name = $file_dir . 'data.txt';
  
  # открываем файл и формируем таблицу  
  $f = file($file_name);
  $table = '<table>';
  $table .= '<thead><tr><th>№</th><th>Дата</th><th>IP/комп</th><th>Имя/Группа</th><th>Оценка</th><th>Результат</th><th>Файл результата</th><th>Тест</th><tr></thead><tbody>';


  $count_res = count($f);
  for($i=0; $i<$count_res; $i++){
    //$line = iconv('utf-8', 'windows-1251', trim($f[$i]));  
    $line = trim($f[$i]);
    $r = explode("\t", $line);
    $count_col = count($r);
    $csv_data = $r[$count_col-1];
    array_splice($r, $count_col-1);

    $a1 = array_combine($a_title, $r);
    $a_csv = str_getcsv($csv_data, ';');    
    $a2 = array_combine($a_csv_title, $a_csv);

    $a1['Today'] = str_replace(' ', '<br>', $a1['Today']) . '<br> ~' . $a2['Duration'] . '~';
    $a1['UserName'] .= '<br>' . $a1['UserGroup'];       
    $a1['IP'] .= '<br>' . $a2['ComputerNetName'] . '<br>' . $a2['ComputerUserName'];
    $a1['Result'] .= '%' . '<br>' . $a2['Score'] . ' из '. $a2['ScoreMax'] . '<br>' . $a1['MaskOfResult']; 
    
    $url2 = 'http://'.$_SERVER['HTTP_HOST'] . $a1['FileName'];
    $a1['FileName'] = '<a href="'.$url2.'">Скачать</a>';
    $a1['FileName'] .= '<br>' . $a1['FileSize'] . ' Байт' . '<br>' . $a2['ModeEnd'];
    
    $a1['Test'] = $a2['TestFileName'] . '<br>' . $a2['TestTitle'] . '<br>' .  $a2['CRCFile'];
    
    unset($a1['UserGroup']);
    unset($a1['MaskOfResult']);
    unset($a1['FileSize']);    

    $tr = '<td>'.strval($i+1).'</td>';
    foreach ($a1 as $key => $value) {
      $tr .= '<td>'.$value.'</td>';
    }    
    $table .= '<tr>'.$tr.'</tr>';
  } 
  $table .= '</tbody></table>';
  echo $table; 
  
  echo ' </body>';
  echo '</html>';  
?>


Вот пример его работы:

Post show2.png


Save 48.png

Образец файлов можно скачать по ссылке https://yadi.sk/d/L6BSvAmdgfNqlA В архиве папка. Поместите эту папку в корень вашего сайта. Возможно потребуется для вложенной папки для результатов задать права на запись.

Алгоритм действий: