src/Controller/PhotoController.php line 98

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Photo;
  4. use App\Form\PhotoType;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use App\Repository\PhotoRepository;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  12. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  13. use Symfony\Component\Security\Core\Security;
  14. use Symfony\Component\HttpFoundation\File\UploadedFile;
  15. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  16. use Imagine\Gd\Imagine;
  17. use Imagine\Image\Box;
  18. use Symfony\Component\HttpFoundation\File\File;
  19. class PhotoController extends AbstractController
  20. {
  21.     private $entityManager;
  22.     private $security;
  23.     private $parameterBag;
  24.     public function __construct(EntityManagerInterface $entityManagerSecurity $securityParameterBagInterface $parameterBag)
  25.     {
  26.         $this->entityManager $entityManager;
  27.         $this->security $security;
  28.         $this->parameterBag $parameterBag;
  29.     }
  30.     #[Route('/gallery'name'photo_gallery')]
  31.     public function gallery(PhotoRepository $photoRepository): Response
  32.     {
  33.         $photos $photoRepository->findAll();
  34.         $isAdmin $this->security->isGranted('ROLE_ADMIN');
  35.         
  36.         // Получаем все уникальные жанры из базы данных
  37.         $genres $photoRepository->findDistinctGenres();
  38.         $genreConfigs $this->parameterBag->get('genres');
  39.         // Фильтруем и сопоставляем жанры из базы с описаниями из конфигурации
  40.         $filteredGenres = [];
  41.         foreach ($genres as $genre) {
  42.             if ($genre !== 'other') {
  43.                 $filteredGenres[$genre] = $genreConfigs[$genre] ?? null;
  44.             }
  45.         }
  46.         return $this->render('photo/gallery.html.twig', [
  47.             'photos' => $photos,
  48.             'genres' => array_keys($filteredGenres),
  49.             'isAdmin' => $isAdmin,
  50.         ]);
  51.     }
  52. #[Route('/gallery/{genre}'name'photos_by_genre')]
  53. public function photosByGenre($genre): Response
  54. {
  55.     $normalizedGenre mb_strtolower($genre);
  56.     // Получаем описание и метатеги из конфигурационного файла
  57.     $genreConfigs $this->parameterBag->get('genres');
  58.     $genreInfo $genreConfigs[$normalizedGenre] ?? null;
  59.     // Получаем список всех жанров из базы данных
  60.     $photoRepository $this->entityManager->getRepository(Photo::class);
  61.     $genresFromDb $photoRepository->findDistinctGenres();
  62.     // Фильтруем и нормализуем жанры
  63.     $filteredGenres = [];
  64.     foreach ($genresFromDb as $genreFromDb) {
  65.         if ($genreFromDb !== 'other') {
  66.             $normalizedGenreFromDb mb_strtolower($genreFromDb);
  67.             $filteredGenres[$normalizedGenreFromDb] = $genreConfigs[$normalizedGenreFromDb] ?? null;
  68.         }
  69.     }
  70.     $photos $photoRepository->findBy(['genre' => $normalizedGenre], ['id' => 'DESC']);
  71.     return $this->render('photo/photos_by_genre.html.twig', [
  72.         'photos' => $photos,
  73.         'genres' => array_keys($filteredGenres),
  74.         'genre' => $genre,
  75.         'selectedGenre' => $normalizedGenre,
  76.         'description' => $genreInfo['description'] ?? 'Описание для этого жанра пока отсутствует.',
  77.         'meta_title' => $genreInfo['meta_title'] ?? 'Галерея картин — Николай Макаров',
  78.         'meta_description' => $genreInfo['meta_description'] ?? 'Галерея картин жанра ' $genre ' художника Николая Макарова.',
  79.     ]);
  80. }
  81.     #[Route('/photos/{genre}/{id}'name'photo_show')]
  82.     public function show($id): Response
  83.     {
  84.         $photo $this->entityManager->getRepository(Photo::class)->find($id);
  85.         if (!$photo) {
  86.             throw $this->createNotFoundException('No photo found for id ' $id);
  87.         }
  88.         $isAdmin $this->security->isGranted('ROLE_ADMIN');
  89.         return $this->render('photo/show.html.twig', [
  90.             'photo' => $photo,
  91.             'isAdmin' => $isAdmin,
  92.         ]);
  93.     }
  94.     #[Route('/admin/photos/new'name'photo_new')]
  95.     #[IsGranted('ROLE_ADMIN')]
  96.     public function new(Request $request): Response
  97.     {
  98.         $photo = new Photo();
  99.         $form $this->createForm(PhotoType::class, $photo);
  100.         $form->handleRequest($request);
  101.         if ($form->isSubmitted() && $form->isValid()) {
  102.             $photoFile $form->get('photo')->getData();
  103.             $genre $form->get('genre')->getData();
  104.             $description $form->get('description')->getData();
  105.             $title $form->get('title')->getData() ?? '';
  106.             $photo->setDescription($description ?? '');
  107.             $photo->setTitle($title);
  108.             if ($photoFile) {
  109.                 $newFilename uniqid() . '.' $photoFile->guessExtension();
  110.                 $imagine = new Imagine();
  111.                 $image $imagine->open($photoFile->getPathname());
  112.                 $image->resize($image->getSize()->widen(800)->heighten(800));
  113.                 $tempFilename sys_get_temp_dir() . '/' $newFilename;
  114.                 $image->save($tempFilename, ['jpeg_quality' => 80]);
  115.                 $compressedPhoto = new File($tempFilename);
  116.                 try {
  117.                     $compressedPhoto->move(
  118.                         $this->getParameter('photo_directory') . '/' $genre,
  119.                         $newFilename
  120.                     );
  121.                 } catch (FileException $e) {
  122.                     $this->addFlash('error''An error occurred while uploading the photo.');
  123.                     return $this->redirectToRoute('app_admin');
  124.                 }
  125.                 $photo->setPath($genre '/' $newFilename);
  126.                 $photo->setGenre($genre);
  127.                 $this->entityManager->persist($photo);
  128.                 $this->entityManager->flush();
  129.                 $this->addFlash('success''Photo uploaded successfully!');
  130.                 return $this->redirectToRoute('photo_show', ['id' => $photo->getId(), 'genre' => $genre]);
  131.             }
  132.         }
  133.         return $this->render('photo/new.html.twig', [
  134.             'form' => $form->createView(),
  135.         ]);
  136.     }
  137.     // Остальные методы остаются без изменений для сокращения примера
  138.     #[Route('/admin/photos/{id}/delete'name'app_admin_photo_delete')]
  139.     #[IsGranted('ROLE_ADMIN')]
  140.     public function delete(Photo $photo): Response
  141.     {
  142.         $this->entityManager->remove($photo);
  143.         $this->entityManager->flush();
  144.         $this->addFlash('success''Photo deleted successfully!');
  145.         return $this->redirectToRoute('admin_photos');
  146.     }
  147. #[Route('/admin/photos'name'admin_photos')]
  148. #[IsGranted('ROLE_ADMIN')]
  149. public function index(PhotoRepository $repo): Response
  150. {
  151.     // как и раньше: все фото, самое новое первым
  152.     $photos $repo->findBy([], ['id' => 'DESC']);
  153.     // если у вас раньше был другой шаблон – верните его путь
  154.     return $this->render('photo/photos.html.twig', [
  155.         'photos' => $photos,
  156.     ]);
  157. }
  158. }