<?php
namespace App\Controller;
use App\Entity\Feedback;
use App\Entity\Page;
use App\Form\PageType;
use App\Service\Path\Classes\PathEntity;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class PageController extends AbstractController
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
/**
* @Route("/admin/page", name="page_index", methods={"GET"})
*/
public function index(Request $request, PaginatorInterface $paginator): Response
{
$Pages = $this->em->getRepository(Page::class)->createQueryBuilder('p')->orderBy('p.id', 'DESC');
$defaultData = array('name' => '');
$form = $this->createFormBuilder($defaultData, ['csrf_protection' => false])
->add('name', TextType::class, [
'required' => false,
'label' => 'Название страницы',
])
->setMethod('GET')
->getForm();
if ($request->getMethod() == 'GET') {
$form->handleRequest($request);
$data = $form->getData();
}
if(!empty($data['name'])){
$Pages->andWhere('p.name LIKE :name')
->setParameter('name', '%'.$data['name'].'%');
}
$pagination = $paginator->paginate(
$Pages->getQuery(), $request->query->getInt('page', 1), 25);
$pagination->setTemplate('@KnpPaginator/Pagination/twitter_bootstrap_v4_pagination.html.twig');
return $this->render('admin/page/index.html.twig', [
'pagination' => $pagination,
'form' => $form->createView(),
]);
}
/**
* @Route("/admin/page/new", name="page_new", methods={"GET","POST"})
*/
public function new(Request $request, PathEntity $pathEntity): Response
{
$page = new Page();
$page->setUser($this->getUser());
$form = $this->createForm(PageType::class, $page);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$page->setCreated(time());
$this->em->persist($page);
$this->em->flush();
$pathEntity->setPath($page);
return $this->redirectToRoute('page_index');
}
return $this->render('admin/page/new.html.twig', [
'page' => $page,
'form' => $form->createView(),
]);
}
public function show(Page $page): Response
{
$pattern = [];
$replace = [];
//Обработка шорткодов
preg_match_all("/\[.*?\]/ui", $page->getBody(), $m);
if(!empty($m[0][0])){
foreach ($m[0] as $item){
$block = explode('=', trim(str_replace(['[',']'],'',$item)));
if($block[0] == 'reviews'){
$direction = 0;
if($block[1] == 'rinc'){
$direction = 6;
} elseif($block[1] == 'vak'){
$direction = 5;
}
$feedbacks = $this->em->getRepository(Feedback::class)->createQueryBuilder('f')
->andWhere('f.status = 1')
->andWhere('f.direction = :direction')
->setParameter('direction', $direction)
->orderBy('f.id', 'DESC')
->setMaxResults(10)
->getQuery()
->getResult();
$pattern[] = $item;
$replace[] = $this->renderView("page/block/feedback.html.twig",['feedbacks' => $feedbacks]);
}
}
}
$page->setBody(str_replace($pattern,$replace,$page->getBody()));
if($page->getStatus()) {
return $this->render('page/' . $page->getTemplate() . '.html.twig', [
'page' => $page,
]);
}
throw $this->createNotFoundException('404');
}
/**
* @Route("/admin/page/{id}/edit", name="page_edit", methods={"GET","POST"})
*/
public function edit(Request $request, Page $page, PathEntity $pathEntity): Response
{
$form = $this->createForm(PageType::class, $page);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->em->flush();
$pathEntity->setPath($page);
return $this->redirectToRoute('page_index');
}
return $this->render('admin/page/edit.html.twig', [
'page' => $page,
'form' => $form->createView(),
]);
}
/**
* @Route("/admin/page/{id}", priority=11, name="page_delete", methods={"DELETE"})
*/
public function delete(Request $request, Page $page): Response
{
if ($this->isCsrfTokenValid('delete'.$page->getId(), $request->request->get('_token'))) {
$this->em->remove($page);
$this->em->flush();
}
return $this->redirectToRoute('page_index');
}
}