<?php
namespace App\Controller\Pages;
use App\Controller\API\ApiController;
use App\Controller\Utils\ContentController;
use App\Entity\KindProject;
use App\Entity\Product;
use App\Entity\Project;
use App\Entity\SeoPage;
use App\Entity\Shape;
use App\Service\DocumentFileUploader;
use App\Service\FilePathAndUrlService;
use App\Service\LocaleService;
use App\Traits\AttachmentUrls;
use Doctrine\ORM\EntityManagerInterface;
use Liip\ImagineBundle\Service\FilterService;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Intl\Countries;
use Symfony\Component\Routing\Annotation\Route;
class ProjectController extends ContentController
{
use AttachmentUrls;
private $localeService;
private $filePathAndUrlService;
protected $documentFileUploader;
public const PROJECT_BASE_BREADCRUMB = [
HomeController::HOME_BREADCRUMB,
['route' => 'pages_projects_overview', 'name' => 'Projects overview']
];
private $liip;
private $apiController;
public function __construct(EventDispatcherInterface $dispatcher, LocaleService $localeService, FilterService $liip, ApiController $apiController,
FilePathAndUrlService $filePathAndUrlService, DocumentFileUploader $documentFileUploader, EntityManagerInterface $entityManager)
{
$this->localeService = $localeService;
$this->filePathAndUrlService = $filePathAndUrlService;
$this->documentFileUploader = $documentFileUploader;
parent::__construct($dispatcher, self::class);
$this->liip = $liip;
$this->apiController = $apiController;
$this->em = $entityManager;
}
/**
* @Route({
* "ja": "/projects",
* "en": "/projects"
* }, methods={"GET"}, name="pages_projects_overview")
* @param Request $request
* @return Response
*/
public function index(Request $request): Response
{
$projects = $this->getDoctrine()->getRepository(Project::class)->findProjects();
return $this->render('pages/project/base.html.twig', [
'breadCrumbs' => self::PROJECT_BASE_BREADCRUMB,
'pictures' => $this->getPicturesToShow($projects, $this->filePathAndUrlService, $this->liip)
], null, $request);
}
/**
* @Route({
* "ja": "/projects/country/{alpha2}",
* "en": "/projects/country/{alpha2}"
* }, name="pages_projects_filter_by_countries", requirements={"slug": "[a-zA-Z0-9\-_\/]+", "kindProjectSlug": "[a-zA-Z0-9\-_\/]{2}"})
* @param Request $request
* @param $alpha2
* @return Response
*/
public function countries(Request $request, $alpha2): Response
{
$countries = Countries::getNames();
$country = Countries::getName($alpha2);
$projects = $this->apiController->getProjectsFilterByCountry($request->getLocale(), $alpha2, true);
return $this->render('pages/project/base.html.twig', [
'title' => ['country' => $country],
'country' => $country,
'breadCrumbs' => array_merge(self::PROJECT_BASE_BREADCRUMB, [['name' => $countries[ucfirst($alpha2)]]]),
'filter' => 'country',
'filterValue' => $alpha2,
'pictures' => $this->getPicturesToShow($projects, $this->filePathAndUrlService, $this->liip),
'seoPage' => $this->getDoctrine()->getRepository(SeoPage::class)->find(16)
], null, $request);
}
/**
* @Route({
* "ja": "/projects/product/{productSlug}",
* "en": "/projects/product/{productSlug}"
* }, name="pages_projects_filter_by_products", requirements={"productSlug": "[a-zA-Z0-9\-_\/]+"})
* @param Request $request
* @param $productSlug
* @return Response
*/
public function projectsFilterByProduct(Request $request, $productSlug): Response
{
$product = $this->getDoctrine()->getRepository(Product::class)->findOneBy(['slug' => $productSlug]);
$projects = $this->apiController->getProjectsFilterByProduct($request->getLocale(), $productSlug, true);
if (count($projects) === 0) {
$pictures = $this->getPicturesToShow([$product], $this->filePathAndUrlService, $this->liip);
} else {
$pictures = $this->getPicturesToShow($projects, $this->filePathAndUrlService, $this->liip);
}
return $this->render('pages/project/base.html.twig', [
'title' => ['productName' => $product->getName()],
'breadCrumbs' => array_merge(self::PROJECT_BASE_BREADCRUMB, [['name' => $product->getName()]]),
'filter' => 'product',
'filterValue' => $productSlug,
'pictures' => $pictures,
'seoPage' => $this->getDoctrine()->getRepository(SeoPage::class)->find(17)
], null, $request);
}
/**
* @Route({
* "ja": "/projects/shape/{shapeSlug}",
* "en": "/projects/shape/{shapeSlug}"
* }, name="pages_projects_filter_by_shapes", requirements={"shapeSlug": "[a-zA-Z0-9\-_\/]+"})
* @param Request $request
* @param $shapeSlug
* @return Response
*/
public function projectsFilterByShape(Request $request, $shapeSlug): Response
{
$products = $this->apiController->getProductsFilterByShape($request->getLocale(), $shapeSlug, true);
$projects = $this->getProjectsFromEntities($products, $this->getDoctrine()->getManager());
$repository = $this->em->getRepository('Gedmo\Translatable\Entity\Translation');
$shapeObject = $repository->findObjectByTranslatedField('slug', $shapeSlug, Shape::class);
$currentShapeTranslated = $this->getDoctrine()->getRepository(Shape::class)->find($shapeObject->getId());
$this->localeService->getAllTranslationsFromEntity($currentShapeTranslated);
$currentShapeTranslated = json_decode(json_encode($currentShapeTranslated));
$shape = $this->localeService->getEntityTranslated(Shape::class, $shapeObject->getId(), $request->getLocale());
return $this->render('pages/project/base.html.twig', [
'params_extra' => ['shapeSlug' => $currentShapeTranslated->slug],
'title' => ['shape' => ucfirst($shape->getName())],
'breadCrumbs' => array_merge(self::PROJECT_BASE_BREADCRUMB, [['name' => $shape->getName()]]),
'filter' => 'product',
'filterValue' => $shapeSlug,
'pictures' => $this->getPicturesToShow($projects, $this->filePathAndUrlService, $this->liip)
], null, $request);
}
/**
* @Route({
* "ja": "/projects/{kindProjectSlug}/{slug}-{id}",
* "en": "/projects/{kindProjectSlug}/{slug}-{id}"
* }, name="pages_project_details", requirements={"slug": "[a-zA-Z0-9\-_\/]+", "kindProjectSlug": "[a-zA-Z0-9\-_\/]+", "id": "[0-9]+"}, priority=2)
* @param string $kindProjectSlug
* @param string $slug
* @param Project $project
* @param Request $request
* @return Response
*/
public function show(string $kindProjectSlug, string $slug, Project $project, Request $request): Response
{
if ($project->getSlug() !== $slug) {
return $this->redirectToRoute('pages_project_details', [
'kindProjectSlug' => $project->getKindProject()->getSlug(),
'slug' => $project->getSlug(),
'id' => $project->getId()
], 301);
}
$currentKindProject = $this->localeService->getEntityTranslated(KindProject::class, $project->getKindProject()->getId(), $request->getLocale());
if ($kindProjectSlug !== $currentKindProject->getSlug()) {
return $this->redirectToRoute('pages_project_details', [
'kindProjectSlug' => $project->getKindProject()->getSlug(),
'slug' => $project->getSlug(),
'id' => $project->getId(),
], 301);
}
$products = $project->getProducts()->getValues();
foreach ($products as $product) {
$product->urlProduct = $this->generateUrl('pages_product_details', [
'collectionSlug' => $product->getCollection()->getSlug(),
'slug' => $product->getSlug(),
'id' => $product->getId()
]);
}
$this->setAttachmentUrls($project, $this->filePathAndUrlService);
$this->setAttachmentUrls($products, $this->filePathAndUrlService);
$firstLineProducts = array_slice($products, 0, ceil(count($products) / 3));
$secondLineProducts = array_slice($products, ceil(count($products) / 3), ceil(count($products) / 3));
$thirdLineProducts = array_slice($products, 2 * ceil(count($products) / 3), count($products));
return $this->render('pages/project/base.html.twig', [
'title' => ['projectName' => $project->getName()],
'project' => $project,
'downloads' => $this->documentFileUploader->getGenericPDF($project->getProducts(), $request),
'firstLineProducts' => $firstLineProducts,
'secondLineProducts' => $secondLineProducts,
'thirdLineProducts' => $thirdLineProducts,
'breadCrumbs' => array_merge(self::PROJECT_BASE_BREADCRUMB,
[['url' => $this->generateUrl('pages_projects_filter_by_kind_project', [
'kindProjectSlug' => $project->getKindProject()->getSlug(),
]), 'name' => ucfirst($kindProjectSlug)]],
[['name' => $project->getName()]]
),
'filter' => 'project',
'filterValue' => $project->getSlug(),
'pictures' => $this->getPicturesToShow([$project], $this->filePathAndUrlService, $this->liip),
'seoPage' => $this->getDoctrine()->getRepository(SeoPage::class)->find(15)
], null, $request);
}
/**
* @Route({
* "ja": "/projects/sector/{kindProjectSlug}",
* "en": "/projects/sector/{kindProjectSlug}"
* }, name="pages_projects_filter_by_kind_project", requirements={"kindProjectSlug": "[a-zA-Z0-9\-_\/]+"} )
* @param Request $request
* @param $kindProjectSlug
* @return Response
*/
public function filterProjectByKindProject(Request $request, $kindProjectSlug): Response
{
$kindProjects = $this->apiController->getAllKindProjects($request->getLocale(), true);
$currentKindProject = null;
foreach ($kindProjects as $kindProject) {
if ($kindProject->getSlug() === $kindProjectSlug) {
$currentKindProjectTranslated = $this->getDoctrine()->getRepository(KindProject::class)->find($kindProject->getId());
$this->localeService->getAllTranslationsFromEntity($currentKindProjectTranslated);
$currentKindProjectTranslated = json_decode(json_encode($currentKindProjectTranslated));
$currentKindProject = $this->localeService->getEntityTranslated(KindProject::class, $kindProject->getId(), $request->getLocale());
}
}
if (!$currentKindProject) {
return $this->redirectToRoute('pages_projects_overview', [
'previousUrl' => $request->headers->get('referer'),
], 301);
}
$projects = $this->apiController->getProjectsFilterByKindProjects($request->getLocale(), $kindProjectSlug, true);
foreach ($projects as $project) {
$project->urlProject = $this->generateUrl('pages_project_details', [
'kindProjectSlug' => $project->getKindProject()->getSlug(),
'slug' => $project->getSlug(),
'id' => $project->getId()
]);
}
$firstLineProjects = array_slice($projects, 0, ceil(count($projects) / 3));
$secondLineProjects = array_slice($projects, ceil(count($projects) / 3), ceil(count($projects) / 3));
$thirdLineProjects = array_slice($projects, 2 * ceil(count($projects) / 3), count($projects));
$repository = $this->em->getRepository('Gedmo\Translatable\Entity\Translation');
$sector = $repository->findObjectByTranslatedField('slug', $kindProjectSlug, KindProject::class);
return $this->render('pages/project/base.html.twig', [
'params_extra' => ['kindProjectSlug' => $currentKindProjectTranslated->slug],
'title' => ['sector' => $sector->getName()],
'sector' => $sector,
'firstLineProjects' => $firstLineProjects,
'secondLineProjects' => $secondLineProjects,
'thirdLineProjects' => $thirdLineProjects,
'projects' => $projects,
'breadCrumbs' => array_merge(self::PROJECT_BASE_BREADCRUMB,
[['name' => $currentKindProject->getName()]]
),
'filter' => 'kindProject',
'filterValue' => $kindProjectSlug,
'pictures' => $this->getPicturesToShow($projects, $this->filePathAndUrlService, $this->liip),
'seoPage' => $this->getDoctrine()->getRepository(SeoPage::class)->find(18)
], null, $request);
}
/**
* @param $obj
* @return string
*/
public function getShortClassName($obj): string
{
$array = explode("\\", get_class($obj));
return $array[count($array) - 1];
}
}