<?php
namespace App\Controller;
use App\Entity\Contenu;
use App\Entity\FavorisNiveau;
use App\Entity\Formation;
use App\Entity\Niveau;
use App\Entity\Produit;
use App\Entity\Profil;
use App\Entity\UserLog;
use App\Repository\ContenuRepository;
use App\Repository\UserRepository;
use App\Service\Access;
use App\Service\NiveauService;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
class NiveauController extends AbstractController
{
/**
* @Route("/load/niveau/articles/{niveau}/{page}", name="load_article_niveau", defaults={"page" : 1},options={"expose" : true})
* @param Request $request
* @param SessionInterface $session
* @param ContenuRepository $contenuRepository
* @param Niveau $niveau
* @param int $page
* @return Response
*/
public function load(Request $request, SessionInterface $session, ContenuRepository $contenuRepository, Niveau $niveau, $page = 1): Response
{
$contenus = $contenuRepository->getByProfilNiveau($this->getUser(), $niveau->getId(), 20, 20 * ($page - 1));
$nextContenus = $contenuRepository->getByProfilNiveau($this->getUser(), $niveau->getId(), 20, 20 * $page);
$hasMore = count($nextContenus) > 0;
return $this->render('niveau/next_contenus.html.twig', [
'contenus' => $contenus,
'niveau' => $niveau,
'page' => $page,
'nombre' => 20,
'sum' => $request->get('sum', 0),
'has_more' => $hasMore,
]);
}
/**
* @Route("/niveau/favorite/{id}", name="niveau_favorite")
* @param Request $request
* @param Access $access
* @param Niveau $niveau
* @return RedirectResponse|Response
*/
public function favorite(Request $request, Access $access, Niveau $niveau)
{
$this->denyAccessUnlessGranted('favoris_niveau', true);
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
$fav = $user->hasFavorisNiveau($niveau);
if (!$fav) {
$favoris = $em->getRepository(FavorisNiveau::class)->getByUser($user->getId());
foreach ($favoris as $f) {
$f->setPosition($f->getPosition() + 1);
$em->persist($f);
}
$fav = new FavorisNiveau();
$fav->setUser($user);
$fav->setNiveau($niveau);
$fav->setPosition(1);
$em->persist($fav);
} else {
$em->remove($fav);
$favoris = $em->getRepository(FavorisNiveau::class)->getByUserFromPosition($user->getId(), $fav->getPosition());
foreach ($favoris as $f) {
$f->setPosition($f->getPosition() - 1);
$em->persist($f);
}
}
$em->flush();
if ($request->isXmlHttpRequest()) {
return new Response();
} else {
$referer = $request->headers->get('referer');
return $this->redirect($referer);
}
}
/**
* @Route("/{slug}", name="niveau", requirements={"slug"="^[^_].*"})
* @param Request $request
* @param SessionInterface $session
* @param Niveau $niveau
* @param PaginatorInterface $paginator
* @return RedirectResponse|Response
*/
public function show(Request $request,
SessionInterface $session,
Niveau $niveau,
PaginatorInterface $paginator,
UserRepository $userRepository,
EntityManagerInterface $entityManager
)
{
$liens = '';
$em = $this->getDoctrine()->getManager();
$isxhr = $request->get('isxhr', false);
$user = $userRepository->findUserById($this->getUser()->getId());
$univers = $user->getUnivers() ?? $user->getPreferedUnivers();
$hierarchy = [];
/** @param Profil $profil */
$profil = $session->get('profil', $this->getUser()->getProfil());
// if (!Access::isAllowedNiveau($niveau, $profil)) {
// if (!$isxhr) {
// $this->addFlash('danger', 'flash.permission_denied');
// return $this->redirectToRoute('home');
// } else {
// return new Response('');
// }
// }
$userLog = new UserLog($user, ['niveau' => $niveau]);
$em->persist($userLog);
$em->flush();
if (!$isxhr) {
if ($niveau && $niveau->getChildren()->count() > 0 && $niveau->getLvl() != 1) {
$sublvl = null;
foreach ($niveau->getChildren() as $lvl) {
if (!$sublvl) {
foreach ($lvl->getUnivers() as $p) {
if ($univers->getId() == $p->getId()) {
$sublvl = $lvl;
}
}
}
}
if ($sublvl) {
return $this->redirectToRoute('niveau', ['slug' => $sublvl->getSlug()]);
}
}
if ($niveau->getType() == Niveau::NIVEAU_PRODUIT) {
$produits = $entityManager->getRepository(Produit::class)->getByUnivers($user, $niveau->getId());
if (count($produits) > 0) {
return $this->redirectToRoute('contenu_show', ['slug' => $produits[0]->getSlug()]);
}
}
if ($niveau->getType() == Niveau::NIVEAU_FORMATION) {
$formations = $entityManager->getRepository(Formation::class)->getByProfilNiveau($profil, $niveau->getId());
if (count($formations) > 0) {
return $this->redirectToRoute('contenu_show', ['slug' => $formations[0]->getSlug()]);
}
}
}
$hasMore = false;
if ($niveau->getType() == Niveau::NIVEAU_MENU) {
$hierarchy = $em->getRepository(Niveau::class)->findAllByParentProfil($profil, $niveau->getRoot());
} else {
if ($niveau->getType() == Niveau::NIVEAU_ARTICLE) {
$hierarchy = $em->getRepository(Contenu::class)->getByProfilNiveau(
$user,
$niveau->getId(),
false,
null,
false
);
//dd($user, $niveau, $hierarchy);
} else {
$hierarchy = $em->getRepository(Contenu::class)->getByProfilNiveau($user, $niveau->getId(), false, null, true);
}
if ($niveau->getType() == Niveau::NIVEAU_VIDEO) {
//$liens = $em->getRepository(Lien::class)->findBy(['lea' => '1']);
$qty = $request->query->getInt('qty', 600);
$hierarchy = $paginator->paginate($hierarchy, $request->query->getInt('page', 1), $qty);
$hierarchy->setCustomParameters(['align' => 'center']);
$nextContenus = $em->getRepository(Contenu::class)->getByProfilNiveau($user, $niveau->getId(), 20, 20);
$hasMore = count($nextContenus) > 0;
}
if ($niveau->getType() == Niveau::NIVEAU_ARTICLE) {
$qty = $request->query->getInt('qty', 24);
$hierarchy = $paginator->paginate($hierarchy, $request->query->getInt('page', 1), $qty);
$hierarchy->setCustomParameters(['align' => 'center']);
$nextContenus = $em->getRepository(Contenu::class)->getByProfilNiveau($user, $niveau->getId(), 20, 20, $isxhr);
$hasMore = count($nextContenus) > 0;
}
}
return $this->render('niveau/show.html.twig', [
'liens' => null,
'niveau' => $niveau,
'isxhr' => $isxhr,
'current' => $request->get('current', null),
'hierarchy' => $hierarchy,
'has_more' => $hasMore,
]);
}
/**
* @param SessionInterface $session
* @param Niveau $niveau
* @param NiveauService $niveauService
* @param string $pathinfo
* @return Response
*/
public function subcats(SessionInterface $session, Niveau $niveau, NiveauService $niveauService, string $pathinfo)
{
$em = $this->getDoctrine()->getManager();
/** @param Profil $profil */
$profil = $session->get('profil', $this->getUser()->getProfil());
$niveaux = $em->getRepository(Niveau::class)->createQueryBuilder('n')
->select('n')
->leftJoin('n.univers', 'u')
->andWhere('u.id = :uid')
->setParameter('uid', $this->getUser()->getUnivers())
->addOrderBy('n.root, n.lft', 'ASC')
->andWhere('n.root = 1')
->andWhere('n.parent IS NOT NULL')
->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getResult('tree');
$hierarchy = $em->getRepository(Niveau::class)->findAllByParentProfil($profil, $niveau->getSubRoot());
return $this->render('niveau/subcats.html.twig', [
'niveau' => $niveau,
'pathInfo' => $pathinfo,
'hierarchy' => $hierarchy,
'empty' => $niveauService->getNiveaux($this->getUser(), $niveaux)
]);
}
}