<?php
namespace App\Application\Controller;
use App\Admin\Document\Article;
use App\Admin\Document\Category;
use App\Admin\Document\Page;
use App\Admin\Document\Project;
use App\Admin\Document\Tag;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use \Symfony\Component\Routing\Annotation\Route;
class ProjectsController extends AbstractController
{
const URL = 'gallery';
/**
* @Route("/gallery", name="gallery")
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function index(Request $request)
{
$page = $this->setSeoByUrl(self::URL, $request->getLocale());
$params = $this->getItemsParams($request->get('tag'));
return $this->render('application/projects/index.html.twig', array_merge($params, [
'page' => $page,
'tags' => $this->getDocumentRepository(Tag::class)->findBy(['url' => ['$exists' => true]], [$request->getLocale() == 'en' ? 'enName' : 'name' => 'asc']),
]));
}
/**
* @Route("/gallery/{url}", name="gallery/item")
* @param string $blogUrl
* @return \Symfony\Component\HttpFoundation\Response
* @throws \Doctrine\ODM\MongoDB\MongoDBException
*/
public function item(Request $request, $url)
{
/**
* @var Project $item
*/
$item = $this->getDocumentRepository(Project::class)->findOneBy(['active' => true, 'url' => $url]);
if (!$item) {
throw $this->createNotFoundException("Project with url '{$url}' not found or not active");
}
$this->setSeo($item, $request->getLocale());
return $this->render('application/projects/item.html.twig', [
'item' => $item,
'otherProject' => $this->getDocumentRepository(Project::class)->findBy(['active' => true, '_id' => ['$ne' => $item->getId()]], ['date' => 'asc'], 6),
]);
}
private function getItemsParams($tagUrl) {
$qb = $this->getDocumentRepository(Project::class)->createQueryBuilder();
$qb->field('active')->equals(true);
$qb->sort('date', 'asc');
if ($tagUrl) {
$tag = $this->getDocumentRepository(Tag::class)->findOneBy(['url' => $tagUrl]);
if ($tag) {
$qb->field('tags')->equals($tag->getId());
}
} else {
$tag = null;
}
$pagination = $this->paginate($qb);
$items = $pagination->getItems();
return [
'items' => $items,
'pagination' => $pagination->getPaginationData(),
'tag' => $tag,
];
}
/**
* @Route("/gallery-show-more", name="gallery-show-more")
* @return Response
*/
public function showMore(Request $request): Response
{
$params = $this->getItemsParams($request->get('tag'));
return new JsonResponse([
'html' => $this->renderView('application/projects/project-list.html.twig', $params),
'paginationHtml' => $this->renderView('application/partial/pagination.html.twig', $params),
]);
}
}