/** * @Route("/forum/answer/{id}-{slug}", name="forum_answer") * @Template() */ public function answerAction($id, $slug) { if (!$this->getUser()) { return $this->createAccessDeniedResponse(); } $em = $this->getDoctrine()->getManager(); $thread = $em->createQueryBuilder()->select('t, c')->from('EtuModuleForumBundle:Thread', 't')->leftJoin('t.category', 'c')->where('t.id = :id')->andWhere('t.state != 300')->setParameter('id', $id)->getQuery()->getSingleResult(); $category = $thread->getCategory(); $checker = new PermissionsChecker($this->getUser()); if (!$checker->canAnswer($category) || $thread->getState() == 200 && !$checker->canLock($category) && !$this->getUser()->getIsAdmin()) { return $this->createAccessDeniedResponse(); } $parents = $em->createQueryBuilder()->select('c')->from('EtuModuleForumBundle:Category', 'c')->where('c.left <= :left')->andWhere('c.right >= :right')->setParameter('left', $category->getLeft())->setParameter('right', $category->getRight())->orderBy('c.depth')->getQuery()->getResult(); $message = new Message(); $form = $this->createForm(new MessageType(), $message); $request = $this->get('request'); if ($request->getMethod() == 'POST') { $form->bind($request); if ($form->isValid()) { $message->setAuthor($this->getUser())->setCategory($category)->setThread($thread)->setState(100); $thread->setCountMessages($thread->getCountMessages() + 1)->setLastMessage($message); foreach ($parents as $parent) { $parent->setLastMessage($message)->setCountMessages($parent->getCountMessages() + 1); $em->persist($parent); } $em->persist($thread); $views = $em->getRepository('EtuModuleForumBundle:View')->findByThread($thread); foreach ($views as $view) { $em->remove($view); } $cviews = $em->getRepository('EtuModuleForumBundle:CategoryView')->findByCategory($category); foreach ($cviews as $cview) { $em->remove($cview); } $em->flush(); $this->giveBadges(); $page = ceil($thread->getCountMessages() / 10); $notif = new Notification(); $notif->setModule($this->getCurrentBundle()->getIdentifier())->setHelper('thread_answered')->setAuthorId($this->getUser()->getId())->setEntityType('message')->setEntityId($thread->getId())->addEntity($message); $this->getNotificationsSender()->send($notif); $this->getSubscriptionsManager()->subscribe($this->getUser(), 'message', $thread->getId()); return $this->redirect($this->generateUrl('forum_thread', array('id' => $thread->getId(), 'slug' => $thread->getSlug(), 'page' => $page)) . '#' . $message->getId()); } else { return array('errors' => $form->getErrors(), 'thread' => $thread, 'parents' => $parents, 'form' => $form->createView()); } } return array('thread' => $thread, 'parents' => $parents, 'form' => $form->createView()); }
/** * @param UserInterface $user * @param Category $category * @return bool */ public function canAnswer($user, Category $category) { $checker = new PermissionsChecker($user); return $checker->canAnswer($category); }