src/Race/Controller/RaceController.php line 38

Open in your IDE?
  1. <?php
  2. namespace App\Race\Controller;
  3. use App\Profile\Form\Type\ProfileAttendType;
  4. use App\Profile\Model\Profile as ModelProfile;
  5. use App\Profile\Service\ProfileService;
  6. use App\Race\Event\RaceAttendEvent;
  7. use App\Race\Event\RaceEvents;
  8. use App\Race\Form\Type\RaceFilterType;
  9. use App\Race\Manager\RaceManager;
  10. use App\Timeline\Event\TimelinePostDeletedEvent;
  11. use App\Timeline\Event\TimelinePostEvents;
  12. use App\Timeline\Event\TimelinePostPublishedEvent;
  13. use Carbon\Carbon;
  14. use Doctrine\DBAL\Query\QueryBuilder;
  15. use Knp\Component\Pager\PaginatorInterface;
  16. use Pimcore\Controller\FrontendController;
  17. use Pimcore\Model\DataObject\Folder;
  18. use Pimcore\Model\DataObject\Profile;
  19. use Pimcore\Model\DataObject\Race;
  20. use Pimcore\Model\DataObject\Raceday;
  21. use Pimcore\Model\DataObject\TimelinePost;
  22. use Pimcore\Translation\Translator;
  23. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  24. use Symfony\Component\Form\Form;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Symfony\Component\Uid\Uuid;
  29. use Symfony\Contracts\Translation\TranslatorInterface;
  30. class RaceController extends FrontendController
  31. {
  32.   /**
  33.    * List with race and filter...
  34.    */
  35.   public function races(Request $requestPaginatorInterface $paginator)
  36.   {
  37.     $period $request->get('period''future');
  38.     $country $request->get('country'null);
  39.     $page $request->get('page'1);
  40.     $filter $this->createForm(RaceFilterType::class, [
  41.       'period' => $period,
  42.       'country' => $country,
  43.     ], ['method' => 'get']);
  44.     $filter->handleRequest($request);
  45.     // $raceDays = new \App\Raceday\Model\Listing();
  46.     $raceDays Raceday::getList();
  47.     // $sql = $raceDays->addConditionParam('object_race.start >= :now', ['now' => Carbon::now()->format('Y-m-d')]);
  48.     $raceDays->addConditionParam('date >= :now', ['now' => Carbon::now()->format('Y-m-d')]);
  49.     $raceDays->setOrderKey('date'false);
  50.     $maxItemsPerPage 10;
  51.     if ($filter->isSubmitted() && $filter->isValid()) {
  52.       $data = (object) $filter->getData();
  53.       $raceDays Raceday::getList();
  54.       $raceDays->setOrderKey('date'false);
  55.       // if ($data->pricemoney) {
  56.       //   $raceDays->addConditionParam('pricemoney LIKE :pricemoney', ['pricemoney' => $data->pricemoney]);
  57.       // }
  58.       $raceDays->onCreateQueryBuilder(
  59.         function (QueryBuilder $queryBuilder) use ($data) {
  60.           $queryBuilder->rightJoin('object_raceday''object_brick_query_RacetrackProfile_profile''racingtrack''object_raceday.racingtrack__id = racingtrack.o_id');
  61.           $queryBuilder->rightJoin('object_raceday''object_profile''profile''object_raceday.racingtrack__id = profile.oo_id');
  62.           if ($data->direction) {
  63.             $queryBuilder->andWhere('racingtrack.direction = "'.$data->direction.'"');
  64.           }
  65.           if ($data->surface) {
  66.             $queryBuilder->andWhere('racingtrack.surface = "'.$data->surface.'"');
  67.           }
  68.           if ($data->country) {
  69.             $queryBuilder->andWhere('profile.country = "'.$data->country.'"');
  70.           }
  71.         }
  72.       );
  73.       // if ($data->surface) {
  74.       //   $raceDays->addConditionParam('surface = :surface', ['surface' => $data->surface]);
  75.       // }
  76.       // if ($data->direction) {
  77.       //   $raceDays->addConditionParam('direction = :direction', ['direction' => $data->direction]);
  78.       // }
  79.       // if ($data->country) {
  80.       //   $raceDays->addConditionParam('country = :country', ['country' => $data->country]);
  81.       // }
  82.       if ($data->racingtrack) {
  83.         $raceDays->addConditionParam('racingtrack__id = :id', ['id' => $data->racingtrack->getId()]);
  84.       }
  85.       if ($data->period) {
  86.         $raceDays->addConditionParam('date'.($data->period == 'future' '>=' '<').' :now', ['now' => Carbon::now()->format('Y-m-d')]);
  87.         // $raceDays->addConditionParam('date '.($data->period == 'future' ? '>=' : '<').' :now', ['now' => Carbon::now()->format('Y-m-d')]);
  88.         $data->period == 'past' $raceDays->setOrder('desc') : null;
  89.         $data->period == 'future' $raceDays->setOrder('asc') : null;
  90.       }
  91.       // dd($raceDays);
  92.       $pagination $paginator->paginate(
  93.         $raceDays,
  94.         $page,
  95.         $maxItemsPerPage
  96.       );
  97.       if (!$pagination->getItems() and $pagination->getTotalItemCount() > 0) {
  98.         $documentPath $this->document->getFullPath();
  99.         $redirectUrl $documentPath.'?'.http_build_query(array_merge((array) $data, ['page' => 1]));
  100.         return $this->redirect($redirectUrl);
  101.       }
  102.       $pagination $paginator->paginate(
  103.         $raceDays,
  104.         $page,
  105.         $maxItemsPerPage
  106.       );
  107.       if (!$pagination->getItems() and $pagination->getTotalItemCount() > 0) {
  108.         $documentPath $this->document->getFullPath();
  109.         $redirectUrl $documentPath.'?'.http_build_query(array_merge((array) $data, ['page' => 1]));
  110.         return $this->redirect($redirectUrl);
  111.       }
  112.     }
  113.     $pagination $paginator->paginate(
  114.       $raceDays,
  115.       $page,
  116.       $maxItemsPerPage
  117.     );
  118.     if (!$pagination->getItems()) {
  119.       $pagination->setCurrentPageNumber(1);
  120.     }
  121.     $timelineposts TimelinePost::getList();
  122.     $timelineposts->onCreateQueryBuilder(function (QueryBuilder $queryBuilder) {
  123.       $queryBuilder->leftJoin('object_timelinepost''object_relations_timelinepost''relation''relation.src_id = object_timelinepost.oo_id AND relation.fieldname = "showPostAt"');
  124.       $queryBuilder->leftJoin('object_timelinepost''objects''auctions''auctions.o_id = relation.dest_id');
  125.       $queryBuilder->where('auctions.o_className = "Race" AND object_timelinepost.o_published = 1');
  126.     });
  127.     $timelineposts->setOrderKey('postedAt');
  128.     $timelineposts->setOrder('desc');
  129.     $timelineposts->setLimit(3);
  130.     return $this->renderTemplate('race/list.html.twig', [
  131.         'pagination' => $pagination,
  132.         'racedays' => $raceDays,
  133.         'now' => Carbon::now(),
  134.         'filter' => $filter->createView(),
  135.         'timelineposts' => $timelineposts,
  136.       ]);
  137.   }
  138.   /**
  139.    * Race List.
  140.    *
  141.    * @return Response
  142.    */
  143.   public function race(Request $requestRaceManager $raceManager)
  144.   {
  145.     $filter $request->get('filter');
  146.     $folder Folder::getById($request->get('id'))->getFullPath();
  147.     $limit $request->get('limit');
  148.     $days Race::getList();
  149.     $days->setCondition('object_race.o_path LIKE :folder', ['folder' => $folder.'%']);
  150.     $days->addConditionParam('start >= :now', ['now' => Carbon::now()->format('Y-m-d')]);
  151.     $days->setOrderKey('start');
  152.     $days->setOrder('asc');
  153.     if ($limit) {
  154.       $days->setLimit($limit);
  155.     } else {
  156.       $days->setLimit(3);
  157.     }
  158.     $days->onCreateQueryBuilder(
  159.       function (QueryBuilder $queryBuilder) use ($filter) {
  160.         $queryBuilder->join('object_race''object_racingtrack''racingtrack''object_race.racingtrack__id = racingtrack.oo_id');
  161.         if ($filter && $filter != []) {
  162.           $queryBuilder->andWhere('racingtrack.country = "'.$filter.'"');
  163.         }
  164.         $queryBuilder->groupBy(['DATE(start)''racingtrack__id']);
  165.       }
  166.     );
  167.     $days $days->load();
  168.     // $days->setCondition('o_path LIKE :folder', ['folder' => '%'.$folder.'%']);
  169.     // $db = \Pimcore\Db::get();
  170.     // $days = $db->fetchAll('SELECT *
  171.     // FROM object_race
  172.     // Right Join object_racingtrack on object_race.racingtrack__id = object_racingtrack.oo_id
  173.     // Where object_racingtrack.country = :filter AND object_race.o_path LIKE :folder AND start >= :now
  174.     // GROUP BY start
  175.     // ORDER BY start ASC
  176.     // ',
  177.     // ['filter' => $filter, 'folder' => '%'.$folder.'%', 'now' => Carbon::now()->format('Y-m-d')]);
  178.     $racedays = [];
  179.     foreach ($days as $day) {
  180.       $races $raceManager->getRacesByDayAndRacingtrack($day->getStart(), $day->getRacingtrack());
  181.       $races->setCondition('o_path LIKE :folder', ['folder' => $folder.'%']);
  182.       $races->addConditionParam('start >= :now', ['now' => Carbon::now()->format('Y-m-d')]);
  183.       $racedays[] = [
  184.         'day' => $day,
  185.         'races' => $races->load(),
  186.       ];
  187.     }
  188.     // Erweitere Renntage um iFrame Angabe der Rennen
  189.     $racedays array_map(function ($raceday) {
  190.       $iframe null;
  191.       foreach ($raceday['races'] as $race) {
  192.         if (!$race->getIFrame()) {
  193.           continue;
  194.         }
  195.         $iframe $race->getIframe();
  196.       }
  197.       return [
  198.         'day' => $raceday['day'],
  199.         'races' => $raceday['races'],
  200.          'iframe' => $iframe,
  201.       ];
  202.     }, $racedays);
  203.     $elfsight null;
  204.     if (array_key_exists('elfsight'$request->attributes->all())) {
  205.       $elfsight $request->attributes->all()['elfsight'];
  206.     }
  207.     return $this->renderTemplate('document/areabricks/races/listing.html.twig', [
  208.       'racedays' => $racedays,
  209.       'elfsight' => $elfsight,
  210.     ]);
  211.   }
  212.   /**
  213.    * Hovercard for Race.
  214.    *
  215.    * @param int $raceId
  216.    *
  217.    * @Route("/race/{raceId}/hovercard",name="race_hovercard")
  218.    */
  219.   public function hovercard(Request $request$raceIdTranslatorInterface $translatorProfileService $profileService)
  220.   {
  221.     $hovercardUid Uuid::v4();
  222.     $user $this->getUser();
  223.     $request->setLocale($request->get('_locale''en'));
  224.     if (!$translator instanceof Translator) {
  225.       throw new \Exception('wrong translator service'1);
  226.     }
  227.     $translator->setLocale($request->getLocale());
  228.     $race Race::getById($raceId);
  229.     // if (!$user instanceof Profile) {
  230.     //   throw new \Exception('user is not of type profile', 1);
  231.     // }
  232.     if ($user instanceof Profile || $user instanceof ModelProfile) {
  233.       $userIsAttending count(array_filter($race->getAttendees(), fn ($v) => $v->getObjectId() == $user->getId())) > 0;
  234.     } else {
  235.       $userIsAttending null;
  236.     }
  237.     $form null;
  238.     if ($user and $user instanceof Profile) {
  239.       $form $this->createForm(ProfileAttendType::class, [
  240.         'userId' => $user->getId(),
  241.         'uuid' => $hovercardUid,
  242.       ], [
  243.         'method' => 'POST',
  244.         'csrf_protection' => false,
  245.       ]);
  246.       $form->handleRequest($request);
  247.       if ($form->isSubmitted() && $form->isValid()) {
  248.         $hovercardUid $form->get('uuid')->getData();
  249.         if (!$form instanceof Form) {
  250.           throw new \Exception('field is not of type form');
  251.         }
  252.         if ($form->getClickedButton() === $form->get('attend')) {
  253.           $profileService->attendRace($user$race->getId());
  254.           $userIsAttending true;
  255.         }
  256.         if ($form->getClickedButton() === $form->get('cancel')) {
  257.           $profileService->cancelAttendRace($user$race->getId());
  258.           $userIsAttending false;
  259.         }
  260.         return $this->renderForm('race/hovercard_attend.html.twig', [
  261.           'uuid' => $hovercardUid,
  262.           'race' => $race,
  263.           'form' => $form,
  264.           'userIsAttending' => $userIsAttending,
  265.         ]);
  266.       }
  267.     }
  268.     if (!$race) {
  269.       throw $this->createNotFoundException("Race with id {$raceId} not found");
  270.     }
  271.     return $this->renderForm('race/hovercard.html.twig', [
  272.       'uuid' => $hovercardUid,
  273.       'race' => $race,
  274.       'form' => $form,
  275.       'userIsAttending' => $userIsAttending,
  276.     ]);
  277.   }
  278.   #[Route('{_locale}/race/{raceId}/attend'name'race_attend')]
  279.   public function attend(Request $request$raceIdProfileService $profileServiceEventDispatcherInterface $eventDispatcher)
  280.   {
  281.     $user $this->getUser();
  282.     $race Race::getById($raceId);
  283.     if (!$user instanceof Profile and !$user instanceof ModelProfile) {
  284.       throw new \Exception('user is not of type profile'1);
  285.     }
  286.     $userIsAttending count(array_filter($race->getAttendees(), fn ($v) => $v->getObjectId() == $user->getId())) > 0;
  287.     $form $this->createForm(ProfileAttendType::class, [
  288.       'userId' => $user->getId(),
  289.     ], [
  290.       'method' => 'POST',
  291.       'csrf_protection' => false,
  292.     ]);
  293.     $form->handleRequest($request);
  294.     if ($form->isSubmitted() && $form->isValid()) {
  295.       if (!$form instanceof Form) {
  296.         throw new \Exception('field is not of type form');
  297.       }
  298.       if ($form->getClickedButton() === $form->get('attend')) {
  299.         $post $profileService->attendRace($user$race->getId());
  300.         $event = new TimelinePostPublishedEvent($post);
  301.         $eventDispatcher->dispatch($eventTimelinePostEvents::PUBLISHED);
  302.         $event = new RaceAttendEvent($race$user);
  303.         $eventDispatcher->dispatch($eventRaceEvents::ATTEND);
  304.         return $this->renderForm('race/race_attend_success.html.twig', [
  305.           'race' => $race,
  306.           'post' => $post,
  307.           'user' => $user,
  308.           'form' => $form,
  309.           'createPostForm' => false,
  310.         ]);
  311.       } elseif ($form->getClickedButton() === $form->get('cancel')) {
  312.         $postId $profileService->cancelAttendRace($user$race->getId());
  313.         if ($postId) {
  314.           $event = new TimelinePostDeletedEvent($postId);
  315.           $eventDispatcher->dispatch($eventTimelinePostEvents::DELETED);
  316.         }
  317.         $event = new RaceAttendEvent($race$user);
  318.         $eventDispatcher->dispatch($eventRaceEvents::UNATTEND);
  319.         return $this->renderForm('race/race_attend_cancel.html.twig', [
  320.           'race' => $race,
  321.           'postId' => $postId,
  322.           'user' => $user,
  323.           'form' => $form,
  324.           'createPostForm' => false,
  325.         ]);
  326.       }
  327.     }
  328.     $response $this->renderForm('race/race_attend.html.twig', [
  329.       'race' => $race,
  330.       'user' => $user,
  331.       'form' => $form,
  332.       'userIsAttending' => $userIsAttending,
  333.     ]);
  334.     return $response;
  335.   }
  336.   #[Route('{_locale}/race/{raceId}/attendees'name'race_attendees')]
  337.   public function attendees(Request $request$raceId)
  338.   {
  339.     $race Race::getById($raceId);
  340.     $response $this->renderTemplate('race/race_attendees.html.twig', [
  341.       'race' => $race,
  342.     ]);
  343.     return $response;
  344.   }
  345. }