<?php
namespace App\Controller;
use App\Entity\Photo;
use App\Form\PhotoType;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\PhotoRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Imagine\Gd\Imagine;
use Imagine\Image\Box;
use Symfony\Component\HttpFoundation\File\File;
class PhotoController extends AbstractController
{
private $entityManager;
private $security;
private $parameterBag;
public function __construct(EntityManagerInterface $entityManager, Security $security, ParameterBagInterface $parameterBag)
{
$this->entityManager = $entityManager;
$this->security = $security;
$this->parameterBag = $parameterBag;
}
#[Route('/gallery', name: 'photo_gallery')]
public function gallery(PhotoRepository $photoRepository): Response
{
$photos = $photoRepository->findAll();
$isAdmin = $this->security->isGranted('ROLE_ADMIN');
// Получаем все уникальные жанры из базы данных
$genres = $photoRepository->findDistinctGenres();
$genreConfigs = $this->parameterBag->get('genres');
// Фильтруем и сопоставляем жанры из базы с описаниями из конфигурации
$filteredGenres = [];
foreach ($genres as $genre) {
if ($genre !== 'other') {
$filteredGenres[$genre] = $genreConfigs[$genre] ?? null;
}
}
return $this->render('photo/gallery.html.twig', [
'photos' => $photos,
'genres' => array_keys($filteredGenres),
'isAdmin' => $isAdmin,
]);
}
#[Route('/gallery/{genre}', name: 'photos_by_genre')]
public function photosByGenre($genre): Response
{
$normalizedGenre = mb_strtolower($genre);
// Получаем описание и метатеги из конфигурационного файла
$genreConfigs = $this->parameterBag->get('genres');
$genreInfo = $genreConfigs[$normalizedGenre] ?? null;
// Получаем список всех жанров из базы данных
$photoRepository = $this->entityManager->getRepository(Photo::class);
$genresFromDb = $photoRepository->findDistinctGenres();
// Фильтруем и нормализуем жанры
$filteredGenres = [];
foreach ($genresFromDb as $genreFromDb) {
if ($genreFromDb !== 'other') {
$normalizedGenreFromDb = mb_strtolower($genreFromDb);
$filteredGenres[$normalizedGenreFromDb] = $genreConfigs[$normalizedGenreFromDb] ?? null;
}
}
$photos = $photoRepository->findBy(['genre' => $normalizedGenre], ['id' => 'DESC']);
return $this->render('photo/photos_by_genre.html.twig', [
'photos' => $photos,
'genres' => array_keys($filteredGenres),
'genre' => $genre,
'selectedGenre' => $normalizedGenre,
'description' => $genreInfo['description'] ?? 'Описание для этого жанра пока отсутствует.',
'meta_title' => $genreInfo['meta_title'] ?? 'Галерея картин — Николай Макаров',
'meta_description' => $genreInfo['meta_description'] ?? 'Галерея картин жанра ' . $genre . ' художника Николая Макарова.',
]);
}
#[Route('/photos/{genre}/{id}', name: 'photo_show')]
public function show($id): Response
{
$photo = $this->entityManager->getRepository(Photo::class)->find($id);
if (!$photo) {
throw $this->createNotFoundException('No photo found for id ' . $id);
}
$isAdmin = $this->security->isGranted('ROLE_ADMIN');
return $this->render('photo/show.html.twig', [
'photo' => $photo,
'isAdmin' => $isAdmin,
]);
}
#[Route('/admin/photos/new', name: 'photo_new')]
#[IsGranted('ROLE_ADMIN')]
public function new(Request $request): Response
{
$photo = new Photo();
$form = $this->createForm(PhotoType::class, $photo);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$photoFile = $form->get('photo')->getData();
$genre = $form->get('genre')->getData();
$description = $form->get('description')->getData();
$title = $form->get('title')->getData() ?? '';
$photo->setDescription($description ?? '');
$photo->setTitle($title);
if ($photoFile) {
$newFilename = uniqid() . '.' . $photoFile->guessExtension();
$imagine = new Imagine();
$image = $imagine->open($photoFile->getPathname());
$image->resize($image->getSize()->widen(800)->heighten(800));
$tempFilename = sys_get_temp_dir() . '/' . $newFilename;
$image->save($tempFilename, ['jpeg_quality' => 80]);
$compressedPhoto = new File($tempFilename);
try {
$compressedPhoto->move(
$this->getParameter('photo_directory') . '/' . $genre,
$newFilename
);
} catch (FileException $e) {
$this->addFlash('error', 'An error occurred while uploading the photo.');
return $this->redirectToRoute('app_admin');
}
$photo->setPath($genre . '/' . $newFilename);
$photo->setGenre($genre);
$this->entityManager->persist($photo);
$this->entityManager->flush();
$this->addFlash('success', 'Photo uploaded successfully!');
return $this->redirectToRoute('photo_show', ['id' => $photo->getId(), 'genre' => $genre]);
}
}
return $this->render('photo/new.html.twig', [
'form' => $form->createView(),
]);
}
// Остальные методы остаются без изменений для сокращения примера
#[Route('/admin/photos/{id}/delete', name: 'app_admin_photo_delete')]
#[IsGranted('ROLE_ADMIN')]
public function delete(Photo $photo): Response
{
$this->entityManager->remove($photo);
$this->entityManager->flush();
$this->addFlash('success', 'Photo deleted successfully!');
return $this->redirectToRoute('admin_photos');
}
#[Route('/admin/photos', name: 'admin_photos')]
#[IsGranted('ROLE_ADMIN')]
public function index(PhotoRepository $repo): Response
{
// как и раньше: все фото, самое новое первым
$photos = $repo->findBy([], ['id' => 'DESC']);
// если у вас раньше был другой шаблон – верните его путь
return $this->render('photo/photos.html.twig', [
'photos' => $photos,
]);
}
}