vendor/uvdesk/support-center-bundle/Controller/Article.php line 33

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\SupportCenterBundle\Controller;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Contracts\Translation\TranslatorInterface;
  8. use Symfony\Component\DependencyInjection\ContainerInterface;
  9. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Webkul\UVDesk\CoreFrameworkBundle\Services\UserService;
  12. use Webkul\UVDesk\CoreFrameworkBundle\Services\UVDeskService;
  13. use Webkul\UVDesk\SupportCenterBundle\Entity as SupportEntities;
  14. use Webkul\UVDesk\CoreFrameworkBundle\Entity as CoreEntities;
  15. class Article extends AbstractController
  16. {
  17.     private $userService;
  18.     private $translator;
  19.     private $uvdeskService;
  20.     private $entityManager;
  21.     public function __construct(UserService $userServiceUVDeskService $uvdeskServiceTranslatorInterface $translatorEntityManagerInterface $entityManager)
  22.     {
  23.         $this->userService $userService;
  24.         $this->translator $translator;
  25.         $this->uvdeskService $uvdeskService;
  26.         $this->entityManager $entityManager;
  27.     }
  28.     public function ArticleList(Request $requestContainerInterface $container)
  29.     {
  30.         if (! $this->userService->isAccessAuthorized('ROLE_AGENT_MANAGE_KNOWLEDGEBASE')) {
  31.             return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  32.         }
  33.         $solutions $this->entityManager
  34.             ->getRepository(SupportEntities\Solutions::class)
  35.             ->getAllSolutions(null$container'a.id, a.name');
  36.         if ($solutions) {
  37.             foreach ($solutions as $key => $solution) {
  38.                 $solutions[$key]['categories'] = $this->entityManager
  39.                     ->getRepository(SupportEntities\Solutions::class)
  40.                     ->getCategoriesWithCountBySolution($solution['id']);
  41.             }
  42.         }
  43.         return $this->render('@UVDeskSupportCenter/Staff/Articles/articleList.html.twig', [
  44.             'solutions' => $solutions
  45.         ]);
  46.     }
  47.     public function ArticleListByCategory(Request $requestContainerInterface $container)
  48.     {
  49.         $category $this->entityManager
  50.             ->getRepository(SupportEntities\SolutionCategory::class)
  51.             ->findCategoryById(['id' => $request->attributes->get('category')]);
  52.         if ($category) {
  53.             return $this->render('@UVDeskSupportCenter/Staff/Articles/articleListByCategory.html.twig', [
  54.                 'category'          => $category,
  55.                 'articleCount'      => $this->entityManager
  56.                     ->getRepository(SupportEntities\SolutionCategory::class)
  57.                     ->getArticlesCountByCategory($request->attributes->get('category')),
  58.                 'categorySolutions' => $this->entityManager
  59.                     ->getRepository(SupportEntities\SolutionCategory::class)
  60.                     ->getSolutionsByCategory($request->attributes->get('category')),
  61.                 'solutions'         => $this->entityManager
  62.                     ->getRepository(SupportEntities\Solutions::class)
  63.                     ->getAllSolutions(null$container'a.id, a.name')
  64.             ]);
  65.         } else {
  66.             $this->noResultFound();
  67.         }
  68.     }
  69.     public function ArticleListBySolution(Request $request)
  70.     {
  71.         $solution $this->entityManager
  72.             ->getRepository(SupportEntities\Solutions::class)
  73.             ->findSolutionById(['id' => $request->attributes->get('solution')]);
  74.         if ($solution) {
  75.             return $this->render('@UVDeskSupportCenter/Staff/Articles/articleListBySolution.html.twig', [
  76.                 'solution'              => $solution,
  77.                 'solutionArticleCount'  => $this->entityManager
  78.                     ->getRepository(SupportEntities\Solutions::class)
  79.                     ->getArticlesCountBySolution($request->attributes->get('solution')),
  80.                 'solutionCategoryCount' => $this->entityManager
  81.                     ->getRepository(SupportEntities\Solutions::class)
  82.                     ->getCategoriesCountBySolution($request->attributes->get('solution')),
  83.             ]);
  84.         } else {
  85.             $this->noResultFound();
  86.         }
  87.     }
  88.     public function ArticleListXhr(Request $requestContainerInterface $container)
  89.     {
  90.         $json = array();
  91.         $repository $this->entityManager->getRepository(SupportEntities\Article::class);
  92.         if ($request->attributes->get('category'))
  93.             $request->query->set('categoryId'$request->attributes->get('category'));
  94.         if ($request->attributes->get('solution'))
  95.             $request->query->set('solutionId'$request->attributes->get('solution'));
  96.         $json $repository->getAllArticles($request->query$container);
  97.         $response = new Response(json_encode($json));
  98.         $response->headers->set('Content-Type''application/json');
  99.         return $response;
  100.     }
  101.     public function articleHistoryXhr(Request $request)
  102.     {
  103.         $json = array();
  104.         $repository $this->entityManager->getRepository(SupportEntities\Article::class);
  105.         $params = ['articleId' => $request->attributes->get('id')];
  106.         $json $repository->getAllHistoryByArticle($params);
  107.         if ($json) {
  108.             foreach ($json as $key => $js) {
  109.                 $json[$key]['dateAdded'] = [
  110.                     'format'    => $this->userService->convertToTimezone($js['dateAdded']),
  111.                     'timestamp' => $this->userService->convertToDatetimeTimezoneTimestamp($js['dateAdded']),
  112.                 ];
  113.             }
  114.         }
  115.         $response = new Response(json_encode($json));
  116.         $response->headers->set('Content-Type''application/json');
  117.         return $response;
  118.     }
  119.     public function articleRelatedXhr(Request $request)
  120.     {
  121.         $json = array();
  122.         $repository $this->entityManager->getRepository(SupportEntities\Article::class);
  123.         $params = ['articleId' => $request->attributes->get('id')];
  124.         $json $repository->getAllRelatedByArticle($params);
  125.         $response = new Response(json_encode($json));
  126.         $response->headers->set('Content-Type''application/json');
  127.         return $response;
  128.     }
  129.     protected function getArticle($filterArray = array())
  130.     {
  131.         if ($filterArray) {
  132.             return $this->entityManager
  133.                 ->getRepository(SupportEntities\Article::class)
  134.                 ->findOneBy($filterArray);
  135.         }
  136.         return false;
  137.     }
  138.     public function article(Request $requestContainerInterface $container)
  139.     {
  140.         $articleCategory $articleTags = [];
  141.         if ($request->attributes->get('id')) {
  142.             $article $this->getArticle(['id' => $request->attributes->get('id')]);
  143.             if (! $article)
  144.                 $this->noResultFound();
  145.         } else {
  146.             $article = new SupportEntities\Article;
  147.         }
  148.         if ($article->getId()) {
  149.             $articleCategory $this->entityManager
  150.                 ->getRepository(SupportEntities\Article::class)
  151.                 ->getCategoryByArticle($article->getId());
  152.             $articleTags $this->entityManager
  153.                 ->getRepository(SupportEntities\Article::class)
  154.                 ->getTagsByArticle($article->getId());
  155.         }
  156.         $categories $this->entityManager
  157.             ->getRepository(SupportEntities\SolutionCategory::class)
  158.             ->getAllCategories(null$container'a.id, a.name');
  159.         if ($request->attributes->get('id')) {
  160.             return  $this->render('@UVDeskSupportCenter/Staff/Articles/articleForm.html.twig', [
  161.                 'article'         => $article,
  162.                 'articleCategory' => $articleCategory,
  163.                 'articleTags'     => $articleTags,
  164.                 'categories'      => $categories
  165.             ]);
  166.         }
  167.         return $this->render('@UVDeskSupportCenter/Staff/Articles/articleAddForm.html.twig', ['article' => $article]);
  168.     }
  169.     public function articleXhr(Request $request)
  170.     {
  171.         $json = array();
  172.         // Proceed only if user has access to the resource
  173.         if (
  174.             (! $this->userService->getSessionUser())
  175.             || (! $this->userService->isAccessAuthorized('ROLE_AGENT_MANAGE_KNOWLEDGEBASE'))
  176.         ) {
  177.             throw new \Exception('Access Denied'403);
  178.         }
  179.         if ($request->getMethod() == "POST") {
  180.             $data $request->request->get("data");
  181.             $entityManager $this->entityManager;
  182.             if (isset($data['actionType'])) {
  183.                 switch ($data['actionType']) {
  184.                     case 'articleUpdate':
  185.                         if (
  186.                             'articleSave' == $data['actionType']
  187.                             && ! empty($resources['articles']['showAlert'])
  188.                         ) {
  189.                             $json['alertClass'] = 'danger';
  190.                             return new JsonResponse($json);
  191.                         }
  192.                         $article = ! empty($data['ids'][0]) ? $this->getArticle(['id' => $data['ids'][0]]) : new SupportEntities\Article;
  193.                         $json['errors'] = [];
  194.                         if ($article) {
  195.                             if (strlen($data['name']) > 200) {
  196.                                 $json['errors']['name'] = $this->translator->trans('Name length must not be greater than 200 !!');
  197.                             }
  198.                             if (! $json['errors']) {
  199.                                 unset($json['errors']);
  200.                                 $article->setName($data['name']);
  201.                                 $article->setSlug($data['slug']);
  202.                                 $article->setMetaTitle($data['metaTitle']);
  203.                                 $article->setKeywords($data['keywords']);
  204.                                 $article->setMetaDescription($data['metaDescription']);
  205.                                 if (
  206.                                     $article->getContent() == null
  207.                                     || trim($article->getContent()) != trim($data['content'])
  208.                                 ) {
  209.                                     $article->setContent($data['content']);
  210.                                 }
  211.                                 $entityManager->persist($article);
  212.                                 $entityManager->flush();
  213.                                 $json['alertClass'] = 'success';
  214.                                 $json['alertMessage'] = $this->translator->trans('Success! Article updated successfully');
  215.                                 if (! $data['ids'][0]) {
  216.                                     $json['redirect'] = $this->generateUrl('helpdesk_member_knowledgebase_update_article', array('id' => $article->getId()));
  217.                                 }
  218.                             } else {
  219.                                 $json['alertClass'] = 'danger';
  220.                                 $json['alertMessage'] = $this->translator->trans('Warning! Correct all field values first!');
  221.                             }
  222.                         } else {
  223.                             $json['alertClass'] = 'danger';
  224.                             $json['alertMessage'] = $this->translator->trans('Warning ! This is not a valid request');
  225.                         }
  226.                         break;
  227.                     case 'articleSave':
  228.                         if ('articleSave' == $data['actionType']  && !empty($resources['articles']['showAlert'])) {
  229.                             $json['alertClass'] = 'danger';
  230.                             return new JsonResponse($json);
  231.                         }
  232.                         $article = ! empty($data['ids'][0]) ? $this->getArticle(['id' => $data['ids'][0]]) : new SupportEntities\Article;
  233.                         $json['errors'] = [];
  234.                         if ($article) {
  235.                             if (strlen($data['name']) > 200) {
  236.                                 $json['errors']['name'] = $this->translator->trans('Name length must not be greater than 200 !!');
  237.                             }
  238.                             $slug $entityManager->getRepository(SupportEntities\Article::class)->findOneBy(['slug' => $data['slug']]);
  239.                             if (! empty($slug)) {
  240.                                 $json['errors']['slug'] = $this->translator->trans('Warning! Article slug is not available.');
  241.                             }
  242.                             if (! $json['errors']) {
  243.                                 unset($json['errors']);
  244.                                 $article->setName($data['name']);
  245.                                 $article->setSlug($data['slug']);
  246.                                 $article->setMetaTitle($data['metaTitle']);
  247.                                 $article->setKeywords($data['keywords']);
  248.                                 $article->setMetaDescription($data['metaDescription']);
  249.                                 if ($article->getContent() == null || trim($article->getContent()) != trim($data['content'])) {
  250.                                     $article->setContent($data['content']);
  251.                                 }
  252.                                 $entityManager->persist($article);
  253.                                 $entityManager->flush();
  254.                                 $json['alertClass'] = 'success';
  255.                                 $json['alertMessage'] = $this->translator->trans('Success! Article updated successfully');
  256.                                 if (! $data['ids'][0]) {
  257.                                     $json['redirect'] = $this->generateUrl('helpdesk_member_knowledgebase_update_article', array('id' => $article->getId()));
  258.                                 }
  259.                             } else {
  260.                                 $json['alertClass'] = 'danger';
  261.                                 $json['alertMessage'] = $this->translator->trans('Warning! Correct all field values first!');
  262.                             }
  263.                         } else {
  264.                             $json['alertClass'] = 'danger';
  265.                             $json['alertMessage'] = $this->translator->trans('Warning ! This is not a valid request');
  266.                         }
  267.                         break;
  268.                     case 'status':
  269.                         $entityManager->getRepository(SupportEntities\Article::class)->bulkArticleStatusUpdate($data['ids'], $data['targetId']);
  270.                         $json['alertClass'] = 'success';
  271.                         $json['alertMessage'] = $this->translator->trans('Success ! Article updated successfully.');
  272.                         break;
  273.                     case 'tagUpdate':
  274.                         if ($data['action'] == 'remove') {
  275.                             $entityManager->getRepository(SupportEntities\Article::class)->removeTagByArticle($data['ids'][0], [$data['entityId']]);
  276.                             $json['alertClass'] = 'success';
  277.                             $json['alertMessage'] = $this->translator->trans('Success ! Tag removed successfully.');
  278.                             break;
  279.                         } elseif ($data['action'] == 'add') {
  280.                             $articleTagMapping = new SupportEntities\ArticleTags();
  281.                             $articleTagMapping->setArticleId($data['ids'][0]);
  282.                             $articleTagMapping->setTagId($data['entityId']);
  283.                             $entityManager->persist($articleTagMapping);
  284.                             $entityManager->flush();
  285.                         } elseif ($data['action'] == 'create') {
  286.                             if (! preg_match('/^((?![!@#$%^&*()<_+]).)*$/'$data['name'])) {
  287.                                 $json['alertClass'] = 'danger';
  288.                                 $json['alertMessage'] = $this->translator->trans('Only characters are allowed');
  289.                                 break;
  290.                             }
  291.                             if (strlen($data['name']) >= 35) {
  292.                                 $json['alertClass'] = 'danger';
  293.                                 $json['alertMessage'] = $this->translator->trans('Text length should be less than 35 characters');
  294.                                 break;
  295.                             }
  296.                             $tag $entityManager->getRepository(CoreEntities\Tag::class)->findOneBy(['name' => $data['name']]);
  297.                             if (! $tag) {
  298.                                 $tag = new CoreEntities\Tag();
  299.                                 $tag->setName($data['name']);
  300.                                 $entityManager->persist($tag);
  301.                                 $entityManager->flush();
  302.                             }
  303.                             $articleTagMapping = new SupportEntities\ArticleTags();
  304.                             $articleTagMapping->setArticleId($data['ids'][0]);
  305.                             $articleTagMapping->setTagId($tag->getId());
  306.                             $entityManager->persist($tag);
  307.                             $entityManager->persist($articleTagMapping);
  308.                             $entityManager->flush();
  309.                             $json['tagId'] = $tag->getId();
  310.                             $json['tagName'] = $tag->getName();
  311.                         }
  312.                         $json['alertClass'] = 'success';
  313.                         $json['alertMessage'] = $this->translator->trans('Success ! Tags Saved successfully.');
  314.                         break;
  315.                     case 'contentUpdate':
  316.                         $article $this->getArticle(['id' => $data['ids'][0]]);
  317.                         if ($article) {
  318.                             if (trim($article->getContent()) != trim($data['content']))
  319.                                 $this->updateContent($article$data['content']);
  320.                             $json['alertClass'] = 'success';
  321.                             $json['alertMessage'] = $this->translator->trans('Success ! Revision restored successfully.');
  322.                         } else {
  323.                             $json['alertClass'] = 'danger';
  324.                             $json['alertMessage'] = $this->translator->trans('Warning ! This is not a valid request');
  325.                         }
  326.                         break;
  327.                     case 'categoryUpdate':
  328.                         if ($data['action'] == 'remove') {
  329.                             $this->entityManager
  330.                                 ->getRepository(SupportEntities\Article::class)
  331.                                 ->removeCategoryByArticle($data['ids'][0], [$data['entityId']]);
  332.                         } else if ($data['action'] == 'add') {
  333.                             $articleCategoryMapping = new SupportEntities\ArticleCategory();
  334.                             $articleCategoryMapping->setArticleId($data['ids'][0]);
  335.                             $articleCategoryMapping->setCategoryId($data['entityId']);
  336.                             $entityManager->persist($articleCategoryMapping);
  337.                             $entityManager->flush();
  338.                         }
  339.                         $json['alertClass'] = 'success';
  340.                         $json['alertMessage'] = $this->translator->trans('Success ! Categories updated successfully.');
  341.                         break;
  342.                     case 'relatedUpdate':
  343.                         if ($data['action'] == 'remove') {
  344.                             $entityManager->getRepository(SupportEntities\Article::class)->removeRelatedByArticle($data['ids'][0], [$data['entityId']]);
  345.                             $json['alertClass'] = 'success';
  346.                             $json['alertMessage'] = $this->translator->trans('Success ! Article Related removed successfully.');
  347.                         } else if ($data['action'] == 'add') {
  348.                             $relatedArticles $entityManager->getRepository(SupportEntities\ArticleRelatedArticle::class)->findBy([
  349.                                 'articleId' => $data['ids'][0],
  350.                                 'relatedArticleId' => $data['entityId'],
  351.                             ]);
  352.                             if (count($relatedArticles)) {
  353.                                 $json['alertClass'] = 'success';
  354.                                 $json['alertMessage'] = $this->translator->trans('Success ! Article Related is already added.');
  355.                             } elseif ($data['ids'][0] == $data['entityId']) {
  356.                                 $json['alertClass'] = 'danger';
  357.                                 $json['alertMessage'] = $this->translator->trans('Success ! Cannot add self as relative article.');
  358.                             } else {
  359.                                 $articleRelatedMapping = new SupportEntities\ArticleRelatedArticle();
  360.                                 $articleRelatedMapping->setArticleId($data['ids'][0]);
  361.                                 $articleRelatedMapping->setRelatedArticleId($data['entityId']);
  362.                                 $entityManager->persist($articleRelatedMapping);
  363.                                 $entityManager->flush();
  364.                                 $json['alertClass'] = 'success';
  365.                                 $json['alertMessage'] = $this->translator->trans('Success ! Article Related updated successfully.');
  366.                             }
  367.                         }
  368.                         break;
  369.                     case 'delete':
  370.                         if ($data['ids']) {
  371.                             foreach ($data['ids'] as $id) {
  372.                                 $article $entityManager->getRepository(SupportEntities\Article::class)->find($id);
  373.                                 if ($article) {
  374.                                     $entityManager->remove($article);
  375.                                     $entityManager->flush();
  376.                                 }
  377.                             }
  378.                             $this->removeArticle($article);
  379.                         }
  380.                         $json['alertClass'] = 'success';
  381.                         $json['alertMessage'] = $this->translator->trans('Success ! Articles removed successfully.');
  382.                         break;
  383.                     default:
  384.                         $json['alertClass'] = 'danger';
  385.                         $json['alertMessage'] = $this->translator->trans('Warning ! This is not a valid request');
  386.                 }
  387.             }
  388.         } elseif ($request->getMethod() == "PATCH") {
  389.             $entityManager $this->entityManager;
  390.             $data json_decode($request->getContent(), true);
  391.             if (isset($data['editType']))
  392.                 switch ($data['editType']) {
  393.                     case 'status':
  394.                         $entityManager->getRepository(SupportEntities\Article::class)->bulkArticleStatusUpdate([$data['id']], $data['value']);
  395.                         $json['alertClass'] = 'success';
  396.                         $json['alertMessage'] = $this->translator->trans('Success ! Article status updated successfully.');
  397.                         break;
  398.                     case "stared":
  399.                         $article $entityManager->getRepository(SupportEntities\Article::class)->findOneBy(['id' => $data['id']]);
  400.                         if ($article) {
  401.                             $article->setStared((isset($data['value']) && $data['value'] == 1) ? 0);
  402.                             $entityManager->persist($article);
  403.                             $entityManager->flush();
  404.                         }
  405.                         $json['alertClass'] = 'success';
  406.                         $json['alertMessage'] = $this->translator->trans('Success ! Article star updated successfully.');
  407.                         break;
  408.                     case "update":
  409.                         $articleBase $this->entityManager
  410.                             ->getRepository(SupportEntities\SolutionCategory::class)
  411.                             ->find($data['id']);
  412.                         if ($articleBase) {
  413.                             if (isset($data['name']) && strlen($data['name']) > 200) {
  414.                                 $json['alertClass'] = 'danger';
  415.                                 $json['alertMessage'] = $this->translator->trans('Name length must not be greater than 200 !!');
  416.                             } else {
  417.                                 $articleBase->setName($this->uvdeskService->htmlfilter($data['name']));
  418.                                 if (trim($articleBase->getContent()) != trim($data['content']))
  419.                                     $this->updateContent($request$articleBase$data['content']);
  420.                                 $json['alertClass'] = 'success';
  421.                                 $json['alertMessage'] = $this->translator->trans('Success! Article updated successfully');
  422.                             }
  423.                         }
  424.                     case 'status':
  425.                         $entityManager->getRepository(SupportEntities\Article::class)->bulkArticleStatusUpdate([$data['id']], $data['value']);
  426.                         $json['alertClass'] = 'success';
  427.                         $json['alertMessage'] =  $this->translator->trans('Success ! Article status updated successfully.');
  428.                         break;
  429.                     default:
  430.                         $json['alertClass'] = 'danger';
  431.                         $json['alertMessage'] =  $this->translator->trans('Warning ! This is not a valid request');
  432.                 }
  433.         }
  434.         $response = new Response(json_encode($json));
  435.         $response->headers->set('Content-Type''application/json');
  436.         return $response;
  437.     }
  438.     private function updateContent($articleBase$content$updateArticle true)
  439.     {
  440.         $entityManager $this->entityManager->getManager();
  441.         $articleHistory = new SupportEntities\ArticleHistory;
  442.         $articleHistory->setUserId($this->getUser()->getId());
  443.         $articleHistory->setArticleId($articleBase->getId());
  444.         $articleHistory->setContent($articleBase->getContent());
  445.         if ($updateArticle) {
  446.             $articleBase->setContent($content);
  447.             $entityManager->persist($articleBase);
  448.         }
  449.         $entityManager->persist($articleHistory);
  450.         $entityManager->flush();
  451.     }
  452.     private function removeArticle($article)
  453.     {
  454.         $this->entityManager
  455.             ->getRepository(SupportEntities\Article::class)
  456.             ->removeEntryByArticle($article->getId());
  457.     }
  458.     /**
  459.      * If customer is playing with url and no result is found then what will happen
  460.      * @return
  461.      */
  462.     protected function noResultFound()
  463.     {
  464.         throw new NotFoundHttpException('Not Found!');
  465.     }
  466. }