getRepository(Project::class); $project = $repository->findOneBySlug($projectSlug); if (!$project) { $this->addFlash( 'warning', 'Projet non trouvé !' ); return $this->redirectToRoute('app_project'); } $task = new Task(); $task->setProject($project); $createForm = $this->createForm(TaskType::class, $task); $createForm->add('submit', SubmitType::class, [ 'label' => 'Créer', ]); $createForm->handleRequest($request); if ($createForm->isSubmitted() and $createForm->isValid()) { $task = $createForm->getData(); try { $entityManager->persist($task); $entityManager->flush(); $this->addFlash( 'success', 'Tâche créée !' ); return $this->redirectToRoute('app_project_show', ['projectSlug' => $projectSlug]); } catch (\Exception $exception) { $this->addFlash( 'danger', 'Impossible de créer la tâche !' ); } } return $this->render('task/create.html.twig', [ 'project' => $project, 'create_form' => $createForm, ]); } #[Route('/{projectSlug}/show/{taskSlug}', name: 'app_task_show')] public function show(EntityManagerInterface $entityManager, GeoJsonManager $geoJsonManager, $projectSlug, $taskSlug): Response { $repository = $entityManager->getRepository(Task::class); $task = $repository->findOneBySlug($taskSlug); if (!$task) { $this->addFlash( 'warning', 'Tâche non trouvée !' ); return $this->redirectToRoute('app_project_show', ['projectSlug' => $projectSlug]); } $comment = new Comment(); $commentForm = $this->createForm(CommentType::class, $comment, [ 'action' => $this->generateUrl('app_task_comment', ['projectSlug' => $projectSlug, 'taskSlug' => $taskSlug]), ]); $commentForm->add('submit', SubmitType::class, [ 'label' => 'Commenter', ]); return $this->render('task/show.html.twig', [ 'task' => $task, 'project' => $task->getProject(), 'commentForm' => $commentForm, ]); } #[Route('/{projectSlug}/comment/{taskSlug}', name: 'app_task_comment')] public function comment(Request $request, EntityManagerInterface $entityManager, $projectSlug, $taskSlug): Response { $repository = $entityManager->getRepository(Task::class); $task = $repository->findOneBySlug($taskSlug); if (!$task) { $this->addFlash( 'warning', 'Tâche non trouvée !' ); return $this->redirectToRoute('app_project_show', ['projectSlug' => $projectSlug]); } $comment = new Comment(); $comment->setTask($task); $commentForm = $this->createForm(CommentType::class, $comment); $commentForm->add('submit', SubmitType::class, [ 'label' => 'Commenter', ]); $commentForm->handleRequest($request); if ($commentForm->isSubmitted() and $commentForm->isValid()) { $comment = $commentForm->getData(); try { $entityManager->persist($comment); $entityManager->flush(); $this->addFlash( 'success', 'Commentaire ajouté !' ); } catch (\Exception $exception) { $this->addFlash( 'danger', 'Impossible de commenter !' ); } } return $this->redirectToRoute('app_task_show', ['projectSlug' => $projectSlug, 'taskSlug' => $taskSlug]); } #[Route('/{projectSlug}/update/{taskSlug}', name: 'app_task_update')] public function update(Request $request, EntityManagerInterface $entityManager, $projectSlug, $taskSlug): Response { $repository = $entityManager->getRepository(Task::class); $task = $repository->findOneBySlug($taskSlug); if (!$task) { $this->addFlash( 'warning', 'Tâche non trouvée !' ); return $this->redirectToRoute('app_project_show', ['projectSlug' => $projectSlug]); } $updateForm = $this->createForm(TaskType::class, $task); $updateForm->add('submit', SubmitType::class, [ 'label' => 'Modifier', ]); $updateForm->handleRequest($request); if ($updateForm->isSubmitted() and $updateForm->isValid()) { $task = $updateForm->getData(); try { $entityManager->persist($task); $entityManager->flush(); $this->addFlash( 'success', 'Tâche modifiée !' ); return $this->redirectToRoute('app_project_show', ['projectSlug' => $projectSlug]); } catch (\Exception $exception) { $this->addFlash( 'danger', 'Impossible de modifier la tâche !' ); } } return $this->render('task/update.html.twig', [ 'project' => $task->getProject(), 'task' => $task, 'update_form' => $updateForm, ]); } #[Route('/{projectSlug}/remove/{taskSlug}', name: 'app_task_remove')] public function remove(EntityManagerInterface $entityManager, $projectSlug, $taskSlug): Response { $repository = $entityManager->getRepository(Task::class); $task = $repository->findOneBySlug($taskSlug); if (!$task) { $this->addFlash( 'warning', 'Tâche non trouvée !' ); return $this->redirectToRoute('app_project_show', ['projectSlug' => $projectSlug]); } try { $entityManager->remove($task); $entityManager->flush(); $this->addFlash( 'success', 'Tâche supprimée !' ); return $this->redirectToRoute('app_project_show', ['projectSlug' => $projectSlug]); } catch (\Exception $exception) { $this->addFlash( 'danger', 'Impossible de supprimer la tâche !' ); } return $this->redirectToRoute('app_project_show', ['projectSlug' => $projectSlug]); } private function transition(WorkflowInterface $taskLifecycleStateMachine, EntityManagerInterface $entityManager, $projectSlug, $taskSlug, $status): Response { $repository = $entityManager->getRepository(Task::class); $task = $repository->findOneBySlug($taskSlug); if (!$task) { $this->addFlash( 'warning', 'Tâche non trouvée !' ); return $this->redirectToRoute('app_project_show', ['projectSlug' => $projectSlug]); } try { $taskLifecycleStateMachine->apply($task, $status); $entityManager->persist($task); $entityManager->flush(); $this->addFlash( 'success', 'La tâche est modifiée !' ); } catch (Exception $exception) { $this->addFlash( 'warning', 'Impossible de modifier la tâche !' ); } return $this->redirectToRoute('app_task_show', ['projectSlug' => $projectSlug, 'taskSlug' => $taskSlug]); } #[Route('/{projectSlug}/start/{taskSlug}', name: 'app_task_start')] public function start(WorkflowInterface $taskLifecycleStateMachine, EntityManagerInterface $entityManager, $projectSlug, $taskSlug): Response { return $this->transition($taskLifecycleStateMachine, $entityManager, $projectSlug, $taskSlug, Task::TRANSITION_START); } #[Route('/{projectSlug}/finish/{taskSlug}', name: 'app_task_finish')] public function finish(WorkflowInterface $taskLifecycleStateMachine, EntityManagerInterface $entityManager, $projectSlug, $taskSlug): Response { return $this->transition($taskLifecycleStateMachine, $entityManager, $projectSlug, $taskSlug, Task::TRANSITION_FINISH); } #[Route('/{projectSlug}/cancel/{taskSlug}', name: 'app_task_cancel')] public function cancel(WorkflowInterface $taskLifecycleStateMachine, EntityManagerInterface $entityManager, $projectSlug, $taskSlug): Response { return $this->transition($taskLifecycleStateMachine, $entityManager, $projectSlug, $taskSlug, Task::TRANSITION_CANCEL); } #[Route('/{projectSlug}/reset/{taskSlug}', name: 'app_task_reset')] public function reset(WorkflowInterface $taskLifecycleStateMachine, EntityManagerInterface $entityManager, $projectSlug, $taskSlug): Response { return $this->transition($taskLifecycleStateMachine, $entityManager, $projectSlug, $taskSlug, Task::TRANSITION_RESET); } #[Route('/{slug}.geojson', name: 'app_task_geojson')] public function geojson(Request $request, EntityManagerInterface $entityManager, $slug): Response { $repository = $entityManager->getRepository(Task::class); $task = $repository->findOneBySlug($slug); if (!$task) { $this->addFlash( 'warning', 'Tâche non trouvée !' ); return $this->redirect($request->headers->get('referer')); } return JsonResponse::fromJsonString($task->getGeojson()); } #[Route('/{slug}.osm', name: 'app_task_osm')] public function osm(Request $request, EntityManagerInterface $entityManager, $slug): Response { $repository = $entityManager->getRepository(Task::class); $task = $repository->findOneBySlug($slug); if (!$task) { $this->addFlash( 'warning', 'Tâche non trouvée !' ); return $this->redirect($request->headers->get('referer')); } $xml = new \DOMDocument(); $xml->loadXml($task->getOsm()); $response = new Response($xml->saveXML()); $response->headers->set('Content-Type', 'application/xml'); return $response; } }