src/Controller/DefaultController.php line 545

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\PlayerSessionhist;
  4. use App\Entity\Scenario;
  5. use App\Entity\TextContentPage;
  6. use App\Entity\Users;
  7. use App\Manager\RestrictedAccessManager;
  8. use App\Manager\StopStudyManager;
  9. use App\Service\Formatting;
  10. use App\Entity\Media;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Doctrine\Persistence\ManagerRegistry;
  13. use HWI\Bundle\OAuthBundle\Security\Http\ResourceOwnerMapLocator;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\RouterInterface;
  22. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  23. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  24. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  25. use Doctrine\ORM\EntityManager;
  26. use Doctrine\ORM\OptimisticLockException;
  27. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  28. use Symfony\Contracts\Translation\TranslatorInterface;
  29. class DefaultController extends AbstractController
  30. {
  31.     const ITEMS_PER_PAGE 10;
  32.     protected ResourceOwnerMapLocator $resourceOwnerMapLocator;
  33.     protected array $firewallNames;
  34.     public TranslatorInterface $translator;
  35.     public function __construct(ResourceOwnerMapLocator $resourceOwnerMapLocator, array $firewallNamesAuthenticationUtils $authenticationUtilsTranslatorInterface $translator, private ManagerRegistry $managerRegistry) {
  36.         $this->authenticationUtils $authenticationUtils;
  37.         $this->resourceOwnerMapLocator $resourceOwnerMapLocator;
  38.         $this->firewallNames $firewallNames;
  39.         $this->translator $translator;
  40.     }
  41.     /**
  42.      * Methods enable translation of error|notice flash messages.
  43.      *
  44.      * @param $key
  45.      * @param array $params
  46.      * @param null $domain
  47.      * @return mixed
  48.      */
  49.     public function trans($key, array $params = [], $domain null)
  50.     {
  51.         return $this->translator->trans($key$params$domain);
  52.     }
  53.     public function addFlashMessage($type$key, array $params = [], $domain null)
  54.     {
  55.         $this->addFlash($type$this->trans($key$params$domain));
  56.     }
  57.     /**
  58.      * To test purpose
  59.      * @param Request $request
  60.      * @return Response
  61.      */
  62.     #[Route(path'/login-google'name'login_google'methods: ['GET'])]
  63.     public function loginGoogleAction(Request $request): Response
  64.     {
  65.         $error $this->authenticationUtils->getLastAuthenticationError();
  66.         $key time();
  67.         $session $request->hasSession() ? $request->getSession() : $this->container->get('request_stack')->getSession();
  68.         if ($session) {
  69.             if (!$session->isStarted()) {
  70.                 $session->start();
  71.             }
  72.             $session->set('_hwi_oauth.registration_error.'.$key$error);
  73.         }
  74.         return $this->render('frontend/login_google.html.twig', [
  75.             'error' => $error
  76.         ]);
  77.     }
  78.     /**
  79.      * To test purpose
  80.      * @param Request $request
  81.      * @return Response
  82.      */
  83.     #[Route(path'/login-linkedin'name'login_linkedin'methods: ['GET'])]
  84.     public function loginLinkedinAction(Request $request): Response
  85.     {
  86.         $error $this->authenticationUtils->getLastAuthenticationError();
  87.         $key time();
  88.         $session $request->hasSession() ? $request->getSession() : $this->container->get('request_stack')->getSession();
  89.         if ($session) {
  90.             if (!$session->isStarted()) {
  91.                 $session->start();
  92.             }
  93.             $session->set('_hwi_oauth.registration_error.'.$key$error);
  94.         }
  95.         return $this->render('frontend/login_linkedin.html.twig', [
  96.             'error' => $error
  97.         ]);
  98.     }
  99.     /**
  100.      * @param Request $request
  101.      * @return Response
  102.      */
  103.     #[Route(path'/login/check-google'name'check_google'methods: ['GET'])]
  104.     public function checkGoogleAction(Request $request): RedirectResponse
  105.     {
  106.         $resourceOwner $this->getResourceOwnerByName('google');
  107.         $accessToken $resourceOwner->getAccessToken(
  108.             $request,
  109.             $this->oauthUtils->getServiceAuthUrl($request$resourceOwner)
  110.         );
  111.         return $this->redirectToRoute('homepage');
  112.     }
  113.     /**
  114.      * @param Request $request
  115.      * @return Response
  116.      */
  117.     #[Route(path'/login/check-linkedin'name'check_linkedin'methods: ['GET'])]
  118.     public function checkLinkedinAction(Request $request): RedirectResponse
  119.     {
  120.         $resourceOwner $this->getResourceOwnerByName('linkedin');
  121.         $accessToken $resourceOwner->getAccessToken(
  122.             $request,
  123.             $this->oauthUtils->getServiceAuthUrl($request$resourceOwner)
  124.         );
  125.         return $this->redirectToRoute('homepage');
  126.     }
  127.     /**
  128.      * @param Request $request
  129.      * @return Response
  130.      */
  131.     #[Route(path'/confirm-social-login'name'confirm_social_login'methods: ['GET'])]
  132.     public function confirmSocialLoginAction(Request $requestRouterInterface $router): Response
  133.     {
  134.         $session $request->getSession();
  135.         $socialOfferConnection $session->get('socialOfferConnection'0);
  136.         $socialConnectionService $session->get('socialConnectionService''');
  137.         $socialId $session->get('socialId''');
  138.         $socialData $session->get('socialData', []);
  139.         $userUsername $session->get('userUsername''');
  140.         $session->remove('socialOfferConnection');
  141.         $session->remove('socialConnectionService');
  142.         $session->remove('socialId');
  143.         $session->remove('socialData');
  144.         // na porpojeni, po klinuti, ze to dovoluje
  145.         $session->set('connectLoginToSocial'1);
  146.         $session->set('connectAsSocialService'$socialConnectionService);
  147.         $session->set('connectSocialId'$socialId);
  148.         $session->set('connectByUsername'$userUsername);
  149.         // after login do not return to confirm page
  150.         $session->set('_security.main.target_path'$router->generate('homepage'));
  151.         return $this->render('frontend/login_connect_to_social.html.twig', [
  152.             'socialId' => $socialId,
  153.             'socialService' => $socialConnectionService,
  154.             'socialUserName' => $socialData['name'],
  155.             'socialUserEmail' => $socialData['email'],
  156.             'socialUserPicture' => $socialData['picture'],
  157.             'userUsername' => $userUsername,
  158.         ]);
  159.     }
  160.     public function getResourceOwnerByName(string $name)
  161.     {
  162.         foreach ($this->firewallNames as $firewall) {
  163.             if (!$this->resourceOwnerMapLocator->has($firewall)) {
  164.                 continue;
  165.             }
  166.             $ownerMap $this->resourceOwnerMapLocator->get($firewall);
  167.             if ($resourceOwner $ownerMap->getResourceOwnerByName($name)) {
  168.                 return $resourceOwner;
  169.             }
  170.         }
  171.         throw new NotFoundHttpException(sprintf("No resource owner with name '%s'."$name));
  172.     }
  173.     /**
  174.      * @param Request $request
  175.      * @return RedirectResponse
  176.      */
  177.     #[Route(path'/'name'default'methods: ['GET'])]
  178.     public function indexAction(): RedirectResponse
  179.     {
  180.         //  var_dump('hhnbbbbhhh');exit;
  181.         //   $translated = $this->get('translator')->trans("Hello");
  182.         //   var_dump($translated);
  183.         // POZOR vede na homepage backoffice
  184.         /*        return $this->render('default/index.html.twig', [
  185.                       'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
  186.                   ]);*/
  187.         return $this->redirectToRoute('homepage');
  188.     }
  189.     /**
  190.      * @param Request $request
  191.      * @return Response
  192.      */
  193.     #[Route(path'/contacts'name'kontakty'methods: ['GET'])]
  194.     public function showContactAction(): Response
  195.     {
  196.         //     * todo opravit routu { "en": "/contacts", "cs": "/kontakty"}
  197.         $hp $this->managerRegistry->getRepository(TextContentPage::class)->findOneBy(array('alias'=>'contacts'));
  198.         $repository $this->managerRegistry->getRepository(TextContentPage::class);
  199.         $qb $repository->createQueryBuilder('t')
  200.             ->select('t.alias''t.content''t.display')
  201.             ->where('t.display = TRUE')
  202.         ;
  203.         $query $qb->getQuery();
  204.         $activeRoutes $query->getResult();
  205.         if ($hp) {
  206.             $body $hp->getContent();
  207.             return $this->render('frontend/kontakty.html.twig', [
  208.                 'title' => $hp->getTitle(),
  209.                 'content' => $body,
  210.                 'activeRoutes' => $activeRoutes
  211.             ]);
  212.         } else {
  213.             throw $this->createNotFoundException('Page not found');
  214.         }
  215.     }
  216.     /**
  217.      *
  218.      * @param Request $request
  219.      * @return Response|null
  220.      */
  221.     #[Route(path'/about'name'o-projektu'methods: ['GET'])]
  222.     public function showProjectAction(): Response
  223.     {
  224.         //     * todo opravit routu { "en": "/about", "cs": "/o-projektu"}
  225.         $hp $this->managerRegistry->getRepository(TextContentPage::class)->findOneBy(array('alias'=>'about'));
  226.         $repository $this->managerRegistry->getRepository(TextContentPage::class);
  227.         $qb $repository->createQueryBuilder('t')
  228.             ->select('t.alias''t.content''t.display')
  229.             ->where('t.display = TRUE')
  230.         ;
  231.         $query $qb->getQuery();
  232.         $activeRoutes $query->getResult();
  233.         if ($hp) {
  234.             $body $hp->getContent();
  235.             return $this->render('frontend/o_projektu.html.twig', [
  236.                 'title' => $hp->getTitle(),
  237.                 'content' => $body,
  238.                 'activeRoutes' => $activeRoutes
  239.             ]);
  240.         } else {
  241.             throw $this->createNotFoundException('Page not found');
  242.         }
  243.     }
  244. //    /**
  245.     //     * @Route("/{page}", name="page" )
  246.     //     * @param Request $request
  247.     //     * @param string $page
  248.     //     * @return Response
  249.     //     */
  250.     //    public function showPageAction(Request $request, $page = "")
  251.     //    {
  252.     //
  253.     //        /*    $user = $this->getDoctrine()->getRepository(Users::class)->findOneBy(array('id' => 7));
  254.     //            $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
  255.     //            $this->get('security.token_storage')->setToken($token);
  256.     //            $this->get('session')->set('_security_main', serialize($token));
  257.     //            dump( $this->get('session') );
  258.     //            dump( $user );
  259.     //            */
  260.     //
  261.     //        $texts = $this->getDoctrine()->getRepository(TextContentPage::class)->findAll();
  262.     //
  263.     //        foreach($texts as $text){
  264.     //            if (!empty($page) && $page == "kontakty" && $text->getTitle() == "Kontakty"){
  265.     //                $title = "Kontakty";
  266.     //                $body = $text->getContent();
  267.     //            } elseif (!empty($page) && $page == "o-projektu" && $text->getTitle() == "O projektu"){
  268.     //                $title = "O projektu";
  269.     //                $body = $text->getContent();
  270.     //            } else {
  271.     //                continue;
  272.     ////                $title = "Nadpis";
  273.     ////                $body = '';
  274.     //            }
  275.     //            return $this->render('frontend/page.html.twig', [
  276.     //                'title' => $title,
  277.     //                'content' => $body,
  278.     //            ]);
  279.     //        }
  280.     //    }
  281.     //
  282.     //    /**
  283.     //     * @Route("/microsite/", name="microsite" )
  284.     //     * @Method ({"GET"})
  285.     //     * @param Request $request
  286.     //     * @return Response
  287.     //     */
  288.     //    public function microSiteAction(Request $request)
  289.     //    {
  290.     //        return $this->render('frontend/staticPages/microsite.html.twig');
  291.     //    }
  292.     /**
  293.      * @param Request $request
  294.      * @param RestrictedAccessManager $restrictedAccessManager
  295.      * @param Formatting $formatting
  296.      * @return Response
  297.      */
  298.     #[Route(path'/home'name'homepage'methods: ['GET'])]
  299.     public function showAction(Request $requestRestrictedAccessManager $restrictedAccessManagerFormatting $formatting): Response
  300.     {
  301.         $em $this->managerRegistry->getManager();
  302.         // TODO pridat / zmenit na  NejhranÄ›jší a Virtuální pacient mÄ›síce
  303.         // napojit media pomoci subquery dle https://stackoverflow.com/questions/34768821/join-subquery-with-doctrine-2-dbal
  304.         $repository $this->managerRegistry->getRepository(Scenario::class);
  305.         $qb $repository->createQueryBuilder('s')
  306.             //   ->select( array('s', 'm') )
  307.             //  ->leftJoin(Media::class, 'm', 'WITH', 'm.scenarioId = s.id')->where('m.isDeleted=0')->andWhere('m.active=1')
  308.         ;
  309.         $qb $qb->where(
  310.             $qb->expr()->eq('s.isDeleted'':isDeleted'),
  311.             $qb->expr()->eq('s.state'':state')
  312.         )
  313.             ->setParameter('isDeleted'0)
  314.             ->setParameter('state'1)
  315.             ->setMaxResults(3)// TODO docasne, nez budou k dispozici NejhranÄ›jší a Virtuální pacient mÄ›síce
  316.             // ->setFirstResult(10)
  317.             ->orderBy('s.createdAt''DESC');
  318.        // example4: retrieve the DQL string of what was defined in QueryBuilder  - dump q
  319.         //   $q = $qb->getDql();
  320. // example5: retrieve the associated Query object with the processed DQL
  321.         //  $qb->setParameters(array(1 => 'a', 2 => 'admin'));
  322.         if (($user $this->getUser()) && (($user->getRoles() == ['ROLE_ADMIN']))) {
  323.             // to admin show restricted
  324.         } else {
  325.             $repository $this->managerRegistry->getRepository(Scenario::class);
  326.             $existsRestricted $repository->findBy(['restricted' => true], null1);
  327.             // if exists restricted add condition
  328.             if (count($existsRestricted)) {
  329.                 try {
  330.                     $ip $restrictedAccessManager->getIpAddress($request);
  331.                     $isAllowedToRestricted $restrictedAccessManager->allowedCountry($ip);
  332.                     if (!$isAllowedToRestricted) {
  333.                         $qb $qb->andWhere('s.restricted=false');
  334.                     }
  335.                 } catch (\Exception $e) {
  336.                     $this->addFlashMessage('error''user_location_check_error', [], 'controller');
  337.                     $qb $qb->andWhere('s.restricted=false'); // user not checked do not show
  338.                 }
  339.             }
  340.         }
  341.         // $qb instanceof QueryBuilder
  342.         $query $qb->getQuery();
  343. // Set additional Query options
  344.         //  $query->setQueryHint('foo', 'bar');
  345.         //    $query->useResultCache('my_cache_id');
  346. // Execute Query
  347.         //  $result = $query->getResult();
  348.         //   $single = $query->getSingleResult();
  349.         //   $array = $query->getArrayResult();
  350.         //   $scalar = $query->getScalarResult();
  351.         //  $singleScalar = $query->getSingleScalarResult();
  352.         //    dump($array);
  353.         //$activeScenarios = $query->getResult();
  354.         //$scenarios = [];
  355.         // user s pravami na in progress
  356.         if (($user $this->getUser()) && (($user->getRoles() == ['ROLE_ADMIN']) || ($user->getRoles() == ['ROLE_REVIEWER']))) {
  357.             $qb $qb->where(
  358.                 $qb->expr()->eq('s.isDeleted'':isDeleted'),
  359.                 $qb->expr()->neq('s.state'':state')
  360.             )
  361.                 ->setParameter('isDeleted'0)
  362.                 ->setParameter('state'0)
  363.                 ->setMaxResults(3)// TODO docasne, nez budou k dispozici NejhranÄ›jší a Virtuální pacient mÄ›síce
  364.                 // ->setFirstResult(10)
  365.                 ->orderBy('s.createdAt''DESC');
  366.             $query $qb->getQuery();
  367.             //$scenarios = $query->getResult();
  368.         }
  369.         /*foreach ($activeScenarios as $activeScenario) {
  370.             array_push($scenarios, $activeScenario);
  371.         }*/
  372.         $scenarios $query->getResult();
  373.         $ids = array(0); // 0 .. pro praznou IN podminku
  374.         foreach ($scenarios as $item) {
  375.             $ids[] = $item->getId(); // idcka jen nalezenych scenarios
  376.             //  $item->setAnnotationImg( $item->getId() . ' foo.jpg' );
  377.         }
  378.         //  dump($scenarios);
  379.         // media - vsechny aktivni
  380.         $repository $this->managerRegistry->getRepository(Media::class);
  381.         $qb $repository->createQueryBuilder('m');
  382.         $qb $qb->where($qb->expr()->in('m.scenarioId'$ids), $qb->expr()->isNotNull('m.filename'), $qb->expr()->eq('m.category'':category'), $qb->expr()->eq('m.isDeleted'':isDeleted'), $qb->expr()->eq('m.active'':active'))
  383.             ->setParameter('category'1)// vybereme jen obrazky
  384.             ->setParameter('isDeleted'0)
  385.             ->setParameter('active'1);
  386.         $query $qb->getQuery();
  387.         $media_scenario $query->getResult();
  388.         /*    $media_scenario = array();
  389.             foreach ($media as $item) {
  390.               if (empty($media_scenario) && !empty($item->getScenario())) $media_scenario = $item;  // jen 1. nalezeny
  391.             }*/
  392. //dump($media_scenario);
  393.         foreach ($media_scenario as $item) {
  394.             if (!empty($item->getScenario())) {   // && !empty($item->getScenario()->getId()->getAnnotationImg())
  395.                 //  $scenarios->findBy( "id", $item->getScenario()->getId() )->setAnnotationImg( $item->getFilename() );
  396.                 // dump( $scenarios->findBy( "id", 1 ) );
  397.                 foreach ($scenarios as $scenario) {
  398.                     if ($item->getScenario()->getId() == $scenario->getId() && $item->getMediaFlag() == Media::MEDIA_FLAG_SCENARIO_INTRO ) {
  399.                         $scenario->setAnnotationImg($item->getFilename());
  400.                         $scenario->setAnnotationImgName($item->getMediaName());
  401.                         break; // jen jeden
  402.                     }
  403.                 }
  404.             }
  405.         }
  406.         // dump($scenarios);
  407.         //dump($media_scenario);
  408.         // tabulka se seznamem nejhranejsich   Pozice     PÅ™ezdívka     Absolvovaných her     Celkové skóre
  409.         $repository $this->managerRegistry->getRepository(PlayerSessionhist::class); //->getRepository(PlayerSessionhist::class)
  410.         $qb $repository->createQueryBuilder('p')//
  411.         ->select(array('u.id''u.username''COUNT(p.scenario) scenario_count''SUM(p.score) score_sum'))// 'p', 'u', ... nesmi kvuli group by
  412.         ->innerJoin('p.users''u')//, 'WITH', 'u.id = :1', 'u.id'
  413.         ->where('p.isEnded = 1 AND u.isDeleted = FALSE')
  414.             ->setMaxResults(5)
  415.             ->groupBy('u.id')
  416.             ->orderBy('score_sum''DESC')
  417. //            ->addOrderBy('scenario_count')  // sekundarne - podle toho kdo dosahl skore s nejmensim poctem her
  418.         ;
  419.         $query $qb->getQuery();
  420.         $player $query->getResult();
  421.         //dump($player);
  422.         // získání textu pro homepage + render
  423.         $hp $this->managerRegistry->getRepository(TextContentPage::class)->findOneBy(array('alias'=>'home'));
  424.         $session $request->getSession();
  425.         $repository $this->managerRegistry->getRepository(TextContentPage::class);
  426.         $qb $repository->createQueryBuilder('t')
  427.             ->select('t.alias''t.display')
  428.             ->where('t.display = TRUE')
  429.             ->orderBy('t.id''ASC')
  430.             ;
  431.         $query $qb->getQuery();
  432.         $activeRoutes $query->getResult();
  433.         $session->set('activeRoutes'$activeRoutes);
  434.         $userAuth null;
  435.         if ($this->getUser()){
  436.             $isLogged $em->getRepository(Users::class)->findOneBy(array('username' => $this->getUser()->getUserIdentifier()));
  437.             $repository $this->managerRegistry->getRepository(PlayerSessionhist::class); //->getRepository(PlayerSessionhist::class)
  438.             $qb $repository->createQueryBuilder('p')//
  439.             ->select(array('u.id''u.username''COUNT(p.scenario) scenario_count''SUM(p.score) score_sum'))// 'p', 'u', ... nesmi kvuli group by
  440.             ->innerJoin('p.users''u')//, 'WITH', 'u.id = :1', 'u.id'
  441.             ->where('p.isEnded = 1 AND u.isDeleted = FALSE AND u.id ='.$isLogged->getId())
  442.             ->groupBy('u.id')
  443.             ;
  444.             $query $qb->getQuery();
  445.             $userAuth $query->getResult();
  446.         }
  447.         if ($hp) {
  448.             $body $hp->getContent();
  449.             return $this->render('frontend/index.html.twig', [
  450.                 // 'body_text' => "Hello world",
  451.                 'scenarios' => $scenarios,
  452.                 'media_scenario' => $media_scenario,
  453.                 'player' => $player,
  454.                 'content' => $body,
  455.                 'userAuth' => $userAuth,
  456.                 'activeRoutes' => $activeRoutes
  457.             ]);
  458.         } else {
  459.             throw $this->createNotFoundException('Page not found');
  460.         }
  461.     }
  462.     /**
  463.      * @param Request $request
  464.      * @param RestrictedAccessManager $restrictedAccessManager
  465.      * @param Formatting $formatting
  466.      * @return Response
  467.      */
  468.     #[Route(path'/vp'name'virtual-patients'methods: ['GET''POST'])]
  469.     public function showAllAction(Request $requestRestrictedAccessManager $restrictedAccessManagerFormatting $formatting): Response
  470.     {
  471.         $em $this->managerRegistry->getManager();
  472.         $selectedPage = (int)$request->get('p'1);
  473.         if ($selectedPage <= 0$selectedPage 1;
  474.         $repository $this->managerRegistry->getRepository(Scenario::class);
  475.         $qb $repository->createQueryBuilder('s');
  476.         $qb $qb->where(
  477.             $qb->expr()->eq('s.isDeleted'':isDeleted'),
  478.             $qb->expr()->eq('s.state'':state')
  479.         );
  480.         $qb->setParameter('isDeleted'0);
  481.         $qb->setParameter('state'1);
  482.         if (($user $this->getUser()) && (($user->getRoles() == ['ROLE_ADMIN']))) {
  483.         } else {
  484.             $repository $this->managerRegistry->getRepository(Scenario::class);
  485.             $existsRestricted $repository->findBy(['restricted' => true], null1);
  486.             // if exists restricted add condition
  487.             if (count($existsRestricted)) {
  488.                 try {
  489.                     $ip $restrictedAccessManager->getIpAddress($request);
  490.                     $isAllowedToRestricted $restrictedAccessManager->allowedCountry($ip);
  491.                     if (!$isAllowedToRestricted) {
  492.                         $qb $qb->andWhere('s.restricted=false');
  493.                     }
  494.                 } catch (\Exception $e) {
  495.                     $this->addFlashMessage('error''user_location_check_error', [], 'controller');
  496.                     $qb $qb->andWhere('s.restricted=false'); // user not checked do not show
  497.                 }
  498.             }
  499.         }
  500.         // user s pravami na in progress
  501.         if (($user $this->getUser()) && (($user->getRoles() == ['ROLE_ADMIN']) || ($user->getRoles() == ['ROLE_REVIEWER']))) {
  502.             $qb $qb->where(
  503.                 $qb->expr()->eq('s.isDeleted'':isDeleted'),
  504.                 $qb->expr()->neq('s.state'':state')
  505.             )
  506.             ->setParameter('isDeleted'0)
  507.             ->setParameter('state'0)
  508.             //->setMaxResults(30)// TODO docasne, nez budou k dispozici NejhranÄ›jší a Virtuální pacient mÄ›síce
  509.             ;
  510.             //$scenarios = $query->getResult();
  511.         }
  512.         $qb->select('count(s.id)');
  513.         $totalCount $qb->getQuery()->getSingleScalarResult();
  514.         $qb->select('s');
  515.         $qb->setFirstResult(self::ITEMS_PER_PAGE*($selectedPage-1));
  516.         $qb->setMaxResults(self::ITEMS_PER_PAGE);
  517.         $qb->orderBy('s.createdAt''DESC');
  518.         $query $qb->getQuery();
  519.         $scenarios $query->getResult();
  520.         $ids = array(0); // 0 .. pro praznou IN podminku
  521.         foreach ($scenarios as $item) {
  522.             $ids[] = $item->getId(); // idcka jen nalezenych scenarios
  523.         }
  524.         // media - vsechny aktivni
  525.         $repository $this->managerRegistry->getRepository(Media::class);
  526.         $qb $repository->createQueryBuilder('m');
  527.         $qb $qb->where($qb->expr()->in('m.scenarioId'$ids),  $qb->expr()->isNotNull('m.filename'),
  528.                                                                     $qb->expr()->eq('m.category'':category'),
  529.                                                                     $qb->expr()->eq('m.isDeleted'':isDeleted'),
  530.                                                                     $qb->expr()->eq('m.active'':active'),
  531.                                                                     $qb->expr()->eq('m.mediaFlag'':mediaFlag'))
  532.             ->setParameter('category'1)// vybereme jen obrazky
  533.             ->setParameter('isDeleted'0)
  534.             ->setParameter('active'1)
  535.             ->setParameter('mediaFlag'Media::MEDIA_FLAG_SCENARIO_INTRO);
  536.         $query $qb->getQuery();
  537.         $media_scenario $query->getResult();
  538.         foreach ($media_scenario as $item) {
  539.             if (!empty($item->getScenario())) {   // && !empty($item->getScenario()->getId()->getAnnotationImg())
  540.                 //  $scenarios->findBy( "id", $item->getScenario()->getId() )->setAnnotationImg( $item->getFilename() );
  541.                 // dump( $scenarios->findBy( "id", 1 ) );
  542.                 foreach ($scenarios as $scenario) {
  543.                     if ($item->getScenario()->getId() == $scenario->getId()) {
  544.                         $scenario->setAnnotationImg($item->getFilename());
  545.                         $scenario->setAnnotationImgName($item->getMediaName());
  546.                         break; // jen jeden
  547.                     }
  548.                 }
  549.             }
  550.         }
  551.         return $this->render('frontend/scenario_vypis.html.twig', [
  552.             'scenarios' => $scenarios,
  553.             'totalCount' => $totalCount,
  554.             'totalPages' => ceil($totalCount/self::ITEMS_PER_PAGE),
  555.             'currentPage' => $selectedPage,
  556.             'searched' => false
  557.         ]);
  558.     }
  559.     /**
  560.      * @param Request $request
  561.      * @return Response
  562.      */
  563.     #[Route(path'/vp/search'name'virtual-patients-search'methods: ['GET''POST'])]
  564.     public function searchScenariosAction(Request $request): Response
  565.     {
  566.         $session $request->getSession();
  567.         $searchingString $request->request->get('searchingString');
  568.         if ($searchingString === "") {
  569.             $selectedPage $request->get('p'1);
  570.             $repository $this->managerRegistry->getRepository(Scenario::class);
  571.             $qb $repository->createQueryBuilder('s');
  572.             $qb $qb->where(
  573.                 $qb->expr()->eq('s.isDeleted'':isDeleted'),
  574.                 $qb->expr()->eq('s.state'':state')
  575.             );
  576.             $qb->setParameter('isDeleted'0);
  577.             $qb->setParameter('state'1);
  578.             $qb->select('count(s.id)');
  579.             $totalCount $qb->getQuery()->getSingleScalarResult();
  580.             $qb->select('s');
  581.             $qb->setFirstResult(self::ITEMS_PER_PAGE*($selectedPage-1));
  582.             $qb->setMaxResults(self::ITEMS_PER_PAGE);
  583.             $qb->orderBy('s.createdAt''DESC');
  584.             $query $qb->getQuery();
  585.             $scenarios $query->getResult();
  586.         } elseif ($searchingString != null) {
  587.             $findWithString $searchingString;
  588.             $session->set('searchingString'$searchingString);
  589.         } else {
  590.             $findWithString $session->get('searchingString');
  591.         }
  592.         if (empty($scenarios)) {
  593.             $selectedPage $request->get('p'1);
  594.             $repository $this->managerRegistry->getRepository(Scenario::class);
  595.             $qb $repository->createQueryBuilder('s');
  596.             $qb $qb->where(
  597.                 $qb->expr()->eq('s.isDeleted'':isDeleted'),
  598.                 $qb->expr()->eq('s.state'':state'),
  599.                 $qb->expr()->like('LOWER(s.title)'':findWithString')
  600.             );
  601.             $qb->setParameter('isDeleted'0);
  602.             $qb->setParameter('state'1);
  603.             $qb->setParameter('findWithString''%' strtolower($findWithString) . '%');
  604.             $qb->select('count(s.id)');
  605.             $totalCount $qb->getQuery()->getSingleScalarResult();
  606.             $qb->select('s');
  607.             $qb->setFirstResult(self::ITEMS_PER_PAGE * ($selectedPage 1));
  608.             $qb->setMaxResults(self::ITEMS_PER_PAGE);
  609.             $qb->orderBy('s.createdAt''DESC');
  610.             $query $qb->getQuery();
  611.             $scenarios $query->getResult();
  612.         }
  613.         if (empty($scenarios)) {
  614.             $session->set('searchingString'"");
  615.             $this->addFlashMessage('error''scenario_search_not_found', array('%string%' => $searchingString), 'controller');
  616.         }
  617.         if (empty($scenarios) && isset($searchingString)) {
  618.             $em $this->managerRegistry->getManager();
  619.             $selectedPage $request->get('p'1);
  620.             $repository $this->managerRegistry->getRepository(Scenario::class);
  621.             $qb $repository->createQueryBuilder('s');
  622.             $qb $qb->where(
  623.                 $qb->expr()->eq('s.isDeleted'':isDeleted'),
  624.                 $qb->expr()->eq('s.state'':state')
  625.             );
  626.             $qb->setParameter('isDeleted'0);
  627.             $qb->setParameter('state'1);
  628.             $qb->select('count(s.id)');
  629.             $totalCount $qb->getQuery()->getSingleScalarResult();
  630.             $qb->select('s');
  631.             $qb->setFirstResult(self::ITEMS_PER_PAGE*($selectedPage-1));
  632.             $qb->setMaxResults(self::ITEMS_PER_PAGE);
  633.             $qb->orderBy('s.createdAt''DESC');
  634.             $query $qb->getQuery();
  635.             $scenarios $query->getResult();
  636.         }
  637.         $ids = array(0); // 0 .. pro praznou IN podminku
  638.         foreach ($scenarios as $item) {
  639.             $ids[] = $item->getId(); // idcka jen nalezenych scenarios
  640.         }
  641.         // media - vsechny aktivni
  642.         $repository $this->managerRegistry->getRepository(Media::class);
  643.         $qb $repository->createQueryBuilder('m');
  644.         $qb $qb->where($qb->expr()->in('m.scenarioId'$ids), $qb->expr()->isNotNull('m.filename'),
  645.             $qb->expr()->eq('m.category'':category'),
  646.             $qb->expr()->eq('m.isDeleted'':isDeleted'),
  647.             $qb->expr()->eq('m.active'':active'),
  648.             $qb->expr()->eq('m.mediaFlag'':mediaFlag'))
  649.             ->setParameter('category'1)// vybereme jen obrazky
  650.             ->setParameter('isDeleted'0)
  651.             ->setParameter('active'1)
  652.             ->setParameter('mediaFlag'Media::MEDIA_FLAG_SCENARIO_INTRO);
  653.         $query $qb->getQuery();
  654.         $media_scenario $query->getResult();
  655.         foreach ($media_scenario as $item) {
  656.             if (!empty($item->getScenario())) {   // && !empty($item->getScenario()->getId()->getAnnotationImg())
  657.                 //  $scenarios->findBy( "id", $item->getScenario()->getId() )->setAnnotationImg( $item->getFilename() );
  658.                 // dump( $scenarios->findBy( "id", 1 ) );
  659.                 foreach ($scenarios as $scenario) {
  660.                     if ($item->getScenario()->getId() == $scenario->getId()) {
  661.                         $scenario->setAnnotationImg($item->getFilename());
  662.                         $scenario->setAnnotationImgName($item->getMediaName());
  663.                         break; // jen jeden
  664.                     }
  665.                 }
  666.             }
  667.         }
  668.         return $this->render('frontend/scenario_vypis.html.twig', [
  669.             'scenarios' => $scenarios,
  670.             'totalCount' => $totalCount,
  671.             'totalPages' => ceil($totalCount self::ITEMS_PER_PAGE),
  672.             'currentPage' => $selectedPage,
  673.             'searched' => true
  674.         ]);
  675.     }
  676. }