Newscoop\NewscoopBundle\Controller\CommentsController::indexAction PHP Метод

indexAction() публичный Метод

public indexAction ( Request $request )
$request Symfony\Component\HttpFoundation\Request
    public function indexAction(Request $request)
    {
        $userService = $this->get('user');
        $blogService = $this->get('blog');
        $user = $userService->getCurrentUser();
        if (!$user->hasPermission('ModerateComment')) {
            throw new AccessDeniedException();
        }
        $em = $this->container->get('em');
        $translator = $this->container->get('translator');
        $imageService = $this->container->get('image');
        $paginator = $this->get('knp_paginator');
        $commentService = $this->container->get('comment');
        $statusMap = Comment::$status_enum;
        $queryBuilder = $em->getRepository('Newscoop\\Entity\\Comment')->createQueryBuilder('c');
        $queryBuilder->select('c', 'cm.name')->leftJoin('c.commenter', 'cm')->where($queryBuilder->expr()->isNotNull('c.thread'))->andWhere('c.status != :deleted')->setParameter('deleted', array_search('deleted', $statusMap))->orderBy('c.time_created', 'desc');
        $session = $request->getSession();
        $pageNumber = $this->get('request')->query->get('knp_page', 1);
        $displayPerPage = 20;
        $filters = new ParameterBag();
        $filterForm = $this->container->get('form.factory')->create(new CommentsFilterType(), array(), array());
        $searchForm = $this->container->get('form.factory')->create(new CommentSearchType(), array(), array());
        $or = $queryBuilder->expr()->orX();
        $and = $queryBuilder->expr()->andX();
        if ($request->get('_route') === "newscoop_newscoop_comments_search") {
            $searchForm->handleRequest($request);
            if ($request->isMethod('POST')) {
                if ($searchForm->isValid()) {
                    $data = $searchForm->getData();
                    $commentsQueryBuilder = $commentService->searchByPhrase($data['search']);
                    $countQueryBuilder = clone $commentsQueryBuilder;
                    $countQueryBuilder->select('COUNT(c)');
                    $count = $countQueryBuilder->getQuery()->getSingleScalarResult();
                    $comments = $commentsQueryBuilder->getQuery();
                    $comments->setHint('knp_paginator.count', $count);
                    $pagination = $paginator->paginate($comments, $pageNumber, $displayPerPage, array('distinct' => false));
                    $pagination->setTemplate('NewscoopNewscoopBundle:Pagination:pagination_bootstrap3.html.twig');
                    return array('pagination' => $pagination, 'commentsArray' => $this->createCommentsArray($pagination, $imageService), 'filterForm' => $filterForm->createView(), 'searchForm' => $searchForm->createView());
                }
            }
        }
        $filterForm->handleRequest($request);
        if ($filterForm->isValid()) {
            $data = $filterForm->getData();
            $pageNumber = 1;
            // if more than one filter applied
            if (count(array_filter($data)) > 1) {
                if ($data['recommended'] && $data['unrecommended']) {
                    $queryBuilder->andWhere($queryBuilder->expr()->orX($queryBuilder->expr()->eq('c.recommended', 1), $queryBuilder->expr()->eq('c.recommended', 0)));
                    $filters->set('filterRecommended', $data['recommended']);
                    $filters->set('filterUnrecommended', $data['unrecommended']);
                } else {
                    if ($data['recommended']) {
                        $queryBuilder->andWhere($queryBuilder->expr()->eq('c.recommended', 1));
                        $filters->set('filterRecommended', $data['recommended']);
                    }
                    if ($data['unrecommended']) {
                        $queryBuilder->andWhere($queryBuilder->expr()->eq('c.recommended', 0));
                        $filters->set('filterUnrecommended', $data['unrecommended']);
                    }
                }
                unset($data['recommended']);
                unset($data['unrecommended']);
                $queryBuilder->andWhere($this->buildFilterQuery($data, $or, $filters, $queryBuilder));
            } else {
                if ($data['recommended'] && $data['unrecommended']) {
                    $queryBuilder->andWhere($queryBuilder->expr()->orX($queryBuilder->expr()->eq('c.recommended', 1), $queryBuilder->expr()->eq('c.recommended', 0)));
                    $filters->set('filterRecommended', $data['recommended']);
                    $filters->set('filterUnrecommended', $data['unrecommended']);
                } else {
                    if ($data['recommended']) {
                        $queryBuilder->andWhere($queryBuilder->expr()->eq('c.recommended', 1));
                        $filters->set('filterRecommended', $data['recommended']);
                    }
                    if ($data['unrecommended']) {
                        $queryBuilder->andWhere($queryBuilder->expr()->eq('c.recommended', 0));
                        $filters->set('filterUnrecommended', $data['unrecommended']);
                    }
                }
                unset($data['recommended']);
                unset($data['unrecommended']);
                $queryBuilder->andWhere($this->buildFilterQuery($data, $and, $filters, $queryBuilder));
            }
            $session->set('commentsFilters', $filters);
        } else {
            if ($session->get('commentsFilters')) {
                // if more than one filter applied
                if ($session->get('commentsFilters')->count() > 1) {
                    if ($session->get('commentsFilters')->get('filterRecommended') && $session->get('commentsFilters')->get('filterUnrecommended')) {
                        $queryBuilder->andWhere($queryBuilder->expr()->orX($queryBuilder->expr()->eq('c.recommended', 1), $queryBuilder->expr()->eq('c.recommended', 0)));
                    } else {
                        if ($session->get('commentsFilters')->get('filterRecommended')) {
                            $queryBuilder->andWhere($queryBuilder->expr()->eq('c.recommended', 1));
                        }
                        if ($session->get('commentsFilters')->get('filterUnrecommended')) {
                            $queryBuilder->andWhere($queryBuilder->expr()->eq('c.recommended', 0));
                        }
                    }
                    $queryBuilder->andWhere($this->buildSessionFilters($session->get('commentsFilters'), $or, $queryBuilder));
                } else {
                    if ($session->get('commentsFilters')->get('filterRecommended') && $session->get('commentsFilters')->get('filterUnrecommended')) {
                        $queryBuilder->andWhere($queryBuilder->expr()->orX($queryBuilder->expr()->eq('c.recommended', 1), $queryBuilder->expr()->eq('c.recommended', 0)));
                    } else {
                        if ($session->get('commentsFilters')->get('filterRecommended')) {
                            $queryBuilder->andWhere($queryBuilder->expr()->eq('c.recommended', 1));
                        }
                        if ($session->get('commentsFilters')->get('filterUnrecommended')) {
                            $queryBuilder->andWhere($queryBuilder->expr()->eq('c.recommended', 0));
                        }
                    }
                    $queryBuilder->andWhere($this->buildSessionFilters($session->get('commentsFilters'), $and, $queryBuilder));
                }
            }
        }
        if (!$session->get('commentsFilters', null)) {
            $session->set('commentsFilters', $filters);
        }
        $comments = $queryBuilder->getQuery();
        $pagination = $paginator->paginate($comments, $pageNumber, $displayPerPage);
        $pagination->setTemplate('NewscoopNewscoopBundle:Pagination:pagination_bootstrap3.html.twig');
        return array('pagination' => $pagination, 'commentsArray' => $this->createCommentsArray($pagination, $imageService), 'filterForm' => $filterForm->createView(), 'searchForm' => $searchForm->createView());
    }