src/Controller/ArticlesController.php line 401

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Component\HttpFoundation\Response;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Contracts\Translation\TranslatorInterface;
  9. use Symfony\Component\Routing\RouterInterface;
  10. use App\Entity\Articles;
  11. use App\Entity\ArticleCategories;
  12. use App\Entity\ArticleReviews;
  13. use App\Entity\Newsfeed;
  14. use App\Entity\SearchItems;
  15. use App\Repository\ArticlesRepository;
  16. use App\Form\ArticlesFormType;
  17. use App\Form\ArticleReviewFormType;
  18. use App\Form\ArticlesUserFormType;
  19. class ArticlesController extends AbstractController
  20. {
  21.     private $em;
  22.     private $translator;
  23.     private $router;
  24.     public function __construct(EntityManagerInterface $emTranslatorInterface $translatorRouterInterface $router)
  25.     {
  26.         $this->em $em;
  27.         $this->translator $translator;
  28.         $this->router $router;
  29.     }
  30.     /**
  31.      * @Route("/articles", name="article_index")
  32.      */
  33.     public function index_articlesTranslatorInterface $translator)
  34.     {
  35.         $repository $this->getDoctrine()->getRepository(ArticleCategories::class);
  36.         $categories $repository->findAll();
  37.         return $this->render('article_index.html.twig', [
  38.             'index' => true,
  39.             'items' => $categories,
  40.             'type' => 'article'
  41.         ]);
  42.     }
  43.     /**
  44.      * @Route("/articles/{catid}", name="article_category")
  45.      */
  46.     public function catagory_article(ArticleCategories $catidTranslatorInterface $translator)
  47.     {
  48.         #ToDo-Ante: order op article naam, alfabetisch
  49.         $repository $this->getDoctrine()->getRepository(ArticleCategories::class);
  50.         $category $repository->findOneBy(array('id' => $catid));
  51.         return $this->render('article_index.html.twig', [
  52.             'index' => false,
  53.             'items' => $category,
  54.             'type' => 'article'
  55.         ]);
  56.     }
  57.     /**
  58.      * @Route("/article/{title}", name="article_by_title")
  59.      */
  60.     public function article_by_title(string $titleTranslatorInterface $translator)
  61.     {
  62.         $repository $this->getDoctrine()->getRepository(Articles::class);
  63.         if(is_numeric($title)) {
  64.             $article $repository->findOneBy(array('id' => $title'approved' => 1));
  65.         } else {
  66.             if($translator->getLocale() == 'nl') {
  67.                 $article $repository->findOneBy(array('title_nl' => $title'approved' => 1));
  68.             } else {
  69.                 $article $repository->findOneBy(array('title_en' => $title'approved' => 1));
  70.             }
  71.         }
  72.         return $this->redirectToRoute('article',array('id' => $article->getId(), 'url' => $article->getUrl() ));
  73.     }
  74.     /**
  75.      * @Route("/addarticle", name="article_add_user")
  76.      */
  77.     public function add_userEntityManagerInterface $emRequest $requestTranslatorInterface $translator)
  78.     {
  79.         $this->denyAccessUnlessGranted('ROLE_USER');
  80.         if($_ENV['DISABLE_FORMS'] == "true") { return $this->render('maintenance_form_disabled.html.twig'); }
  81.         $form $this->createForm(ArticlesUserFormType::class);
  82.         $form->handleRequest($request);
  83.         if ($form->isSubmitted() && $form->isValid()){
  84.             $article $form->getData();
  85.             $article->setImage('');
  86.             $article->setUserId($this->getUser()->getId());
  87.             $article->setUsername($this->getUser()->getUsername());
  88.             $article->setAdded(new \DateTime());
  89.             $article->setApproved('0');
  90.             $article->setNumReviews('0');
  91.             $em->persist($article);
  92.             $em->flush();
  93.             $this->addFlash('success'$translator->trans("Artikel toegevoegd en wacht op goedkeuring."));
  94.             return $this->redirectToRoute('article_index');
  95.         }
  96.         return $this->render('article_edit.html.twig', [
  97.             'moderator_form' => false,
  98.             'title' => $translator->trans("Artikel toevoegen"),
  99.             'form' => $form->createView()
  100.         ]);
  101.     }
  102.     /**
  103.      * @Route("/article/{id}/{url}", name="article")
  104.      */
  105.     public function article(Articles $idstring $urlTranslatorInterface $translator)
  106.     {
  107.         #$article = $this->get_article_by_title($title, 'article', $translator);
  108.         $repository $this->getDoctrine()->getRepository(Articles::class);
  109.         $article $repository->findOneBy(array('id' => $id'approved' => 1));
  110.         
  111.         if($article->getNumReviews() > '0') {
  112.             $this->addFlash('warning'$translator->trans("Dit artikel moet gereviewd worden. Het kan daarom zijn dat de inhoud en/of de opmaak niet juist zijn."));
  113.         }
  114.         return $this->render('article.html.twig', [
  115.             'article' => $article,
  116.         ]);
  117.     }
  118.     /**
  119.      * @Route("/moderate/articles", name="articles_moderate")
  120.      */
  121.     public function moderate_article(Request $requestTranslatorInterface $translator)
  122.     {
  123.         $this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
  124.         $repository $this->getDoctrine()->getRepository(Articles::class);
  125.         if($translator->getLocale() == 'nl') {
  126.             $oder_field 'title_nl';
  127.         } else {
  128.             $oder_field 'title_en';
  129.         }
  130.         $articles $repository->findBy(array(),array('num_reviews'=>'DESC' ,'approved'=>'ASC'$oder_field => 'ASC'));
  131.         return $this->render('articles_moderate.html.twig', [
  132.             'items' => $articles,
  133.         ]);
  134.     }
  135.     /**
  136.      * @Route("/moderate/article/add", name="article_moderate_add")
  137.      */
  138.     public function add(EntityManagerInterface $emRequest $requestTranslatorInterface $translator)
  139.     {
  140.         $this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
  141.         $form $this->createForm(ArticlesFormType::class);
  142.         $form->handleRequest($request);
  143.         if ($form->isSubmitted() && $form->isValid()){
  144.             $article $form->getData();
  145.             $article->setUserId($this->getUser()->getId());
  146.             $article->setUsername($this->getUser()->getUsername());
  147.             $article->setAdded(new \DateTime());
  148.             $article->setNumReviews('0');
  149.             $em->persist($article);
  150.             $em->flush();
  151.             $newsfeed = new Newsfeed();
  152.             $newsfeed->setTitleNl($article->getTitleNl());
  153.             $newsfeed->setTitleEn($article->getTitleEn());
  154.             $newsfeed->setRemoteId($article->getId());
  155.             $newsfeed->setType('article');
  156.             $newsfeed->setIsUpdate(0);
  157.             $newsfeed->setTime(new \DateTime());
  158.             $em $this->getDoctrine()->getManager();
  159.             $em->persist($newsfeed);
  160.             $em->flush();
  161.             if ($article->getApproved() == 1){
  162.                 $searchitem = new SearchItems();
  163.                 $searchitem->setType('article');
  164.                 $searchitem->setPath($this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]));
  165.                 $searchitem->setNameNl($article->getTitleNl());
  166.                 $searchitem->setNameEn($article->getTitleEn());
  167.                 $searchitem->setKeywordsNl($article->getTitleNl().','.$article->getKeywordsNl());
  168.                 $searchitem->setKeywordsEn($article->getTitleEn().','.$article->getKeywordsEn());
  169.                 if(empty($article->getEdited())) {
  170.                     $searchitem->setLastUpdateTime($article->getAdded());
  171.                 } else {
  172.                     $searchitem->setLastUpdateTime($article->getEdited());
  173.                 }
  174.                 $em->persist($searchitem);
  175.                 $em->flush();
  176.             }
  177.             $this->addFlash('success'$translator->trans("Artikel toegevoegd"));
  178.             return $this->redirectToRoute('articles_moderate');
  179.         }
  180.         return $this->render('article_edit.html.twig', [
  181.             'moderator_form' => true,
  182.             'title' => $translator->trans("Artikel toevoegen"),
  183.             'form' => $form->createView()
  184.         ]);
  185.     }
  186.     /**
  187.      * @Route("/moderate/article/{id}/edit", name="articles_moderate_edit")
  188.      */
  189.     public function edit(Articles $idEntityManagerInterface $emRequest $requestTranslatorInterface $translator)
  190.     {
  191.         $this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
  192.         $article $id;
  193.         $form $this->createForm(ArticlesFormType::class, $article);
  194.         $form->handleRequest($request);
  195.         if ($form->isSubmitted() && $form->isValid()){
  196.             $article $form->getData();
  197.             $article->setApprovedUserId($this->getUser()->getId());
  198.             $article->setApprovedUsername($this->getUser()->getUsername());
  199.             $article->setEdited(new \DateTime());
  200.             $article->setEditedUserId($this->getUser()->getId());
  201.             $article->setEditedUsername($this->getUser()->getUsername()); 
  202.             $em->persist($article);
  203.             $em->flush();
  204.             $repository $em->getRepository(SearchItems::class);
  205.             $searchitem $repository->findOneBy(array('path' => $this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]) ));
  206.             if ($article->getApproved() == 1){
  207.                 $newsfeed = new Newsfeed();
  208.                 $newsfeed->setTitleNl($article->getTitleNl());
  209.                 $newsfeed->setTitleEn($article->getTitleEn());
  210.                 $newsfeed->setRemoteId($article->getId());
  211.                 $newsfeed->setType('article');
  212.                 $newsfeed->setIsUpdate(1);
  213.                 $newsfeed->setTime(new \DateTime());
  214.                 $em $this->getDoctrine()->getManager();
  215.                 $em->persist($newsfeed);
  216.                 $em->flush();
  217.                 if(!$searchitem) {
  218.                     $searchitem = new SearchItems();
  219.                 }
  220.                 $searchitem->setType('article');
  221.                 $searchitem->setPath($this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]));
  222.                 $searchitem->setNameNl($article->getTitleNl());
  223.                 $searchitem->setNameEn($article->getTitleEn());
  224.                 $searchitem->setKeywordsNl($article->getTitleNl().','.$article->getKeywordsNl());
  225.                 $searchitem->setKeywordsEn($article->getTitleEn().','.$article->getKeywordsEn());
  226.                 if(empty($article->getEdited())) {
  227.                     $searchitem->setLastUpdateTime($article->getAdded());
  228.                 } else {
  229.                     $searchitem->setLastUpdateTime($article->getEdited());
  230.                 }
  231.                 $em->persist($searchitem);
  232.                 $em->flush();
  233.             } else {
  234.                 if($searchitem) {
  235.                     $em->remove($searchitem);
  236.                     $em->flush();
  237.                 }
  238.             }
  239.             $this->addFlash('success'$translator->trans("Artikel bijgewerkt"));
  240.             
  241.             return $this->redirectToRoute('articles_moderate');
  242.         }
  243.         return $this->render('article_edit.html.twig', [
  244.             'moderator_form' => true,
  245.             'title' => $translator->trans("Artikel bewerken"),
  246.             'form' => $form->createView()
  247.         ]);
  248.     }
  249.     /**
  250.      * @Route("/moderate/article/{id}/revoke", name="articles_moderate_revoke")
  251.      */
  252.     public function moderate_revoke(int $idArticles $articleEntityManagerInterface $emTranslatorInterface $translator)
  253.     {
  254.         $this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
  255.         $article->setApprovedUserId($this->getUser()->getId());
  256.         $article->setApprovedUsername($this->getUser()->getUsername());
  257.         $article->setApproved('0');
  258.         $em->persist($article);
  259.         $repository $em->getRepository(SearchItems::class);
  260.         $searchitem $repository->findOneBy(array('path' => $this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]) ));
  261.         if($searchitem){
  262.             $em->remove($searchitem);
  263.         }
  264.         $em->flush();
  265.         $this->addFlash('success'$translator->trans("Artikel ingetrokken"));
  266.         return $this->redirectToRoute('articles_moderate');
  267.     }
  268.     /**
  269.      * @Route("/moderate/article/{id}/approve", name="articles_moderate_approve")
  270.      */
  271.     public function moderate_approve(int $idArticles $articleEntityManagerInterface $emTranslatorInterface $translator)
  272.     {
  273.         $this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
  274.         $article->setApprovedUserId($this->getUser()->getId());
  275.         $article->setApprovedUsername($this->getUser()->getUsername());
  276.         $article->setApproved('1');
  277.         $em->persist($article);
  278.         $newsfeed = new Newsfeed();
  279.         $newsfeed->setTitleNl($article->getTitleNl());
  280.         $newsfeed->setTitleEn($article->getTitleEn());
  281.         $newsfeed->setRemoteId($article->getId());
  282.         $newsfeed->setType('article');
  283.         $newsfeed->setIsUpdate(0);
  284.         $newsfeed->setTime(new \DateTime());
  285.         $em $this->getDoctrine()->getManager();
  286.         $em->persist($newsfeed);
  287.         $repository $em->getRepository(SearchItems::class);
  288.         $searchitem $repository->findOneBy(array('path' => $this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]) ));
  289.         if(!$searchitem) {
  290.             $searchitem = new SearchItems();
  291.         }
  292.         $searchitem->setType('article');
  293.         $searchitem->setPath($this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]));
  294.         $searchitem->setNameNl($article->getTitleNl());
  295.         $searchitem->setNameEn($article->getTitleEn());
  296.         $searchitem->setKeywordsNl($article->getTitleNl().','.$article->getKeywordsNl());
  297.         $searchitem->setKeywordsEn($article->getTitleEn().','.$article->getKeywordsEn());
  298.         if(empty($article->getEdited())) {
  299.             $searchitem->setLastUpdateTime($article->getAdded());
  300.         } else {
  301.             $searchitem->setLastUpdateTime($article->getEdited());
  302.         }
  303.         $em->persist($searchitem);
  304.         $em->flush();
  305.         $this->addFlash('success'$translator->trans("Artikel goedgekeurd"));
  306.         return $this->redirectToRoute('articles_moderate');
  307.     }
  308.     /**
  309.      * @Route("/moderate/article/{id}/delete", name="articles_moderate_delete")
  310.      */
  311.     public function moderate_delete(Articles $idEntityManagerInterface $emTranslatorInterface $translator)
  312.     {
  313.         $this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
  314.         $article $id;
  315.         
  316.         $repository $em->getRepository(SearchItems::class);
  317.         $searchitem $repository->findOneBy(array('path' => $this->router->generate('article', [ 'id' => $article->getId(), 'url' => $article->getUrl() ]) ));
  318.         if($searchitem){
  319.             $em->remove($searchitem);
  320.         }
  321.         
  322.         $em->remove($article);
  323.         $em->flush();
  324.         $this->addFlash('success'$translator->trans("Artikel verwijderd"));
  325.         return $this->redirectToRoute('articles_moderate');
  326.     }
  327.     /**
  328.      * @Route("/moderate/article/{id}/reviews", name="articles_moderate_reviews")
  329.      */
  330.     public function moderate_review(Articles $idEntityManagerInterface $emTranslatorInterface $translator)
  331.     {
  332.         $this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
  333.         return $this->render('articlereviews_moderate.html.twig', [
  334.             'article' => $id,
  335.         ]);
  336.     }
  337.     /**
  338.      * @Route("/article/{catid}/{id}/review", name="article_review_add")
  339.      */
  340.     public function article_review_add(int $catidArticles $idRequest $requestEntityManagerInterface $emTranslatorInterface $translator)
  341.     {
  342.         $this->denyAccessUnlessGranted('ROLE_USER');
  343.         if($_ENV['DISABLE_FORMS'] == "true") { return $this->render('maintenance_form_disabled.html.twig'); }
  344.         $form $this->createForm(ArticleReviewFormType::class);
  345.         $form->handleRequest($request);
  346.         if ($form->isSubmitted() && $form->isValid()){
  347.             $article $id;
  348.             $review $form->getData();
  349.             $review->setUserId($this->getUser()->getId());
  350.             $review->setUsername($this->getUser()->getUsername());
  351.             $review->setArticle($article);
  352.             $em->persist($review);
  353.             $em->flush();
  354.             $num_reviews $article->getNumReviews();
  355.             $article->setNumReviews($num_reviews+1);
  356.             $em->persist($article);
  357.             $em->flush();
  358.             if($translator->getLocale() == 'nl') {
  359.                 $article_title $article->getTitleNl();
  360.             } else {
  361.                 $article_title $article->getTitleEn();
  362.             }
  363.             $this->addFlash('success'$translator->trans("Feedback doorgegeven"));
  364.             return $this->redirectToRoute('article',array('id' => $article->getId(), 'catid' => $article->getCategory()->getId(), 'title' => $article_title ));
  365.         }
  366.         return $this->render('form_edit.html.twig', [
  367.             'title' => $translator->trans("Feedback doorgeven"),
  368.             'button_text' => $translator->trans("Insturen"),
  369.             'form' => $form->createView()
  370.         ]);
  371.     }
  372.     /**
  373.      * @Route("/moderate/article/review/{id}/read", name="articlereviews_moderate_read")
  374.      */
  375.     public function review_read(ArticleReviews $idEntityManagerInterface $emTranslatorInterface $translator)
  376.     {
  377.         $this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
  378.         $articlereview $id;
  379.         $repository $this->getDoctrine()->getRepository(ArticleReviews::class);
  380.         $articlereview $repository->findOneBy(array('id'=>$id));
  381.         return $this->render('articlereview.html.twig', [
  382.             'review' => $articlereview,
  383.         ]);
  384.     }
  385.     /**
  386.      * @Route("/moderate/article/review/{id}/delete", name="articlereviews_moderate_delete")
  387.      */
  388.     public function review_delete(int $idArticleReviews $articlereviewEntityManagerInterface $emTranslatorInterface $translator)
  389.     {
  390.         $this->denyAccessUnlessGranted('ROLE_MOD_ARTICLE');
  391.         $article $articlereview->getArticle();
  392.         $article->setNumReviews($article->getNumReviews()-1);
  393.         $em->persist($article);
  394.         $em->flush();
  395.         
  396.         $em->remove($articlereview);
  397.         $em->flush();
  398.         $this->addFlash('success'$translator->trans("Artikel review verwijderd"));
  399.         return $this->redirectToRoute('articles_moderate_reviews', array('id' => $article->getId() ));
  400.     }
  401.     /**
  402.      * @Route("/api/v1/articles", methods="GET", name="api_articles")
  403.      */
  404.     public function api_articles(ArticlesRepository $ArticlesRepositoryRequest $requestTranslatorInterface $translator)
  405.     {
  406.         $articles $ArticlesRepository->findAllMatching($request->query->get('query'));
  407.         $return = array();
  408.         foreach($articles as $item) {
  409.             if($translator->getLocale() == 'nl') {
  410.                 $name $item->getTitleNl();
  411.             } else {
  412.                 $name $item->getTitleEn();
  413.             }
  414.             $return[] = array(
  415.                 'id' => $item->getId(),
  416.                 'value' => $name,
  417.             );
  418.         }
  419.         return $this->json($return200, [], ['groups' => ['main']]);
  420.     }
  421. }