<?php
namespace App\Controller;
use App\Entity\Label;
use App\Entity\Style;
use App\Entity\Vinyl;
use App\Entity\Artist;
use DateTimeImmutable;
use App\Form\SearchType;
use App\Services\Search;
use App\Repository\LabelRepository;
use App\Repository\StyleRepository;
use App\Repository\VinylRepository;
use App\Repository\ArtistRepository;
use App\Repository\ParamsRepository;
use App\Repository\PromoteRepository;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class VinylController extends AbstractController
{
private $repository;
private $styleRepository;
private $cart;
private $paramsRepository;
public function __construct(VinylRepository $vinylRepository, StyleRepository $styleRepository, RequestStack $requestStack, ParamsRepository $paramsRepository)
{
$this->repository = $vinylRepository;
$this->styleRepository = $styleRepository;
$this->paramsRepository = $paramsRepository;
$session = $requestStack->getSession();
$this->cart = $session->get('cart', [
'items' => [],
'qty' => 0,
'total' => 0
]);
}
/**
* @Route("/vinyles/{stylename?}", name="vinyls_index")
*/
public function index(?string $stylename, VinylRepository $vinylRepository, LabelRepository $labelRepository, ArtistRepository $artistRepository, Request $request, PaginatorInterface $paginator): Response
{
$style = null;
$current = 'vinyls';
if ($stylename == "neufs" || $stylename == "occasions" || $stylename == "restock") {
$current .= '-' . $stylename;
if ($stylename === "restock") {
$query = $vinylRepository->getRestock(['updatedAt' => 'DESC']);
} else {
$style = $stylename;
$query = $vinylRepository->findBy(['state' => substr($stylename,0, -1)], ['createdAt' => 'DESC']);
}
}
else {
if (empty($stylename)) {
$query = $vinylRepository->getAll();
}
else {
$style = $this->styleRepository->findOneBy(['slug' => $stylename]);
if ($style) {
//$vinyls = $style->getVinyls();
$query = $vinylRepository->getByStyle($style);
}
else {
$query = $vinylRepository->findAll();
$this->addFlash('danger', "Style inconnu.");
}
}
}
$vinyls = $paginator->paginate($query, $request->query->getInt('page', 1),40);
/** Tri */
$sortType = $request->query->get('sort', 'created_at');
$direction = $request->query->get('direction', 'desc');
$sort = $sortType . '-' . $direction;
// Recherche
$search = new Search();
$form = $this->createForm(SearchType::class, $search)->handleRequest($request);
return $this->render('vinyl/index.html.twig', [
'current' => $current,
'params' => $this->paramsRepository->findAll(),
'styles' => $this->styleRepository->findBy([], ['name' => 'ASC']),
'search' => (null != $style && ($style != 'neufs' && $style != 'occasions' && $style != 'restock')) ? $style->getName() : $style,
'vinyls' => $vinyls,
'search_form' => $form->createView(),
'page' => $request->query->getInt('page', 1),
'sort' => $sort,
]);
}
/**
* @Route("/vinyle/{slug}", priority=1, name="vinyls_show")
*/
public function show(Vinyl $vinyl, LabelRepository $labelRepository, ArtistRepository $artistRepository, PromoteRepository $promoteRepository, Request $request): Response
{
$artists = [];
foreach ($vinyl->getTracks() as $track) {
foreach ($track->getArtists() as $artist) {
if(!in_array($artist, $artists)){
$artists[] = $artist;
}
}
}
// Recherche
$search = new Search();
$form = $this->createForm(SearchType::class, $search)->handleRequest($request);
$new = $promoteRepository->find(1)->getProducts();
$neufs = [];
$occasions = [];
foreach ($new as $v) {
if ($v->getState() == "neuf") {
$neufs[] = $v;
}
else {
$occasions[] = $v;
}
}
$news = [
'neufs' => $neufs,
'occasions' => $occasions
];
$bestSeller = $promoteRepository->find(2)->getProducts();
$repress = $promoteRepository->find(3)->getProducts();
$restock = $promoteRepository->find(4)->getProducts();
$promo = $this->repository->getPromo();
$homeProd = $promoteRepository->find(6)->getProducts();
$extras = [
'last' => $this->repository->getLast(),
'news' => $news,
'best' => $bestSeller,
'restock' => $restock,
'repress' => $repress,
'promo' => $promo,
'homeprod' => $homeProd,
];
return $this->render('vinyl/show.html.twig', [
'current' => 'vinyls',
'params' => $this->paramsRepository->findAll(),
'styles' => $this->styleRepository->findBy([], ['name' => 'ASC']),
'vinyl' => $vinyl,
'artists' => $artists,
'extras' => $extras,
'search_form' => $form->createView(),
]);
}
/**
* @Route("/vinyles/search", priority=1, name="vinyls_search")
*/
public function search(Request $request, PaginatorInterface $paginator, PromoteRepository $promoteRepository): Response
{
$search = new Search();
$form = $this->createForm(SearchType::class, $search)->handleRequest($request);
$order = 'createdAt';
if ($form->isSubmitted()) {
if(
$search->getPromo() &&
!$search->getRepress() &&
!$search->getHomeprod() &&
empty($search->getStyles()) &&
$search->getLabel() == null &&
$search->getArtist() == null &&
$search->getYear() == null &&
!$search->getInstock() &&
$search->getQ() == null
){
$s = 'promotions';
$order = 'updatedAt';
}
elseif(
$search->getRepress() &&
!$search->getPromo() &&
!$search->getHomeprod() &&
empty($search->getStyles()) &&
$search->getLabel() == null &&
$search->getArtist() == null &&
$search->getYear() == null &&
!$search->getInstock() &&
$search->getQ() == null
){
$s = 'represses';
}
elseif(
!$search->getRepress() &&
!$search->getPromo() &&
$search->getHomeprod() &&
empty($search->getStyles()) &&
$search->getLabel() == null &&
$search->getArtist() == null &&
$search->getYear() == null &&
!$search->getInstock() &&
$search->getQ() == null
){
$s = 'home-prod';
}
else {
$s = 'recherche';
}
}
else {
$s = $search->getRepress() ? 'represses' : '';
}
$promote = null;
if ($search->getRepress()) {
$promote = $promoteRepository->find(3);
}
if ($request->query->get('homeprod')) {
$promote = $promoteRepository->find(6);
$search->setHomeprod(true);
}
$query = $s == 'represses' ? $promote->getProducts() : $this->repository->search($search, $promote, $order);
$vinyls = $paginator->paginate($query, $request->query->getInt('page', 1),40);
/** Tri */
$sortType = $request->query->get('sort', 'updated_at');
$direction = $request->query->get('direction', 'desc');
$sort = $sortType . '-' . $direction;
return $this->render('vinyl/index.html.twig', [
'current' => 'vinyls',
'params' => $this->paramsRepository->findAll(),
'styles' => $this->styleRepository->findBy([], ['name' => 'ASC']),
'vinyls' => $vinyls,
'search_form' => $form->createView(),
'search' => $s,
'search_data' => $search,
'page' => $request->query->getInt('page', 1),
'sort' => $sort,
]);
}
/**
* @Route("/label/{slug}", priority=1, name="vinyls_label")
*/
public function label(Label $label, LabelRepository $labelRepository, ArtistRepository $artistRepository, Request $request, PaginatorInterface $paginator): Response
{
$query = $this->repository->findBy(['label' => $label], ['designation' => 'ASC']);
$vinyls = $paginator->paginate($query, $request->query->getInt('page', 1),40);
// Recherche
$searchData = [
'labels' => $labelRepository->findBy([], ['name' => 'ASC']),
'artists' => $artistRepository->findBy([], ['name' => 'ASC']),
];
$search = new Search();
$form = $this->createForm(SearchType::class, $search)->handleRequest($request);
/** Tri */
$sortType = $request->query->get('sort', 'created_at');
$direction = $request->query->get('direction', 'desc');
$sort = $sortType . '-' . $direction;
return $this->render('vinyl/index.html.twig', [
'current' => 'vinyls',
'params' => $this->paramsRepository->findAll(),
'styles' => $this->styleRepository->findBy([], ['name' => 'ASC']),
'vinyls' => $vinyls,
'search' => $label->getName(),
'search_form' => $form->createView(),
'search_data' => $searchData,
'page' => $request->query->getInt('page', 1),
'sort' => $sort,
]);
}
/**
* @Route("/artiste/{artist}", priority=1, name="vinyls_artist")
*/
public function artist(Artist $artist, LabelRepository $labelRepository, ArtistRepository $artistRepository, Request $request, PaginatorInterface $paginator): Response
{
$tracks = $artist->getTracks();
$query = [];
foreach ($tracks as $track) {
if (!in_array($track->getVinyl(), $query)) {
$query[] = $track->getVinyl();
}
}
$vinyls = $paginator->paginate($query, $request->query->getInt('page', 1),40);
// Recherche
$searchData = [
'labels' => $labelRepository->findBy([], ['name' => 'ASC']),
'artists' => $artistRepository->findBy([], ['name' => 'ASC']),
];
$search = new Search();
$form = $this->createForm(SearchType::class, $search)->handleRequest($request);
/** Tri */
$sortType = $request->query->get('sort', 'created_at');
$direction = $request->query->get('direction', 'desc');
$sort = $sortType . '-' . $direction;
return $this->render('vinyl/index.html.twig', [
'current' => 'vinyls',
'params' => $this->paramsRepository->findAll(),
'styles' => $this->styleRepository->findBy([], ['name' => 'ASC']),
'vinyls' => $vinyls,
'search' => $artist->getName(),
'search_form' => $form->createView(),
'search_data' => $searchData,
'page' => $request->query->getInt('page', 1),
'sort' => $sort,
]);
}
}