<?php
namespace Webkul\UVDesk\SupportCenterBundle\Controller;
use Doctrine\Common\Collections\Criteria;
use Webkul\UVDesk\SupportCenterBundle\Form;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Webkul\UVDesk\CoreFrameworkBundle\Services\UserService;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Webkul\UVDesk\CoreFrameworkBundle\Entity as CoreEntites;
use Webkul\UVDesk\SupportCenterBundle\Entity as SupportEntites;
class Website extends AbstractController
{
private $visibility = ['public'];
private $limit = 5;
private $company;
private $userService;
private $translator;
private $constructContainer;
public function __construct(UserService $userService, TranslatorInterface $translator, ContainerInterface $constructContainer)
{
$this->userService = $userService;
$this->translator = $translator;
$this->constructContainer = $constructContainer;
}
private function isKnowledgebaseActive()
{
$entityManager = $this->getDoctrine()->getManager();
$website = $entityManager->getRepository(CoreEntites\Website::class)->findOneByCode('knowledgebase');
if (!empty($website)) {
$knowledgebaseWebsite = $entityManager->getRepository(SupportEntites\KnowledgebaseWebsite::class)->findOneBy(['website' => $website->getId(), 'status' => true]);
if (!empty($knowledgebaseWebsite) && true == $knowledgebaseWebsite->getIsActive()) {
return true;
}
}
throw new NotFoundHttpException('Page Not Found');
}
public function home(Request $request)
{
$this->isKnowledgebaseActive();
$parameterBag = [
'visibility' => 'public',
'sort' => 'id',
'direction' => 'desc'
];
$articleRepository = $this->getDoctrine()->getRepository(SupportEntites\Article::class);
$solutionRepository = $this->getDoctrine()->getRepository(SupportEntites\Solutions::class);
$twigResponse = [
'searchDisable' => false,
'popArticles' => $articleRepository->getPopularTranslatedArticles($request->getLocale()),
'solutions' => $solutionRepository->getAllSolutions(new ParameterBag($parameterBag), $this->constructContainer, 'a', [1]),
];
$newResult = [];
foreach ($twigResponse['solutions'] as $key => $result) {
$newResult[] = [
'id' => $result->getId(),
'name' => $result->getName(),
'description' => $result->getDescription(),
'visibility' => $result->getVisibility(),
'solutionImage' => ($result->getSolutionImage() == null) ? '' : $result->getSolutionImage(),
'categoriesCount' => $solutionRepository->getCategoriesCountBySolution($result->getId()),
'categories' => $solutionRepository->getCategoriesWithCountBySolution($result->getId()),
'articleCount' => $solutionRepository->getArticlesCountBySolution($result->getId()),
];
}
$twigResponse['solutions']['results'] = $newResult;
$twigResponse['solutions']['categories'] = array_map(function($category) use ($articleRepository) {
$parameterBag = [
'categoryId' => $category['id'],
'status' => 1,
'sort' => 'id',
'limit'=>10,
'direction' => 'desc'
];
$article = $articleRepository->getAllArticles(new ParameterBag($parameterBag), $this->constructContainer, 'a.id, a.name, a.slug, a.stared');
return [
'id' => $category['id'],
'name' => $category['name'],
'description' => $category['description'],
'articles' => $article
];
}, $solutionRepository->getAllCategories(10, 2));
return $this->render('@UVDeskSupportCenter//Knowledgebase//index.html.twig', $twigResponse);
}
public function listCategories(Request $request)
{
$this->isKnowledgebaseActive();
$solutionRepository = $this->getDoctrine()->getRepository(SupportEntites\Solutions::class);
$categoryCollection = $solutionRepository->getAllCategories(10, 4);
return $this->render('@UVDeskSupportCenter/Knowledgebase/categoryListing.html.twig', [
'categories' => $categoryCollection,
'categoryCount' => count($categoryCollection),
]);
}
public function viewFolder(Request $request)
{
$this->isKnowledgebaseActive();
if(!$request->attributes->get('solution'))
return $this->redirect($this->generateUrl('helpdesk_knowledgebase'));
$filterArray = ['id' => $request->attributes->get('solution')];
$solution = $this->getDoctrine()
->getRepository(SupportEntites\Solutions::class)
->findOneBy($filterArray);
if(!$solution)
$this->noResultFound();
$breadcrumbs = [
[
'label' => $this->translator->trans('Support Center'),
'url' => $this->generateUrl('helpdesk_knowledgebase')
],
[
'label' => $solution->getName(),
'url' => '#'
],
];
$testArray = [1, 2, 3, 4];
foreach ($testArray as $test) {
$categories[] = [
'id' => $test,
'name' => $test . " name",
'articleCount' => $test . " articleCount",
];
}
return $this->render('@UVDeskSupportCenter//Knowledgebase//folder.html.twig', [
'folder' => $solution,
'categoryCount' => $this->getDoctrine()
->getRepository(SupportEntites\Solutions::class)
->getCategoriesCountBySolution($solution->getId()),
'categories' => $this->getDoctrine()
->getRepository(SupportEntites\Solutions::class)
->getCategoriesWithCountBySolution($solution->getId()),
'breadcrumbs' => $breadcrumbs
]);
}
public function viewFolderArticle(Request $request)
{
$this->isKnowledgebaseActive();
if(!$request->attributes->get('solution'))
return $this->redirect($this->generateUrl('helpdesk_knowledgebase'));
$filterArray = ['id' => $request->attributes->get('solution')];
$solution = $this->getDoctrine()
->getRepository(SupportEntites\Solutions::class)
->findOneBy($filterArray);
if(!$solution)
$this->noResultFound();
$breadcrumbs = [
[
'label' => $this->translator->trans('Support Center'),
'url' => $this->generateUrl('helpdesk_knowledgebase')
],
[
'label' => $solution->getName(),
'url' => '#'
],
];
$parameterBag = [
'solutionId' => $solution->getId(),
'status' => 1,
'sort' => 'id',
'direction' => 'desc'
];
$article_data = [
'folder' => $solution,
'articlesCount' => $this->getDoctrine()
->getRepository(SupportEntites\Solutions::class)
->getArticlesCountBySolution($solution->getId(), [1]),
'articles' => $this->getDoctrine()
->getRepository(SupportEntites\Article::class)
->getAllArticles(new ParameterBag($parameterBag), $this->constructContainer, 'a.id, a.name, a.slug, a.stared'),
'breadcrumbs' => $breadcrumbs,
];
return $this->render('@UVDeskSupportCenter/Knowledgebase/folderArticle.html.twig', $article_data);
}
public function viewCategory(Request $request)
{
$this->isKnowledgebaseActive();
if(!$request->attributes->get('category'))
return $this->redirect($this->generateUrl('helpdesk_knowledgebase'));
$filterArray = array(
'id' => $request->attributes->get('category'),
'status' => 1,
);
$category = $this->getDoctrine()
->getRepository(SupportEntites\SolutionCategory::class)
->findOneBy($filterArray);
if(!$category)
$this->noResultFound();
$breadcrumbs = [
[ 'label' => $this->translator->trans('Support Center'),'url' => $this->generateUrl('helpdesk_knowledgebase') ],
[ 'label' => $category->getName(),'url' => '#' ],
];
$parameterBag = [
'categoryId' => $category->getId(),
'status' => 1,
'sort' => 'id',
'direction' => 'desc'
];
$category_data= array(
'category' => $category,
'articlesCount' => $this->getDoctrine()
->getRepository(SupportEntites\SolutionCategory::class)
->getArticlesCountByCategory($category->getId(), [1]),
'articles' => $this->getDoctrine()
->getRepository(SupportEntites\Article::class)
->getAllArticles(new ParameterBag($parameterBag), $this->constructContainer, 'a.id, a.name, a.slug, a.stared'),
'breadcrumbs' => $breadcrumbs
);
return $this->render('@UVDeskSupportCenter/Knowledgebase/category.html.twig',$category_data);
}
public function viewArticle(Request $request)
{
$this->isKnowledgebaseActive();
if (!$request->attributes->get('article') && !$request->attributes->get('slug')) {
return $this->redirect($this->generateUrl('helpdesk_knowledgebase'));
}
$entityManager = $this->getDoctrine()->getManager();
$user = $this->userService->getCurrentUser();
$articleRepository = $entityManager->getRepository(SupportEntites\Article::class);
if ($request->attributes->get('article')) {
$article = $articleRepository->findOneBy(['status' => 1, 'id' => $request->attributes->get('article')]);
} else {
$article = $articleRepository->findOneBy(['status' => 1,'slug' => $request->attributes->get('slug')]);
}
if (empty($article)) {
$this->noResultFound();
}
$stringReplace = str_replace("<ol>","<ul>",$article->getContent());
$stringReplace = str_replace("</ol>","</ul>",$stringReplace);
$article->setContent($stringReplace);
$article->setViewed((int) $article->getViewed() + 1);
// Log article view
$articleViewLog = new SupportEntites\ArticleViewLog();
$articleViewLog->setUser(($user != null && $user != 'anon.') ? $user : null);
$articleViewLog->setArticle($article);
$articleViewLog->setViewedAt(new \DateTime('now'));
$entityManager->persist($article);
$entityManager->persist($articleViewLog);
$entityManager->flush();
// Get article feedbacks
$feedbacks = ['enabled' => false, 'submitted' => false, 'article' => $articleRepository->getArticleFeedbacks($article)];
if (!empty($user) && $user != 'anon.') {
$feedbacks['enabled'] = true;
if (!empty($feedbacks['article']['collection']) && in_array($user->getId(), array_column($feedbacks['article']['collection'], 'user'))) {
$feedbacks['submitted'] = true;
}
}
// @TODO: App popular articles
$article_details = [
'article' => $article,
'breadcrumbs' => [
['label' => $this->translator->trans('Support Center'), 'url' => $this->generateUrl('helpdesk_knowledgebase')],
['label' => $article->getName(), 'url' => '#']
],
'dateAdded' => $this->userService->convertToTimezone($article->getDateAdded()),
'articleTags' => $articleRepository->getTagsByArticle($article->getId()),
'articleAuthor' => $articleRepository->getArticleAuthorDetails($article->getId()),
'relatedArticles' => $articleRepository->getAllRelatedyByArticle(['locale' => $request->getLocale(), 'articleId' => $article->getId()], [1]),
'popArticles' => $articleRepository->getPopularTranslatedArticles($request->getLocale())
];
return $this->render('@UVDeskSupportCenter/Knowledgebase/article.html.twig',$article_details);
}
public function searchKnowledgebase(Request $request)
{
$this->isKnowledgebaseActive();
$searchQuery = $request->query->get('s');
if (empty($searchQuery)) {
return $this->redirect($this->generateUrl('helpdesk_knowledgebase'));
}
$articleCollection = $this->getDoctrine()->getRepository(SupportEntites\Article::class)->getArticleBySearch($request);
return $this->render('@UVDeskSupportCenter/Knowledgebase/search.html.twig', [
'search' => $searchQuery,
'articles' => $articleCollection,
]);
}
public function viewTaggedResources(Request $request)
{
$this->isKnowledgebaseActive();
$tagQuery = $request->attributes->get('tag');
if (empty($tagQuery)) {
return $this->redirect($this->generateUrl('helpdesk_knowledgebase'));
}
$tagLabel = $request->attributes->get('name');
$articleCollection = $this->getDoctrine()->getRepository(SupportEntites\Article::class)->getArticleByTags([$tagLabel]);
return $this->render('@UVDeskSupportCenter/Knowledgebase/search.html.twig', [
'articles' => $articleCollection,
'search' => $tagLabel,
'breadcrumbs' => [
['label' => $this->translator->trans('Support Center'), 'url' => $this->generateUrl('helpdesk_knowledgebase')],
['label' => $tagLabel, 'url' => '#'],
],
]);
}
public function rateArticle($articleId, Request $request)
{
$this->isKnowledgebaseActive();
// @TODO: Refactor
// if ($request->getMethod() != 'POST') {
// return $this->redirect($this->generateUrl('helpdesk_knowledgebase'));
// }
// $company = $this->getCompany();
// $user = $this->userService->getCurrentUser();
$response = ['code' => 404, 'content' => ['alertClass' => 'danger', 'alertMessage' => 'An unexpected error occurred. Please try again later.']];
// if (!empty($user) && $user != 'anon.') {
// $entityManager = $this->getDoctrine()->getEntityManager();
// $article = $entityManager->getRepository('WebkulSupportCenterBundle:Article')->findOneBy(['id' => $articleId, 'companyId' => $company->getId()]);
// if (!empty($article)) {
// $providedFeedback = $request->request->get('feedback');
// if (!empty($providedFeedback) && in_array(strtolower($providedFeedback), ['positive', 'neagtive'])) {
// $isArticleHelpful = ('positive' == strtolower($providedFeedback)) ? true : false;
// $articleFeedback = $entityManager->getRepository('WebkulSupportCenterBundle:ArticleFeedback')->findOneBy(['article' => $article, 'ratedCustomer' => $user]);
// $response = ['code' => 200, 'content' => ['alertClass' => 'success', 'alertMessage' => 'Feedback saved successfully.']];
// if (empty($articleFeedback)) {
// $articleFeedback = new \Webkul\SupportCenterBundle\Entity\ArticleFeedback();
// // $articleBadge->setDescription('');
// $articleFeedback->setIsHelpful($isArticleHelpful);
// $articleFeedback->setArticle($article);
// $articleFeedback->setRatedCustomer($user);
// $articleFeedback->setCreatedAt(new \DateTime('now'));
// } else {
// $articleFeedback->setIsHelpful($isArticleHelpful);
// $response['content']['alertMessage'] = 'Feedback updated successfully.';
// }
// $entityManager->persist($articleFeedback);
// $entityManager->flush();
// } else {
// $response['content']['alertMessage'] = 'Invalid feedback provided.';
// }
// } else {
// $response['content']['alertMessage'] = 'Article not found.';
// }
// } else {
// $response['content']['alertMessage'] = 'You need to login to your account before can perform this action.';
// }
return new Response(json_encode($response['content']), $response['code'], ['Content-Type: application/json']);
}
/**
* If customer is playing with url and no result is found then what will happen
* @return
*/
protected function noResultFound()
{
throw new NotFoundHttpException('Not Found!');
}
}