<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Routing\RouterInterface;
use App\Entity\Articles;
use App\Entity\ArticleCategories;
use App\Entity\ArticleReviews;
use App\Entity\Newsfeed;
use App\Entity\SearchItems;
use App\Repository\ArticlesRepository;
use App\Form\ArticlesFormType;
use App\Form\ArticleReviewFormType;
use App\Form\ArticlesUserFormType;
class ArticlesController extends AbstractController
{
private $em;
private $translator;
private $router;
public function __construct(EntityManagerInterface $em, TranslatorInterface $translator, RouterInterface $router)
{
$this->em = $em;
$this->translator = $translator;
$this->router = $router;
}
/**
* @Route("/articles", name="article_index")
*/
public function index_articles( TranslatorInterface $translator)
{
$repository = $this->getDoctrine()->getRepository(ArticleCategories::class);
$categories = $repository->findAll();
return $this->render('article_index.html.twig', [
'index' => true,
'items' => $categories,
'type' => 'article'
]);
}
/**
* @Route("/articles/{catid}", name="article_category")
*/
public function catagory_article(ArticleCategories $catid, TranslatorInterface $translator)
{
#ToDo-Ante: order op article naam, alfabetisch
$repository = $this->getDoctrine()->getRepository(ArticleCategories::class);
$category = $repository->findOneBy(array('id' => $catid));
return $this->render('article_index.html.twig', [
'index' => false,
'items' => $category,
'type' => 'article'
]);
}
/**
* @Route("/article/{title}", name="article_by_title")
*/
public function article_by_title(string $title, TranslatorInterface $translator)
{
$repository = $this->getDoctrine()->getRepository(Articles::class);
if(is_numeric($title)) {
$article = $repository->findOneBy(array('id' => $title, 'approved' => 1));
} else {
if($translator->getLocale() == 'nl') {
$article = $repository->findOneBy(array('title_nl' => $title, 'approved' => 1));
} else {
$article = $repository->findOneBy(array('title_en' => $title, 'approved' => 1));
}
}
return $this->redirectToRoute('article',array('id' => $article->getId(), 'url' => $article->getUrl() ));
}
/**
* @Route("/addarticle", name="article_add_user")
*/
public function add_user( EntityManagerInterface $em, Request $request, TranslatorInterface $translator)
{
$this->denyAccessUnlessGranted('ROLE_USER');
if($_ENV['DISABLE_FORMS'] == "true") { return $this->render('maintenance_form_disabled.html.twig'); }
$form = $this->createForm(ArticlesUserFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$article = $form->getData();
$article->setImage('');
$article->setUserId($this->getUser()->getId());
$article->setUsername($this->getUser()->getUsername());
$article->setAdded(new \DateTime());
$article->setApproved('0');
$article->setNumReviews('0');
$em->persist($article);
$em->flush();
$this->addFlash('success', $translator->trans("Artikel toegevoegd en wacht op goedkeuring."));
return $this->redirectToRoute('article_index');
}
return $this->render('article_edit.html.twig', [
'moderator_form' => false,
'title' => $translator->trans("Artikel toevoegen"),
'form' => $form->createView()
]);
}
/**
* @Route("/article/{id}/{url}", name="article")
*/
public function article(Articles $id, string $url, TranslatorInterface $translator)
{
#$article = $this->get_article_by_title($title, 'article', $translator);
$repository = $this->getDoctrine()->getRepository(Articles::class);
$article = $repository->findOneBy(array('id' => $id, 'approved' => 1));
if($article->getNumReviews() > '0') {
$this->addFlash('warning', $translator->trans("Dit artikel moet gereviewd worden. Het kan daarom zijn dat de inhoud en/of de opmaak niet juist zijn."));
}
return $this->render('article.html.twig', [
'article' => $article,
]);
}
/**
* @Route("/moderate/articles", name="articles_moderate")
*/
public function moderate_article(Request $request, TranslatorInterface $translator)
{
$this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
$repository = $this->getDoctrine()->getRepository(Articles::class);
if($translator->getLocale() == 'nl') {
$oder_field = 'title_nl';
} else {
$oder_field = 'title_en';
}
$articles = $repository->findBy(array(),array('num_reviews'=>'DESC' ,'approved'=>'ASC', $oder_field => 'ASC'));
return $this->render('articles_moderate.html.twig', [
'items' => $articles,
]);
}
/**
* @Route("/moderate/article/add", name="article_moderate_add")
*/
public function add(EntityManagerInterface $em, Request $request, TranslatorInterface $translator)
{
$this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
$form = $this->createForm(ArticlesFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$article = $form->getData();
$article->setUserId($this->getUser()->getId());
$article->setUsername($this->getUser()->getUsername());
$article->setAdded(new \DateTime());
$article->setNumReviews('0');
$em->persist($article);
$em->flush();
$newsfeed = new Newsfeed();
$newsfeed->setTitleNl($article->getTitleNl());
$newsfeed->setTitleEn($article->getTitleEn());
$newsfeed->setRemoteId($article->getId());
$newsfeed->setType('article');
$newsfeed->setIsUpdate(0);
$newsfeed->setTime(new \DateTime());
$em = $this->getDoctrine()->getManager();
$em->persist($newsfeed);
$em->flush();
if ($article->getApproved() == 1){
$searchitem = new SearchItems();
$searchitem->setType('article');
$searchitem->setPath($this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]));
$searchitem->setNameNl($article->getTitleNl());
$searchitem->setNameEn($article->getTitleEn());
$searchitem->setKeywordsNl($article->getTitleNl().','.$article->getKeywordsNl());
$searchitem->setKeywordsEn($article->getTitleEn().','.$article->getKeywordsEn());
if(empty($article->getEdited())) {
$searchitem->setLastUpdateTime($article->getAdded());
} else {
$searchitem->setLastUpdateTime($article->getEdited());
}
$em->persist($searchitem);
$em->flush();
}
$this->addFlash('success', $translator->trans("Artikel toegevoegd"));
return $this->redirectToRoute('articles_moderate');
}
return $this->render('article_edit.html.twig', [
'moderator_form' => true,
'title' => $translator->trans("Artikel toevoegen"),
'form' => $form->createView()
]);
}
/**
* @Route("/moderate/article/{id}/edit", name="articles_moderate_edit")
*/
public function edit(Articles $id, EntityManagerInterface $em, Request $request, TranslatorInterface $translator)
{
$this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
$article = $id;
$form = $this->createForm(ArticlesFormType::class, $article);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$article = $form->getData();
$article->setApprovedUserId($this->getUser()->getId());
$article->setApprovedUsername($this->getUser()->getUsername());
$article->setEdited(new \DateTime());
$article->setEditedUserId($this->getUser()->getId());
$article->setEditedUsername($this->getUser()->getUsername());
$em->persist($article);
$em->flush();
$repository = $em->getRepository(SearchItems::class);
$searchitem = $repository->findOneBy(array('path' => $this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]) ));
if ($article->getApproved() == 1){
$newsfeed = new Newsfeed();
$newsfeed->setTitleNl($article->getTitleNl());
$newsfeed->setTitleEn($article->getTitleEn());
$newsfeed->setRemoteId($article->getId());
$newsfeed->setType('article');
$newsfeed->setIsUpdate(1);
$newsfeed->setTime(new \DateTime());
$em = $this->getDoctrine()->getManager();
$em->persist($newsfeed);
$em->flush();
if(!$searchitem) {
$searchitem = new SearchItems();
}
$searchitem->setType('article');
$searchitem->setPath($this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]));
$searchitem->setNameNl($article->getTitleNl());
$searchitem->setNameEn($article->getTitleEn());
$searchitem->setKeywordsNl($article->getTitleNl().','.$article->getKeywordsNl());
$searchitem->setKeywordsEn($article->getTitleEn().','.$article->getKeywordsEn());
if(empty($article->getEdited())) {
$searchitem->setLastUpdateTime($article->getAdded());
} else {
$searchitem->setLastUpdateTime($article->getEdited());
}
$em->persist($searchitem);
$em->flush();
} else {
if($searchitem) {
$em->remove($searchitem);
$em->flush();
}
}
$this->addFlash('success', $translator->trans("Artikel bijgewerkt"));
return $this->redirectToRoute('articles_moderate');
}
return $this->render('article_edit.html.twig', [
'moderator_form' => true,
'title' => $translator->trans("Artikel bewerken"),
'form' => $form->createView()
]);
}
/**
* @Route("/moderate/article/{id}/revoke", name="articles_moderate_revoke")
*/
public function moderate_revoke(int $id, Articles $article, EntityManagerInterface $em, TranslatorInterface $translator)
{
$this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
$article->setApprovedUserId($this->getUser()->getId());
$article->setApprovedUsername($this->getUser()->getUsername());
$article->setApproved('0');
$em->persist($article);
$repository = $em->getRepository(SearchItems::class);
$searchitem = $repository->findOneBy(array('path' => $this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]) ));
if($searchitem){
$em->remove($searchitem);
}
$em->flush();
$this->addFlash('success', $translator->trans("Artikel ingetrokken"));
return $this->redirectToRoute('articles_moderate');
}
/**
* @Route("/moderate/article/{id}/approve", name="articles_moderate_approve")
*/
public function moderate_approve(int $id, Articles $article, EntityManagerInterface $em, TranslatorInterface $translator)
{
$this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
$article->setApprovedUserId($this->getUser()->getId());
$article->setApprovedUsername($this->getUser()->getUsername());
$article->setApproved('1');
$em->persist($article);
$newsfeed = new Newsfeed();
$newsfeed->setTitleNl($article->getTitleNl());
$newsfeed->setTitleEn($article->getTitleEn());
$newsfeed->setRemoteId($article->getId());
$newsfeed->setType('article');
$newsfeed->setIsUpdate(0);
$newsfeed->setTime(new \DateTime());
$em = $this->getDoctrine()->getManager();
$em->persist($newsfeed);
$repository = $em->getRepository(SearchItems::class);
$searchitem = $repository->findOneBy(array('path' => $this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]) ));
if(!$searchitem) {
$searchitem = new SearchItems();
}
$searchitem->setType('article');
$searchitem->setPath($this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]));
$searchitem->setNameNl($article->getTitleNl());
$searchitem->setNameEn($article->getTitleEn());
$searchitem->setKeywordsNl($article->getTitleNl().','.$article->getKeywordsNl());
$searchitem->setKeywordsEn($article->getTitleEn().','.$article->getKeywordsEn());
if(empty($article->getEdited())) {
$searchitem->setLastUpdateTime($article->getAdded());
} else {
$searchitem->setLastUpdateTime($article->getEdited());
}
$em->persist($searchitem);
$em->flush();
$this->addFlash('success', $translator->trans("Artikel goedgekeurd"));
return $this->redirectToRoute('articles_moderate');
}
/**
* @Route("/moderate/article/{id}/delete", name="articles_moderate_delete")
*/
public function moderate_delete(Articles $id, EntityManagerInterface $em, TranslatorInterface $translator)
{
$this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
$article = $id;
$repository = $em->getRepository(SearchItems::class);
$searchitem = $repository->findOneBy(array('path' => $this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]) ));
if($searchitem){
$em->remove($searchitem);
}
$em->remove($article);
$em->flush();
$this->addFlash('success', $translator->trans("Artikel verwijderd"));
return $this->redirectToRoute('articles_moderate');
}
/**
* @Route("/moderate/article/{id}/reviews", name="articles_moderate_reviews")
*/
public function moderate_review(Articles $id, EntityManagerInterface $em, TranslatorInterface $translator)
{
$this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
return $this->render('articlereviews_moderate.html.twig', [
'article' => $id,
]);
}
/**
* @Route("/article/{catid}/{id}/review", name="article_review_add")
*/
public function article_review_add(int $catid, Articles $id, Request $request, EntityManagerInterface $em, TranslatorInterface $translator)
{
$this->denyAccessUnlessGranted('ROLE_USER');
if($_ENV['DISABLE_FORMS'] == "true") { return $this->render('maintenance_form_disabled.html.twig'); }
$form = $this->createForm(ArticleReviewFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$article = $id;
$review = $form->getData();
$review->setUserId($this->getUser()->getId());
$review->setUsername($this->getUser()->getUsername());
$review->setArticle($article);
$em->persist($review);
$em->flush();
$num_reviews = $article->getNumReviews();
$article->setNumReviews($num_reviews+1);
$em->persist($article);
$em->flush();
if($translator->getLocale() == 'nl') {
$article_title = $article->getTitleNl();
} else {
$article_title = $article->getTitleEn();
}
$this->addFlash('success', $translator->trans("Feedback doorgegeven"));
return $this->redirectToRoute('article',array('id' => $article->getId(), 'catid' => $article->getCategory()->getId(), 'title' => $article_title ));
}
return $this->render('form_edit.html.twig', [
'title' => $translator->trans("Feedback doorgeven"),
'button_text' => $translator->trans("Insturen"),
'form' => $form->createView()
]);
}
/**
* @Route("/moderate/article/review/{id}/read", name="articlereviews_moderate_read")
*/
public function review_read(ArticleReviews $id, EntityManagerInterface $em, TranslatorInterface $translator)
{
$this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
$articlereview = $id;
$repository = $this->getDoctrine()->getRepository(ArticleReviews::class);
$articlereview = $repository->findOneBy(array('id'=>$id));
return $this->render('articlereview.html.twig', [
'review' => $articlereview,
]);
}
/**
* @Route("/moderate/article/review/{id}/delete", name="articlereviews_moderate_delete")
*/
public function review_delete(int $id, ArticleReviews $articlereview, EntityManagerInterface $em, TranslatorInterface $translator)
{
$this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
$article = $articlereview->getArticle();
$article->setNumReviews($article->getNumReviews()-1);
$em->persist($article);
$em->flush();
$em->remove($articlereview);
$em->flush();
$this->addFlash('success', $translator->trans("Artikel review verwijderd"));
return $this->redirectToRoute('articles_moderate_reviews', array('id' => $article->getId() ));
}
/**
* @Route("/api/v1/articles", methods="GET", name="api_articles")
*/
public function api_articles(ArticlesRepository $ArticlesRepository, Request $request, TranslatorInterface $translator)
{
$articles = $ArticlesRepository->findAllMatching($request->query->get('query'));
$return = array();
foreach($articles as $item) {
if($translator->getLocale() == 'nl') {
$name = $item->getTitleNl();
} else {
$name = $item->getTitleEn();
}
$return[] = array(
'id' => $item->getId(),
'value' => $name,
);
}
return $this->json($return, 200, [], ['groups' => ['main']]);
}
}