示例#1
0
 /**
  * @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);
 }