<?php
namespace App\Controller\Admin;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Doctrine\ORM\EntityManagerInterface;
use Vich\UploaderBundle\Handler\DownloadHandler;
use App\Entity\Batch;
use App\Entity\Project;
use App\Form\ProjectCollegeType;
use App\Form\ProjectCollegeSearchType;
use App\Security\ProjectVoter;
use App\Repository\ProjectRepository;
use App\Util\Exporter\Project\ProjectAdminExporter;
/**
*
* @Route("/admin/project/", name="admin_project_")
* @author "wendell.zheng <wxzheng@ustc.edu.cn>"
*/
class ProjectController extends AbstractController
{
/**
*
* @Route("index/{id}", name="index", requirements={"id"="\d+"})
*/
public function index(Batch $batch, Request $request, ProjectRepository $repository): Response
{
$form = $this->createForm(ProjectCollegeSearchType::class, null, [
'batch' => $batch
]);
$user = $this->getUser();
$college = $user->getAdminCollege();
$parameters = [
'batch' => $batch,
'college' => $college
];
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$parameters += $form->getData();
if ($form->getClickedButton() === $form->get('export')) {
$projects = $repository->search($parameters);
$exporter = new ProjectAdminExporter($projects);
return $exporter->download($college->getName() . '汇总表');
}
}
$twig = 'admin/project/' . Batch::TYPE_TWIGS[$batch->getType()] . '_index.html.twig';
return $this->render($twig, [
'title' => $batch->getName(),
'batch' => $batch,
'entities' => $repository->search($parameters),
'form' => $form->createView()
]);
}
/**
*
* @Route("download/{id}", name="download", requirements={"id"="\d+"})
*/
public function download(Project $project, DownloadHandler $downloadHandler): Response
{
$this->denyAccessUnlessGranted(ProjectVoter::COLLEGE_VIEW, $project);
return $downloadHandler->downloadObject($project, 'doc', null, $project->getDocDownloadName());
}
/**
*
* @Route("college/download/{id}", name="college_download", requirements={"id"="\d+"})
*/
public function collegeDownload(Project $project, DownloadHandler $downloadHandler): Response
{
$this->denyAccessUnlessGranted(ProjectVoter::COLLEGE_VIEW, $project);
return $downloadHandler->downloadObject($project, 'collegeDoc', null, $project->getCollegeDocDownloadName());
}
/**
*
* @Route("recommend/{id}", name="recommend")
*/
public function recommend(Project $project, EntityManagerInterface $em, Request $request): Response
{
$this->denyAccessUnlessGranted(ProjectVoter::COLLEGE_ACTION, $project);
$form = $this->createForm(ProjectCollegeType::class, $project);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$project->setStatus(Project::STATUS_COLLEGE_RECOMMEND);
$em->flush();
$this->addFlash('notice', '操作成功');
return $this->redirectToRoute('admin_project_index', [
'id' => $project->getBatch()
->getId()
]);
}
return $this->render('admin/project/edit.html.twig', [
'title' => '学院推荐',
'project' => $project,
'form' => $form->createView()
]);
}
/**
*
* @Route("reject/{id}", name="reject")
*/
public function reject(Project $project, EntityManagerInterface $em): Response
{
$this->denyAccessUnlessGranted(ProjectVoter::COLLEGE_ACTION, $project);
$project->setStatus(Project::STATUS_COLLEGE_REJECT);
$project->setCollegeSort(0);
$em->flush();
$this->addFlash('notice', '操作成功');
return $this->redirectToRoute('admin_project_index', [
'id' => $project->getBatch()
->getId()
]);
}
/**
*
* @Route("sort/{id}", name="sort")
*/
public function sort(Project $project, EntityManagerInterface $em, Request $request): Response
{
$this->denyAccessUnlessGranted(ProjectVoter::COLLEGE_SORT, $project);
$form = $this->createForm(ProjectCollegeType::class, $project);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$project->setStatus(Project::STATUS_COLLEGE_RECOMMEND);
$em->flush();
$this->addFlash('notice', '操作成功');
return $this->redirectToRoute('admin_project_index', [
'id' => $project->getBatch()
->getId()
]);
}
return $this->render('admin/project/edit.html.twig', [
'title' => '修改排序',
'project' => $project,
'form' => $form->createView()
]);
}
}