src/MentalSchool/AppBundle/Controller/Student/TrainingController.php line 170

Open in your IDE?
  1. <?php
  2. namespace MentalSchool\AppBundle\Controller\Student;
  3. use MentalSchool\AppBundle\Entity\StudentProfile;
  4. use MentalSchool\AppBundle\Entity\Subtask;
  5. use MentalSchool\AppBundle\Utils\Parameters;
  6. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Session\Session;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
  13. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  14. /**
  15.  * Student profile controller.
  16.  *
  17.  * @Route("/student")
  18.  */
  19. class TrainingController extends Controller
  20. {
  21.     /**
  22.      * @Route("/training/{template}", name="ms_student_show_training")
  23.      */
  24.     public function showTrainingAction($template)
  25.     {
  26.         if ($stProfile $this->getUser()->getStudentProfile()) {
  27.             if ($stProfile->getStatus() == StudentProfile::STATUS_VACATION) {
  28.                 return $this->render('AppBundle:Student:Page/student_on_vacation.html.twig', [
  29.                     'breadcrumbs' => [['app.breadcrumbs.home''', []]]
  30.                 ]);
  31.             }
  32.             $currentSortId $stProfile->getSortThemeId();
  33.             $uniqueThemeId = (int)Subtask::getThemeUniqueIdByName($template);
  34.             if ($uniqueThemeId && $uniqueThemeId $currentSortId) {
  35.                 throw new AccessDeniedException();
  36.             }
  37.         }
  38.         $training Subtask::getParametersDefaultDataByThemeSlug($template);
  39.         $training['subtheme'] = $template;
  40.         if (in_array($template, [
  41.             Parameters::TASK_CATEGORY_WILES,
  42.             Parameters::TASK_CATEGORY_DIVISION,
  43.             Parameters::TASK_CATEGORY_MULTIPLICATION,
  44.             Parameters::TASK_CATEGORY_EXPONENTIATION,
  45.             Parameters::TASK_CATEGORY_SQUAREROOT])) {
  46.             $layout 'show_multiplication_and_division.html.twig';
  47.         } else {
  48.             $layout 'show.html.twig';
  49.         }
  50.         $breadcrumbs $this->get('app.common.service')->breadcrumbs();
  51.         $breadcrumbs[] = ['app.breadcrumbs.training''', []];
  52.         $session = new Session();
  53.         $gameParams $session->get('gameParams');
  54.         $idTraning 'traningParams_' rand(101000000000);
  55.         $session->set($idTraning, []);
  56.         if (!empty($gameParams['level'])) {
  57.             $training["level"] = $gameParams['level'];
  58.         }
  59.         $session->remove('gameParams');
  60.         return $this->render('AppBundle:Student:Training/' $layout, ['training' => $training'idTraning' => $idTraning'breadcrumbs' => $breadcrumbs'gameParams' => $gameParams]);
  61.     }
  62.     /**
  63.      * @Route("/start-squareroot-training", name="ms_student_start_squareroot_training")
  64.      * @Method({"GET", "POST"})
  65.      */
  66.     public function startSquarerootTrainingAction(Request $request)
  67.     {
  68.         $allRequest $request->request->all();
  69.         if (isset($allRequest['aNumbersGame'])) {
  70.             unset($allRequest['aNumbersGame']);
  71.         }
  72.         $allRequest json_encode($allRequestJSON_NUMERIC_CHECK);
  73.         $template $request->get('subtheme');
  74.         $level $request->get('level');
  75.         $rangeOfFirstNumber $request->get('rangeOfFirstNumber');
  76.         $numberGeneratorManager $this->get('app.multiplication.number.service')->build($template);
  77.         $soundsAnswer $request->get('sounds_answer') ?: 0;
  78.         $manageFonts $request->get('manage-fonts') ?: 0;
  79.         $fontsNumber $manageFonts "Edu TAS Beginner" "'Libre Franklin', sans-serif";
  80.         if ($level == 10) {
  81.             $levelRound rand(19);
  82.             $aNumbers $numberGeneratorManager->generate($levelRound$rangeOfFirstNumber);
  83.         } else {
  84.             $aNumbers $numberGeneratorManager->generate($level$rangeOfFirstNumber);
  85.         }
  86.         return $this->render('AppBundle:Student:Training/start_squareroot_training.html.twig', [
  87.             'numbers' => $aNumbers,
  88.             'subtheme' => $template,
  89.             'allRequest' => $allRequest,
  90.             'level' => $level,
  91.             'soundsAnswer' => $soundsAnswer,
  92.             'fontsNumbers' => $fontsNumber
  93.         ]);
  94.     }
  95.     /**
  96.      * @Route("/start-multiplication-training", name="ms_student_start_multiplication_training")
  97.      * @Method({"GET", "POST"})
  98.      */
  99.     public function startMultiplicationTrainingAction(Request $request)
  100.     {
  101.         $allRequest $request->request->all();
  102.         if (isset($allRequest['aNumbersGame'])) {
  103.             unset($allRequest['aNumbersGame']);
  104.         }
  105.         $allRequest json_encode($allRequestJSON_NUMERIC_CHECK);
  106.         $template $request->get('subtheme');
  107.         if (!$template) {
  108.             $session = new Session();
  109.             $idTraningMultiplication 'traningMultiplicationParams_' $this->getUser()->getId();
  110.             $requestTraningMultiplication $session->get($idTraningMultiplication);
  111.             $template $requestTraningMultiplication['subject'];
  112.             $level $requestTraningMultiplication['level'];
  113.             $rangeOfFirstNumber $requestTraningMultiplication['range_of_1st_number'];
  114.             $rangeOfSecondNumber $requestTraningMultiplication['range_of_2st_number'];
  115.             $soundsAnswer 1;
  116.             $reverseMultiplications $requestTraningMultiplication['reverse_multiplication'];
  117.             $manageFonts 0;
  118.             $fontsNumber $manageFonts "Edu TAS Beginner" "neucha, cursive";
  119.             $sampleFormCount 1;
  120.         } else {
  121.             $level $request->get('level');
  122.             $rangeOfFirstNumber $request->get('rangeOfFirstNumber');
  123.             $rangeOfSecondNumber $request->get('rangeOfSecondNumber');
  124.             $soundsAnswer $request->get('sounds_answer') ?: 0;
  125.             $reverseMultiplications $request->get('reverse_multiplication') ?: 0;
  126.             $manageFonts $request->get('manage-fonts') ?: 0;
  127.             $fontsNumber $manageFonts "Edu TAS Beginner" "neucha, cursive";
  128.             $sampleFormCount $request->get('sampleFormCount');
  129.         }
  130.         $numberGeneratorManager $this->get('app.multiplication.number.service')->build($template);
  131.         if ($sampleFormCount 1) {
  132.             $result '';
  133.             for ($i 1$i <= $sampleFormCount$i++) {
  134.                 $aNumbers $numberGeneratorManager->generate($level$rangeOfFirstNumber$rangeOfSecondNumber);
  135.                 $result .= $i ") " . (($template == "division") ? implode(' / '$aNumbers) : implode(' × '$aNumbers)) . " = \r\n";
  136.             }
  137.             return new \Symfony\Component\HttpFoundation\Response($result200, [
  138.                 'content-type' => 'text/csv; charset=utf-8',
  139.                 'Content-disposition' => 'attachment; filename=training.txt'
  140.             ]);
  141.         } else {
  142.             $aNumbers $numberGeneratorManager->generate($level$rangeOfFirstNumber$rangeOfSecondNumber);
  143.         }
  144.         return $this->render('AppBundle:Student:Training/start_multiplication_training.html.twig', [
  145.             'numbers' => $aNumbers,
  146.             'allRequest' => $allRequest,
  147.             'subtheme' => $template,
  148.             'reverseMultiplications' => $reverseMultiplications,
  149.             'level' => $level,
  150.             'soundsAnswer' => $soundsAnswer,
  151.             'fontsNumbers' => $fontsNumber
  152.         ]);
  153.     }
  154.     /**
  155.      * @Route("/start-training", name="ms_student_start_training")
  156.      * @Method({"GET", "POST"})
  157.      */
  158.     public function startTrainingAction(Request $request)
  159.     {
  160.         $gameParams $request->request->all();
  161.         $session = new Session();
  162.         $session->set('gameParams'$gameParams);
  163.         $allRequest $request->request->all();
  164.         if (isset($allRequest['aNumbersGame'])) {
  165.             unset($allRequest['aNumbersGame']);
  166.         }
  167.         $allRequest json_encode($allRequestJSON_NUMERIC_CHECK);
  168.         $template $request->get('subtheme');
  169.         $themeUniqueId Subtask::getThemeUniqueIdByName($template);
  170.         $idTraning $request->get('idTraning') ?: 'traningParams_0';
  171.         $complexity $request->get('complexity') ?: 0;
  172.         $level $request->get('level');
  173.         $iterator $request->get('iterator');
  174.         $aNumbersGame $request->get('aNumbersGame') ?? [];
  175.         $combine $request->get('combine');
  176.         $turbo $request->get('turbo');
  177.         $doublePower $request->get('double-power');
  178.         $outputSample $request->get('output-sample');
  179.         $progressSpeed $request->get('progress_speed');
  180.         $progressAction $request->get('progress_action');
  181.         $manageFonts $request->get('manage-fonts') ?: 0;
  182.         $multiselectLevel $request->get('multiselect_level') ?: 0;
  183.         $soundsAnswer $request->get('sounds_answer') ?: 0;
  184.         $speed $request->get('speed');
  185.         $originalSpeed $request->get('originalSpeed') ?? $speed;
  186.         $originalIterator $request->get('originalIterator') ?? $iterator;
  187.         $fontsNumber $manageFonts "Edu TAS Beginner" "'Libre Franklin', sans-serif";
  188.         $tranningParams $session->get($idTraning, []);
  189.         if ($request->get('game_mode') !== 'progress') {
  190.             unset($tranningParams['progress']); // очищаємо прогрес
  191.             $session->set($idTraning$tranningParams);
  192.         }
  193.         if (!$progressAction && isset($tranningParams['progress'])) {
  194.             unset($tranningParams['progress']['iterator']);
  195.             unset($tranningParams['progress']['originalIterator']);
  196.             $session->set($idTraning$tranningParams);
  197.         }
  198.         if (!$progressSpeed && isset($tranningParams['progress'])) {
  199.             unset($tranningParams['progress']['speed']);
  200.             unset($tranningParams['progress']['originalSpeed']);
  201.             $session->set($idTraning$tranningParams);
  202.         }
  203.         if (empty($tranningParams['progress']['originalSpeed']) && $progressSpeed 0) {
  204.             $tranningParams['progress']['originalSpeed'] = $originalSpeed;
  205.             $tranningParams['progress']['progressSpeed'] = $progressSpeed;
  206.             $tranningParams['progress']['speed'] = $speed;
  207.             $session->set($idTraning$tranningParams);
  208.         }
  209.         if (empty($tranningParams['progress']['originalIterator']) && $progressAction) {
  210.             $tranningParams['progress']['originalIterator'] = $originalIterator;
  211.             $tranningParams['progress']['iterator'] = $iterator;
  212.             $session->set($idTraning$tranningParams);
  213.         }
  214.         if (!empty($tranningParams['progress']['speed'])) {
  215.             $speed $tranningParams['progress']['speed'];
  216.         }
  217.         if (!empty($tranningParams['progress']['iterator'])) {
  218.             $iterator $tranningParams['progress']['iterator'];
  219.         }
  220.         $fileGenerator 'NumberGeneratorService';
  221.         if (in_array($request->get('subtheme'), ['simple''family''bigfriends''anzan']) && $request->get('master')) {
  222.             if ($multiselectLevel) {
  223.                 $level $request->get('multilevel');
  224.                 $numberGenerator $this->get('app.master.number.generator.service2');
  225.                 $fileGenerator 'MasterNumberGeneratorService2';
  226.             } else {
  227.                 $numberGenerator $this->get('app.master.number.generator.service');
  228.                 $fileGenerator 'MasterNumberGeneratorService';
  229.             }
  230.         } else {
  231.             if ($multiselectLevel) {
  232.                 $level $request->get('multilevel');
  233.                 $numberGenerator $this->get('app.number.generator.service2');
  234.                 $fileGenerator 'NumberGeneratorService2';
  235.             } else {
  236.                 $numberGenerator $this->get('app.number.generator.service');
  237.             }
  238.         }
  239.         if ($multiselectLevel) {
  240.             if (strpos($level'0') !== false) {
  241.                 $array explode(','$level);
  242.                 $array array_filter($array, function ($value) {
  243.                     return $value !== '0';
  244.                 });
  245.                 $level implode(','$level);
  246.             }
  247.         }
  248.         $paramsForLog =  ['type' => 'Game''themeUniqueId' => $themeUniqueId'complexity' => $complexity'level' => $level'iterator' => $iterator'combine' => $combine];
  249.         $logId $this->get('app.student_log.service')->saveHttpLog([
  250.             'user_id' => $this->getUser()->getId(),
  251.             'url' => $_SERVER['REQUEST_URI'],
  252.             'request' => json_encode($paramsForLog),
  253.             'response' => $fileGenerator
  254.         ]);
  255.         if (!empty($aNumbersGame)) {
  256.             $aNumbers json_decode($aNumbersGame1);
  257.         } else {
  258.             if ($doublePower) {
  259.                 $aNumbers = [
  260.                     $numberGenerator->generate($themeUniqueId$complexity$level$iterator$combine),
  261.                     $numberGenerator->generate($themeUniqueId$complexity$level$iterator$combine)
  262.                 ];
  263.             } else {
  264.                 $aNumbers $numberGenerator->generate($themeUniqueId$complexity$level$iterator$combine);
  265.             }
  266.         }
  267.         $sampleFormCount $request->get('sampleFormCount');
  268.         if ($sampleFormCount 1) {
  269.             $result '';
  270.             for ($i 1$i <= $sampleFormCount$i++) {
  271.                 $aNumbers $numberGenerator->generate($themeUniqueId$complexity$level$iterator$combine);
  272.                 $result .= $i ") " implode($aNumbers) . " = \r\n";
  273.             }
  274.             return new \Symfony\Component\HttpFoundation\Response($result200, [
  275.                 'content-type' => 'text/csv; charset=utf-8',
  276.                 'Content-disposition' => 'attachment; filename=training.txt'
  277.             ]);
  278.         }
  279.         $this->get('app.student_log.service')->removeHttpLog($logId);
  280.         $taskParams =
  281.             [
  282.                 'params' =>
  283.                     [
  284.                         'combine' => $combine,
  285.                         'idTraning' => $idTraning,
  286.                         'complexity' => $complexity,
  287.                         'turbo' => $turbo,
  288.                         'speed' => $speed,
  289.                         'iterator' => $iterator,
  290.                         'doublePower' => $doublePower,
  291.                         'outputSample' => $outputSample,
  292.                         "progress_action" => $progressAction,
  293.                         "progress_speed" => $progressSpeed,
  294.                         "originalIterator" => $originalIterator,
  295.                         "originalSpeed" => $originalSpeed,
  296.                         "soundsAnswer" => $soundsAnswer,
  297.                         "fontsNumbers" => $fontsNumber,
  298.                         "manageFonts" => $manageFonts
  299.                     ],
  300.                 'numbers' => $aNumbers,
  301.                 'training' => 'true'
  302.             ];
  303.         return $this->render('AppBundle:Student:Training/start_training.html.twig', ['taskParams' => $taskParams'allRequest' => $allRequest'subtheme' => $template]);
  304.     }
  305.     /**
  306.      * @Route("/training-check/{subtheme}", name="ms_student_training_check")
  307.      * @Method({"GET", "POST"})
  308.      */
  309.     public function checkResultAction(Request $request$subtheme)
  310.     {
  311.         $correctAnswer 0;
  312.         $allRequest $request->get('allRequest') ?? [];
  313.         $allParamsPrevGame = [];
  314.         $aIncorrectAnswers = [];
  315.         $idTraning $request->get('idTraning') ?: 'traningParams_0';
  316.         $showButtonRepeatNumbers false;
  317.         if ($subtheme == "flashcards") {
  318.             $val $request->get('value');
  319.             $result $val;
  320.             $expectAnswer $request->get('expectAnswer');
  321.             $correctAnswer $val == $expectAnswer 0;
  322.             $aNumbers = [$expectAnswer];
  323.         } else {
  324.             $result $request->get('result');
  325.             if (in_array($subtheme, [
  326.                 Parameters::TASK_CATEGORY_WILES,
  327.                 Parameters::TASK_CATEGORY_DIVISION,
  328.                 Parameters::TASK_CATEGORY_MULTIPLICATION,
  329.                 Parameters::TASK_CATEGORY_SQUAREROOT,
  330.                 Parameters::TASK_CATEGORY_EXPONENTIATION])) {
  331.                 $aNumbers = [
  332.                     'firstNumber' => $request->get('firstNumber'),
  333.                     'secondNumber' => $request->get('secondNumber'),
  334.                 ];
  335.                 $level $request->get('level');
  336.                 $correctAnswer $this->get('app.task.number.generator.service')->checkMultiplicationResultTask($aNumbers$subtheme$level$result) ? 0;
  337.                 if ($allRequest) {
  338.                     $allParamsPrevGame json_decode($allRequesttrue);
  339.                     $rangeOfFirstNumber $allParamsPrevGame['rangeOfFirstNumber'] ?? 0;
  340.                     $rangeOfSecondNumber $allParamsPrevGame['rangeOfSecondNumber'] ?? 0;
  341.                 }
  342.                 if ($rangeOfFirstNumber || $rangeOfSecondNumber) {
  343.                     $sessionData = [
  344.                         "mode" => "game",
  345.                         "subject" => $subtheme,
  346.                         "level" => $level,
  347.                         "range_of_1st_number" => $rangeOfFirstNumber,
  348.                         "range_of_2st_number" => $rangeOfSecondNumber
  349.                     ];
  350.                     $session = new Session();
  351.                     $idTraningMultiplication 'traningMultiplicationParams_' $this->getUser()->getId();
  352.                     $session->set($idTraningMultiplication$sessionData);
  353.                 }
  354.             } else {
  355.                 $showButtonRepeatNumbers true;
  356.                 $resultSecond $request->get('result-second');
  357.                 $aNumbers json_decode($request->get('numbers'), true);
  358.                 if (!is_null($resultSecond)) {
  359.                     $aIncorrectAnswers = [
  360.                         'first' => ['answer' => $result'status' => $this->get('app.task.number.generator.service')->checkResultTask($aNumbers[0], $result)],
  361.                         'seccond' => ['answer' => $resultSecond'status' => $this->get('app.task.number.generator.service')->checkResultTask($aNumbers[1], $resultSecond)]
  362.                     ];
  363.                     $correctAnswer = ($aIncorrectAnswers['first']['status'] && $aIncorrectAnswers['seccond']['status']) ? 0;
  364.                 } else {
  365.                     $correctAnswer $this->get('app.task.number.generator.service')->checkResultTask($aNumbers$result) ? 0;
  366.                 }
  367.             }
  368.         }
  369.         $session = new Session();
  370.         $tranningParams $session->get($idTraning);
  371.         if (!in_array($subtheme, [
  372.                 Parameters::TASK_CATEGORY_WILES,
  373.                 Parameters::TASK_CATEGORY_DIVISION,
  374.                 Parameters::TASK_CATEGORY_MULTIPLICATION,
  375.                 Parameters::TASK_CATEGORY_SQUAREROOT,
  376.                 Parameters::TASK_CATEGORY_EXPONENTIATION]) && !empty($tranningParams['progress'])) {
  377.             $this->handleProgressTranning($correctAnswer$tranningParams$idTraning);
  378.         }
  379.         if ($allRequest) {
  380.             $allParamsPrevGame json_decode($allRequesttrue);
  381.         }
  382.         $template $correctAnswer "result_success" "result_error";
  383.         if ($request->isXmlHttpRequest()) {
  384.             $html $this->renderView('AppBundle:Student:Training/' $template '.html.twig', [
  385.                 "aIncorrectAnswers" => $aIncorrectAnswers,
  386.                 'url' => $this->generateUrl('ms_student_show_training', [
  387.                     "template" => $subtheme,
  388.                 ]),
  389.                 'showButtonRepeatNumbers' => $showButtonRepeatNumbers,
  390.                 "allParamsPrevGame" => $allParamsPrevGame,
  391.                 "numbers" => $aNumbers
  392.             ]);
  393.             return new JsonResponse([
  394.                 'success' => (bool) $correctAnswer,
  395.                 'html' => $html,
  396.             ]);
  397.         }
  398. // Якщо звичайний запит (не AJAX) — повернути повну сторінку
  399.         return $this->render('AppBundle:Student:Training/' $template '.html.twig', [
  400.             "aIncorrectAnswers" => $aIncorrectAnswers,
  401.             'url' => $this->generateUrl('ms_student_show_training', [
  402.                 "template" => $subtheme,
  403.             ]),
  404.             'showButtonRepeatNumbers' => $showButtonRepeatNumbers,
  405.             "allParamsPrevGame" => $allParamsPrevGame,
  406.             "numbers" => $aNumbers
  407.         ]);
  408.     }
  409.     public function handleProgressTranning($correctAnswer$tranningParams$idTraning)
  410.     {
  411.         if (!empty($tranningParams['progress']['originalSpeed']) && !empty($tranningParams['progress']['speed']) && !empty($tranningParams['progress']['progressSpeed'])) {
  412.             $progressSpeed = (float)$tranningParams['progress']['progressSpeed'];
  413.             if ($correctAnswer) {
  414.                 $newProgressSpeed $tranningParams['progress']['speed'] - $progressSpeed;
  415.                 if ($newProgressSpeed 0) {
  416.                     $tranningParams['progress']['speed'] = $newProgressSpeed;
  417.                 }
  418.             } else {
  419.                 if ($tranningParams['progress']['originalSpeed'] > $tranningParams['progress']['speed']) {
  420.                     $tranningParams['progress']['speed'] = $tranningParams['progress']['speed'] + $progressSpeed;
  421.                 }
  422.             }
  423.         }
  424.         if (!empty($tranningParams['progress']['originalIterator']) && !empty($tranningParams['progress']['iterator'])) {
  425.             if ($correctAnswer) {
  426.                 $tranningParams['progress']['iterator'] = $tranningParams['progress']['iterator'] + 1;
  427.             } else {
  428.                 if ($tranningParams['progress']['originalIterator'] < $tranningParams['progress']['iterator']) {
  429.                     $tranningParams['progress']['iterator'] = $tranningParams['progress']['iterator'] - 1;
  430.                 }
  431.             }
  432.         }
  433.         $session = new Session();
  434.         $session->set($idTraning$tranningParams);
  435.     }
  436. }