<?php
// src/Controller/LuckyController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\KernelInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use FOS\RestBundle\Request\ParamFetcherInterface;
use FOS\RestBundle\Controller\Annotations\QueryParam;
use Symfony\Component\String\Slugger\SluggerInterface;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Article;
use App\Form\ArticleType;
class ArticleController extends AbstractController
{
protected $em;
public function __construct(EntityManagerInterface $em){
$this->em = $em;
}
/**
* @Route({
* "en": "/press",
* "es": "/prensa",
* "de": "/presse",
* "fr": "/presse_fr",
* "it": "/stampa",
* "pt": "/imprensa",
* "cn": "/press_cn",
* "cn2": "/press_cn2",
* }, name="articles_list")
* @QueryParam(name="page", requirements="\d+", default=1, description="Page number.")
* @QueryParam(name="sort", requirements="e.iccid|u.amountGb|u.priceValue|u.reference|u.createdAt|u.transactedAt|us.lastName|u.customerSubscription|rp.amountGb|rp.priceValue", description="Sort.")
* @QueryParam(name="dir", requirements="asc|desc", default="asc", description="Sort direction.")
* @QueryParam(name="q", requirements=".*", default="", nullable=true, description="Q.")
* @QueryParam(name="country", requirements="\d+", default=null, nullable=true, strict=true, description="Country.")
*/
public function index(Request $request, ParamFetcherInterface $paramFetcher)
{
// parameters
$page = $paramFetcher->get('page');
$sort = $paramFetcher->get('sort');
$dir = $paramFetcher->get('dir');
$q = $paramFetcher->get('q');
$country = $paramFetcher->get('country');
$download = $request->query->get('download');
// query
$results_per_page = $this->getParameter('app.results_per_page');
// filters
$currentFilters = [];
if($sort){
$currentFilters['sort'] = $sort;
$currentFilters['dir'] = $dir;
}
$currentFilters['q'] = $q;
$repo = $this->em->getRepository(Article::class);
$articles = $repo->getList($q, $sort, $dir, $page, $results_per_page, $request->getLocale(), $country);
$response = $this->render('jelly/articles/index.html.twig', [
'articles' => $articles,
'currentFilters' => $currentFilters,
]);
return $response;
}
/**
* @Route({
* "en": "/press/{slug}",
* "es": "/prensa/{slug}",
* "de": "/presse/{slug}",
* "fr": "/presse_fr/{slug}",
* "it": "/stampa/{slug}",
* "pt": "/imprensa/{slug}",
* "cn": "/press_cn/{slug}",
* "cn2": "/press_cn2/{slug}",
* }, name="article_detail")
*/
public function detail(Request $request, ParamFetcherInterface $paramFetcher, string $slug)
{
$repo = $this->em->getRepository(Article::class);
// query
$results_per_page = $this->getParameter('app.results_per_page');
$article = $repo->findOneBy(['slug' => $slug]);
$articles = $repo->getList(null, null, null, 1, $results_per_page, $request->getLocale(), $article->getCountry());
if(!$article)
throw $this->createNotFoundException('Article not found');
$article->setTranslatableLocale($request->getLocale());
$this->em->refresh($article);
$response = $this->render('jelly/articles/detail.html.twig', [
'articles' => $articles,
'article' => $article,
]);
return $response;
}
/**
* @Route("/admin/content/articles", name="admin_articles_list")
* @IsGranted("ROLE_ADMIN")
*/
public function indexAdmin(Request $request, ParamFetcherInterface $paramFetcher)
{
$repo = $this->getDoctrine()->getRepository(Article::class);
$articles = $repo->getList();
return $this->render('angle/articles/index.html.twig', [
'articles' => $articles,
]);
}
/**
* @Route("/admin/article/{articleId}", name="admin_article_detail", methods={"GET","HEAD", "POST"})
* @Route("/admin/article/", name="admin_article_new", methods={"GET","HEAD","POST"})
* @IsGranted("ROLE_ADMIN")
*/
public function detailAdmin(ParamFetcherInterface $paramFetcher, Request $request, KernelInterface $appKernel, SluggerInterface $slugger, ?string $articleId = null ): Response
{
$em = $this->getDoctrine()->getManager();
$repo = $this->getDoctrine()->getManager()->getRepository(Article::class);
$article = null;
if($articleId){
$article = $repo->find($articleId);
$article->setTranslatableLocale($request->getSession()->get('locale'));
$em->refresh($article);
if(!$article)
throw $this->createNotFoundException("Article not found");
}
$form = $this->createForm(ArticleType::class, $article);
$form->handleRequest($request);
if ($form->isSubmitted() ) {
$article = $form->getData();
if ($form->isValid()){
if(!$articleId){
$article->setImage('');
$slugIndex = 0;
do {
$slug = strtolower($slugger->slug($article->getTitle())) . ($slugIndex > 0 ? "-{$slugIndex}" : "");
$existingArticle = $repo->findOneBy(['slug' => $slug]);
$slugIndex++;
} while ($existingArticle != null);
$article->setSlug($slug);
}
$imageList = $form->get('imageList')->getData();
if ($imageList) {
$imagePath = $appKernel->getProjectDir() . "/public/imgs/articles/{$article->getSlug()}.jpg";
\imagejpeg(\imagecreatefromstring(\file_get_contents($imageList->getRealPath())), $imagePath );
}
$image = $form->get('image')->getData();
if ($image) {
$imagePath = $appKernel->getProjectDir() . "/public/imgs/articles/{$article->getSlug()}_full.jpg";
\imagejpeg(\imagecreatefromstring(\file_get_contents($image->getRealPath())), $imagePath );
}
$article->setImage($article->getSlug());
if(!$article->getPublishedAt()){
$article->setPublishedAt(new \DateTime());
}
$em->persist($article);
$em->flush();
return $this->redirectToRoute('admin_articles_list');
}
}
return $this->render('angle/articles/detail.html.twig', [
'form' => $form->createView(),
'article' => $article,
]);
}
/**
* @IsGranted("ROLE_ADMIN")
* @Route(
* "/services/article.{_format}",
* name="article_delete",
* requirements={
* "_format": "json"
* },
* methods={"DELETE"}
* )
*/
public function delete(Request $request)
{
$repository = $this->getDoctrine()->getRepository(Article::class);
$id = $request->query->get('id');
if($id){
$entity = $repository->findOneById($id);
$em = $this->getDoctrine()->getManager();
$em->remove($entity);
$em->flush();
}
return ['ok' => true];
}
}