<?php
namespace App\Controller\Front;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Entity\Locale;
use App\Entity\Projects;
use App\Entity\ProjectParts;
use App\Entity\ProjectPartFiles;
use App\Entity\ProjectsLocal;
use App\Entity\Category;
use App\Entity\CategoryLocal;
use App\Service\LocalList;
use Symfony\Component\Routing\RouterInterface;
use App\Repository\ProjectsRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Cookie;
class ProjectFrontController extends AbstractController
{
private $translator;
protected $entityManager;
private $repository_project;
private $localList;
private $router;
const max_item_image = 4;
public function __construct(ProjectsRepository $repository,TranslatorInterface $translator,EntityManagerInterface $entityManager , LocalList $localList , RouterInterface $router)
{
$this->repository_project = $repository;
$this->translator = $translator;
$this->entityManager = $entityManager;
$this->localList = $localList;
$this->router = $router;
}
public function FlatRecursiveArray ($childs,array &$tab=null)
{
foreach($childs as $key => $child){
$tab[] = $key;
if($child != null) $this->FlatRecursiveArray($child , $tab);
}
return $tab;
}
/**
* @Route("/{_locale}", name="index")
*/
public function index(string $_locale, Request $request)
{
$item_selected = $request->cookies->get('item_selected');
$url = $request->getUri();
$this->localList->add_log($url,$item_selected);
if(!$_locale) $_locale = Locale::DEFAULT_LANG;
return $this->redirectToRoute('dashboard',["_locale"=>$_locale]);
}
/**
* @Route("/projects/{_locale}", name="front_projects")
*/
public function front_projects(string $_locale, Request $request)
{
$item_selected = $request->cookies->get('item_selected');
if($request->get("f")){
$filters = $request->get("f");
$categoriesSlugs = explode(" ",$filters);
$categoriesGroup = array();
foreach($categoriesSlugs as $categorieSlug){
if($categorieSlug){
$categorie = $this->getDoctrine()->getRepository(CategoryLocal::class)->findOneBy(["slug" => $categorieSlug]);
if($categorie) array_push($categoriesGroup, $categorie->getCatgeory()->getId());
}
}
$this->localList->creat_cookie_for_item_selected($categoriesGroup);
$item_selected = '[';
foreach ($categoriesGroup as $categorieId){
$item_selected .= "'".$categorieId."',";
}
$item_selected = ']';
}
$locale = $this->entityManager->getRepository(Locale::class)->findOneBy(array('iso_code' => $_locale));
if(!$locale) return $this->redirectToRoute('front_projects', ['_locale' => Locale::DEFAULT_LANG]);
$list_categories_filters = $this->getListCategoryInFilter($item_selected,$locale);
$url = $request->getUri();
$this->localList->add_log($url,$list_categories_filters);
$Projects_list = $this->repository_project->getProjectId([],$locale,0,self::max_item_image);
$all_projects = $this->repository_project->findByLocale($locale);
$category_list_null_parent = $this->getDoctrine() ->getRepository(Category::class) ->findBy(array('deleted'=>null , 'parent' =>null),array('id' => 'DESC'));
$categrie_list = $this->getDoctrine() ->getRepository(Category::class) ->findByLocale($locale);
$null_parent_categories = array();
$childs_categories = array();
$nb_categorie = array();
$bn_total_categorie = array();
foreach($category_list_null_parent as $key => $category){
$childs_corrdonnee = array();
$caterogy_have_parent = array();
$category_nullParent_childs = $this->localList->buildTree($categrie_list, $category->getId());
$projectsOfCategory = $this->entityManager->getRepository(Projects::class)->findProjByCategory($category);
$category_nullParent_childs = $this->FlatRecursiveArray($category_nullParent_childs);
$bn_total_categorie[$category->getId()] = 0;
if($category_nullParent_childs) $bn_total_categorie[$category->getId()] = count($category_nullParent_childs);
$childs_categories[$category->getId()] = $category_nullParent_childs;
}
$top_projects_list = $this->repository_project->findTopProjectsByLocale($locale);
return $this->render('front/projects/index.html.twig', [
'controller_name' => $this->translator->trans('Front.Controller.name'),
'titre_page' => $this->translator->trans('Front.Controller.front_page_title'),
'Projects_list' => $Projects_list,
'category_list_null_parent' => $category_list_null_parent,
'all_projects' => count($all_projects),
'childs_categories' => $childs_categories,
"bn_total_categorie"=>$bn_total_categorie,
"top_projects_list" => $top_projects_list,
'item_selected'=> $item_selected
]);
}
/**
* @Route("/project/{slug}/{_locale}", name="front_project_details")
*/
public function front_project_details(Request $request,string $slug , string $_locale)
{
$locale = $this->entityManager->getRepository(Locale::class)->findOneBy(array('iso_code' => $_locale));
$item_selected = $request->cookies->get('item_selected');
$list_categories_filters = $this->getListCategoryInFilter($item_selected,$locale);
$url = $request->getUri();
$this->localList->add_log($url,$list_categories_filters);
if(!$locale){
return $this->redirectToRoute('front_project_details', [
'slug' => $slug,
'_locale' => Locale::DEFAULT_LANG
]);
}
$projectlocale = $this->entityManager->getRepository(ProjectsLocal::class)->findBy(array('slug' => $slug));
if(!$projectlocale){
return $this->redirectToRoute('front_projects', [
'_locale' => Locale::DEFAULT_LANG
]);
}
$project = $this->repository_project->findProjBySlug($slug);
$projectParts = $this->entityManager->getRepository(ProjectParts::class)->getActiveItemProj($project,$locale);
$part_images = $this->localList->getProjectParts($projectParts);
return $this->render('front/projects/details.html.twig', [
'controller_name' => $this->translator->trans('Front.Controller.name'),
'project' => $project,
'date_creation' => $this->localList->FormattedCreationDate($project->getDateRealisation() , $_locale),
'projectParts' => $projectParts,
'part_images' => $part_images,
'titre_page' => $this->translator->trans('Project.Controller.index.titre_page'),
]);
}
/**
* @Route("/project/creat_tags_btn_ajax", options = { "expose" = true },name="creat_tags_btn_ajax")
*/
public function creat_tags_btn_ajax(Request $request)
{
$html = "";
$_locale = $request->get("local");
$categoriesGroup = $request->get("liste_categorie_selected");
if( $request->get("filtre") == true ) $this->localList->creat_cookie_for_item_selected($categoriesGroup);
if($categoriesGroup == null && $request->get("filtre")== true){
$this->localList->creat_cookie_for_item_selected(null);
}else{
$locale = $this->entityManager->getRepository(Locale::class)->findOneBy(array('iso_code' => $_locale));
$categories = $this->entityManager->getRepository(Category::class)->findByLocaleAndIdCategorie($locale,$categoriesGroup);
$html = $this->get('twig')->render('front/projects/btn_tags.html.twig', [
'categories' =>$categories,
]);
}
return new JsonResponse($html);
}
/**
* @Route("/project/update_cookie_item_selected", options = { "expose" = true },name="update_cookie_item_selected")
*/
public function update_cookie_item_selected(Request $request)
{
$response = new Response();
$categorie = $request->get("categorie_selected");
$cookie = new Cookie('item_selected', json_encode($categorie), time() + (365 * 24 * 60 * 60), '/', null, false, false);
$response->headers->setCookie($cookie);
$response->sendHeaders();
return new Response('ok');
}
/**
* @Route("/project/project_charger_ajax", options = { "expose" = true },name="project_charger_ajax")
*/
public function project_charger_ajax(Request $request)
{
$ChargmentPosition = $request->get("position");
$_locale = $request->get("local");
$categoriesGroup = [];
$current_projet = null;
if($request->get("current_projet") != null) $current_projet = $request->get("current_projet");
if ($request->get("liste_categorie_selected") != null) $categoriesGroup = $request->get("liste_categorie_selected");
$locale = $this->entityManager->getRepository(Locale::class)->findOneBy(array('iso_code' => $_locale));
$others = true;
$Projects_path = array ();
$Projects_list = $this->repository_project->getProjectId($categoriesGroup, $locale,intval($ChargmentPosition));
$project_liste_count = count($Projects_list["project"]);
if($Projects_list["count"] <= $project_liste_count) $others = false;
$html = $this->get('twig')->render('front/projects/add_projects.html.twig', [
'Projects_list' =>$Projects_list["project"],
"locale"=>$_locale,
"current_projet"=>$current_projet,
"localList"=>$this->localList
]);
$Projects_path = array(
"html_content" => $html,
"others_test" => $others,
"count"=>$project_liste_count
);
return new JsonResponse($Projects_path);
}
public function getListCategoryInFilter ($itemselected,$locale)
{
$categories_ids = array_slice(explode('"', $itemselected),1,-1);
foreach (array_keys($categories_ids, ",", true) as $key) {
unset($categories_ids[$key]);
}
$list_categories_filters = "";
foreach ($categories_ids as $key => $value){
if ($value != ","){
$category = $this->getDoctrine()->getRepository(CategoryLocal::class)->findOneBy(["catgeory" => $value,"locale"=>$locale]);
if($category) $list_categories_filters.=$category->getLibelle()."|";
}
}
return $list_categories_filters ;
}
}
?>