src/Controller/Pages/ProjectController.php line 168

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Pages;
  3. use App\Controller\API\ApiController;
  4. use App\Controller\Utils\ContentController;
  5. use App\Entity\KindProject;
  6. use App\Entity\Product;
  7. use App\Entity\Project;
  8. use App\Entity\SeoPage;
  9. use App\Entity\Shape;
  10. use App\Service\DocumentFileUploader;
  11. use App\Service\FilePathAndUrlService;
  12. use App\Service\LocaleService;
  13. use App\Traits\AttachmentUrls;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Liip\ImagineBundle\Service\FilterService;
  16. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Intl\Countries;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. class ProjectController extends ContentController
  22. {
  23.     use AttachmentUrls;
  24.     private $localeService;
  25.     private $filePathAndUrlService;
  26.     protected $documentFileUploader;
  27.     public const PROJECT_BASE_BREADCRUMB = [
  28.         HomeController::HOME_BREADCRUMB,
  29.         ['route' => 'pages_projects_overview''name' => 'Projects overview']
  30.     ];
  31.     private $liip;
  32.     private $apiController;
  33.     public function __construct(EventDispatcherInterface $dispatcherLocaleService $localeServiceFilterService $liipApiController $apiController,
  34.                                 FilePathAndUrlService $filePathAndUrlServiceDocumentFileUploader $documentFileUploaderEntityManagerInterface $entityManager)
  35.     {
  36.         $this->localeService $localeService;
  37.         $this->filePathAndUrlService $filePathAndUrlService;
  38.         $this->documentFileUploader $documentFileUploader;
  39.         parent::__construct($dispatcherself::class);
  40.         $this->liip $liip;
  41.         $this->apiController $apiController;
  42.         $this->em $entityManager;
  43.     }
  44.     /**
  45.      * @Route({
  46.      *     "ja": "/projects",
  47.      *     "en": "/projects"
  48.      * }, methods={"GET"}, name="pages_projects_overview")
  49.      * @param Request $request
  50.      * @return Response
  51.      */
  52.     public function index(Request $request): Response
  53.     {
  54.         $projects $this->getDoctrine()->getRepository(Project::class)->findProjects();
  55.         return $this->render('pages/project/base.html.twig', [
  56.             'breadCrumbs' => self::PROJECT_BASE_BREADCRUMB,
  57.             'pictures' => $this->getPicturesToShow($projects$this->filePathAndUrlService$this->liip)
  58.         ], null$request);
  59.     }
  60.     /**
  61.      * @Route({
  62.      *     "ja": "/projects/country/{alpha2}",
  63.      *     "en": "/projects/country/{alpha2}"
  64.      * }, name="pages_projects_filter_by_countries", requirements={"slug": "[a-zA-Z0-9\-_\/]+", "kindProjectSlug": "[a-zA-Z0-9\-_\/]{2}"})
  65.      * @param Request $request
  66.      * @param $alpha2
  67.      * @return Response
  68.      */
  69.     public function countries(Request $request$alpha2): Response
  70.     {
  71.         $countries Countries::getNames();
  72.         $country Countries::getName($alpha2);
  73.         $projects $this->apiController->getProjectsFilterByCountry($request->getLocale(), $alpha2true);
  74.         return $this->render('pages/project/base.html.twig', [
  75.             'title' => ['country' => $country],
  76.             'country' => $country,
  77.             'breadCrumbs' => array_merge(self::PROJECT_BASE_BREADCRUMB, [['name' => $countries[ucfirst($alpha2)]]]),
  78.             'filter' => 'country',
  79.             'filterValue' => $alpha2,
  80.             'pictures' => $this->getPicturesToShow($projects$this->filePathAndUrlService$this->liip),
  81.             'seoPage' => $this->getDoctrine()->getRepository(SeoPage::class)->find(16)
  82.         ], null$request);
  83.     }
  84.     /**
  85.      * @Route({
  86.      *     "ja": "/projects/product/{productSlug}",
  87.      *     "en": "/projects/product/{productSlug}"
  88.      * }, name="pages_projects_filter_by_products", requirements={"productSlug": "[a-zA-Z0-9\-_\/]+"})
  89.      * @param Request $request
  90.      * @param $productSlug
  91.      * @return Response
  92.      */
  93.     public function projectsFilterByProduct(Request $request$productSlug): Response
  94.     {
  95.         $product $this->getDoctrine()->getRepository(Product::class)->findOneBy(['slug' => $productSlug]);
  96.         $projects $this->apiController->getProjectsFilterByProduct($request->getLocale(), $productSlugtrue);
  97.         if (count($projects) === 0) {
  98.             $pictures $this->getPicturesToShow([$product], $this->filePathAndUrlService$this->liip);
  99.         } else {
  100.             $pictures $this->getPicturesToShow($projects$this->filePathAndUrlService$this->liip);
  101.         }
  102.         return $this->render('pages/project/base.html.twig', [
  103.             'title' => ['productName' => $product->getName()],
  104.             'breadCrumbs' => array_merge(self::PROJECT_BASE_BREADCRUMB, [['name' => $product->getName()]]),
  105.             'filter' => 'product',
  106.             'filterValue' => $productSlug,
  107.             'pictures' => $pictures,
  108.             'seoPage' => $this->getDoctrine()->getRepository(SeoPage::class)->find(17)
  109.         ], null$request);
  110.     }
  111.     /**
  112.      * @Route({
  113.      *     "ja": "/projects/shape/{shapeSlug}",
  114.      *     "en": "/projects/shape/{shapeSlug}"
  115.      * }, name="pages_projects_filter_by_shapes", requirements={"shapeSlug": "[a-zA-Z0-9\-_\/]+"})
  116.      * @param Request $request
  117.      * @param $shapeSlug
  118.      * @return Response
  119.      */
  120.     public function projectsFilterByShape(Request $request$shapeSlug): Response
  121.     {
  122.         $products $this->apiController->getProductsFilterByShape($request->getLocale(), $shapeSlugtrue);
  123.         $projects $this->getProjectsFromEntities($products$this->getDoctrine()->getManager());
  124.         $repository $this->em->getRepository('Gedmo\Translatable\Entity\Translation');
  125.         $shapeObject $repository->findObjectByTranslatedField('slug'$shapeSlugShape::class);
  126.         $currentShapeTranslated $this->getDoctrine()->getRepository(Shape::class)->find($shapeObject->getId());
  127.         $this->localeService->getAllTranslationsFromEntity($currentShapeTranslated);
  128.         $currentShapeTranslated json_decode(json_encode($currentShapeTranslated));
  129.         $shape $this->localeService->getEntityTranslated(Shape::class, $shapeObject->getId(), $request->getLocale());
  130.         return $this->render('pages/project/base.html.twig', [
  131.             'params_extra' => ['shapeSlug' => $currentShapeTranslated->slug],
  132.             'title' => ['shape' => ucfirst($shape->getName())],
  133.             'breadCrumbs' => array_merge(self::PROJECT_BASE_BREADCRUMB, [['name' => $shape->getName()]]),
  134.             'filter' => 'product',
  135.             'filterValue' => $shapeSlug,
  136.             'pictures' => $this->getPicturesToShow($projects$this->filePathAndUrlService$this->liip)
  137.         ], null$request);
  138.     }
  139.     /**
  140.      * @Route({
  141.      *     "ja": "/projects/{kindProjectSlug}/{slug}-{id}",
  142.      *     "en": "/projects/{kindProjectSlug}/{slug}-{id}"
  143.      * }, name="pages_project_details", requirements={"slug": "[a-zA-Z0-9\-_\/]+", "kindProjectSlug": "[a-zA-Z0-9\-_\/]+", "id": "[0-9]+"}, priority=2)
  144.      * @param string $kindProjectSlug
  145.      * @param string $slug
  146.      * @param Project $project
  147.      * @param Request $request
  148.      * @return Response
  149.      */
  150.     public function show(string $kindProjectSlugstring $slugProject $projectRequest $request): Response
  151.     {
  152.         if ($project->getSlug() !== $slug) {
  153.             return $this->redirectToRoute('pages_project_details', [
  154.                 'kindProjectSlug' => $project->getKindProject()->getSlug(),
  155.                 'slug' => $project->getSlug(),
  156.                 'id' => $project->getId()
  157.             ], 301);
  158.         }
  159.         $currentKindProject $this->localeService->getEntityTranslated(KindProject::class, $project->getKindProject()->getId(), $request->getLocale());
  160.         if ($kindProjectSlug !== $currentKindProject->getSlug()) {
  161.             return $this->redirectToRoute('pages_project_details', [
  162.                 'kindProjectSlug' => $project->getKindProject()->getSlug(),
  163.                 'slug' => $project->getSlug(),
  164.                 'id' => $project->getId(),
  165.             ], 301);
  166.         }
  167.         $products $project->getProducts()->getValues();
  168.         foreach ($products as $product) {
  169.             $product->urlProduct $this->generateUrl('pages_product_details', [
  170.                 'collectionSlug' => $product->getCollection()->getSlug(),
  171.                 'slug' => $product->getSlug(),
  172.                 'id' => $product->getId()
  173.             ]);
  174.         }
  175.         $this->setAttachmentUrls($project$this->filePathAndUrlService);
  176.         $this->setAttachmentUrls($products$this->filePathAndUrlService);
  177.         $firstLineProducts array_slice($products0ceil(count($products) / 3));
  178.         $secondLineProducts array_slice($productsceil(count($products) / 3), ceil(count($products) / 3));
  179.         $thirdLineProducts array_slice($productsceil(count($products) / 3), count($products));
  180.         return $this->render('pages/project/base.html.twig', [
  181.             'title' => ['projectName' => $project->getName()],
  182.             'project' => $project,
  183.             'downloads' => $this->documentFileUploader->getGenericPDF($project->getProducts(), $request),
  184.             'firstLineProducts' => $firstLineProducts,
  185.             'secondLineProducts' => $secondLineProducts,
  186.             'thirdLineProducts' => $thirdLineProducts,
  187.             'breadCrumbs' => array_merge(self::PROJECT_BASE_BREADCRUMB,
  188.                 [['url' => $this->generateUrl('pages_projects_filter_by_kind_project', [
  189.                     'kindProjectSlug' => $project->getKindProject()->getSlug(),
  190.                 ]), 'name' => ucfirst($kindProjectSlug)]],
  191.                 [['name' => $project->getName()]]
  192.             ),
  193.             'filter' => 'project',
  194.             'filterValue' => $project->getSlug(),
  195.             'pictures' => $this->getPicturesToShow([$project], $this->filePathAndUrlService$this->liip),
  196.             'seoPage' => $this->getDoctrine()->getRepository(SeoPage::class)->find(15)
  197.         ], null$request);
  198.     }
  199.     /**
  200.      * @Route({
  201.      *     "ja": "/projects/sector/{kindProjectSlug}",
  202.      *     "en": "/projects/sector/{kindProjectSlug}"
  203.      * }, name="pages_projects_filter_by_kind_project", requirements={"kindProjectSlug": "[a-zA-Z0-9\-_\/]+"} )
  204.      * @param Request $request
  205.      * @param $kindProjectSlug
  206.      * @return Response
  207.      */
  208.     public function filterProjectByKindProject(Request $request$kindProjectSlug): Response
  209.     {
  210.         $kindProjects $this->apiController->getAllKindProjects($request->getLocale(), true);
  211.         $currentKindProject null;
  212.         foreach ($kindProjects as $kindProject) {
  213.             if ($kindProject->getSlug() === $kindProjectSlug) {
  214.                 $currentKindProjectTranslated $this->getDoctrine()->getRepository(KindProject::class)->find($kindProject->getId());
  215.                 $this->localeService->getAllTranslationsFromEntity($currentKindProjectTranslated);
  216.                 $currentKindProjectTranslated json_decode(json_encode($currentKindProjectTranslated));
  217.                 $currentKindProject $this->localeService->getEntityTranslated(KindProject::class, $kindProject->getId(), $request->getLocale());
  218.             }
  219.         }
  220.         if (!$currentKindProject) {
  221.             return $this->redirectToRoute('pages_projects_overview', [
  222.                 'previousUrl' => $request->headers->get('referer'),
  223.             ], 301);
  224.         }
  225.         $projects $this->apiController->getProjectsFilterByKindProjects($request->getLocale(), $kindProjectSlugtrue);
  226.         foreach ($projects as $project) {
  227.             $project->urlProject $this->generateUrl('pages_project_details', [
  228.                 'kindProjectSlug' => $project->getKindProject()->getSlug(),
  229.                 'slug' => $project->getSlug(),
  230.                 'id' => $project->getId()
  231.             ]);
  232.         }
  233.         $firstLineProjects array_slice($projects0ceil(count($projects) / 3));
  234.         $secondLineProjects array_slice($projectsceil(count($projects) / 3), ceil(count($projects) / 3));
  235.         $thirdLineProjects array_slice($projectsceil(count($projects) / 3), count($projects));
  236.         $repository $this->em->getRepository('Gedmo\Translatable\Entity\Translation');
  237.         $sector $repository->findObjectByTranslatedField('slug'$kindProjectSlugKindProject::class);
  238.         return $this->render('pages/project/base.html.twig', [
  239.             'params_extra' => ['kindProjectSlug' => $currentKindProjectTranslated->slug],
  240.             'title' => ['sector' => $sector->getName()],
  241.             'sector' => $sector,
  242.             'firstLineProjects' => $firstLineProjects,
  243.             'secondLineProjects' => $secondLineProjects,
  244.             'thirdLineProjects' => $thirdLineProjects,
  245.             'projects' => $projects,
  246.             'breadCrumbs' => array_merge(self::PROJECT_BASE_BREADCRUMB,
  247.                 [['name' => $currentKindProject->getName()]]
  248.             ),
  249.             'filter' => 'kindProject',
  250.             'filterValue' => $kindProjectSlug,
  251.             'pictures' => $this->getPicturesToShow($projects$this->filePathAndUrlService$this->liip),
  252.             'seoPage' => $this->getDoctrine()->getRepository(SeoPage::class)->find(18)
  253.         ], null$request);
  254.     }
  255.     /**
  256.      * @param $obj
  257.      * @return string
  258.      */
  259.     public function getShortClassName($obj): string
  260.     {
  261.         $array explode("\\"get_class($obj));
  262.         return $array[count($array) - 1];
  263.     }
  264. }