<?php
namespace App\Controller;
use App\Entity\Blog;
use App\Form\BlogType;
use App\Service\FileUploader;
use App\Service\MetaTags\MetaTags;
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\ChoiceType;
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 BlogController extends AbstractController
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
/**
* @Route("/blog", priority=2, name="blog_index", methods={"GET"})
*/
public function index(Request $request, PaginatorInterface $paginator, MetaTags $metaTags)
{
$Blogs = $this->em->getRepository(Blog::class)->createQueryBuilder('b')->andWhere('b.status = 1')->orderBy('b.updated', 'DESC');
if($request->get('cat')){
$Blogs->andWhere('b.category = :cat')
->setParameter('cat', $request->get('cat'));
}
$page = (!empty($request->query->getInt('page', 1)))?$request->query->getInt('page', 1):1;
$pagination = $paginator->paginate(
$Blogs->getQuery(), $page, 9);
return $this->render('blog/index.html.twig', [
'blogs' => $pagination,
'categorys' => $this->getParameter('blog'),
'metaTags' => $metaTags->getBlogs(),
]);
}
/**
* @Route("/admin/blog", name="admin_blog_index", methods={"GET"})
*/
public function admin_index(Request $request, PaginatorInterface $paginator)
{
$Blogs = $this->em->getRepository(Blog::class)->createQueryBuilder('b')->orderBy('b.updated', 'DESC');
$categorys = $this->getParameter('blog');
$defaultData = array('name' => '');
$form = $this->createFormBuilder($defaultData, ['csrf_protection' => false])
->add('name', TextType::class, [
'required' => false,
'label' => 'Название блога',
])
->add('category', ChoiceType::class, [
'required' => false,
'label' => 'Категория',
'choices' => array_flip($categorys['category']),
])
->setMethod('GET')
->getForm();
if ($request->getMethod() == 'GET') {
$form->handleRequest($request);
$data = $form->getData();
}
if(!empty($data['name'])){
$Blogs->andWhere('b.name LIKE :name')
->setParameter('name', '%'.$data['name'].'%');
}
if(!empty($data['category'])){
$Blogs->andWhere('b.category = :category')
->setParameter('category', $data['category']);
}
$pagination = $paginator->paginate(
$Blogs->getQuery(), $request->query->getInt('page', 1), 25);
$pagination->setTemplate('@KnpPaginator/Pagination/twitter_bootstrap_v4_pagination.html.twig');
return $this->render('admin/blog/index.html.twig', [
'pagination' => $pagination,
'form' => $form->createView(),
]);
}
/**
* @Route("/admin/blog/new", name="blog_new", methods={"GET","POST"})
*/
public function new(Request $request, FileUploader $fileUploader, PathEntity $pathEntity): Response
{
$blog = new Blog();
$blog->setUser($this->getUser());
$form = $this->createForm(BlogType::class, $blog);
$form->handleRequest($request);
$error = [];
if ($form->isSubmitted() && $form->isValid()) {
$blog->setCreated(time());
$blog->setUpdated(time());
$Preview = $form->get('preview')->getData();
if ($Preview) {
$PreviewFileName = $fileUploader->upload($Preview, 'file/blog');
$blog->setPreview($PreviewFileName);
} else{
$error[] = 'Не заполнено превью';
}
$Image = $form->get('image')->getData();
if ($Image) {
$ImageFileName = $fileUploader->upload($Image, 'file/blog');
$blog->setImage($ImageFileName);
} else{
$error[] = 'Не заполнена картинка блога';
}
if(empty($error)) {
$this->em->persist($blog);
$this->em->flush();
$pathEntity->setPath($blog);
return $this->redirectToRoute('admin_blog_index');
}
}
return $this->render('admin/blog/new.html.twig', [
'blog' => $blog,
'errors' => $error,
'form' => $form->createView(),
]);
}
public function show(Blog $blog): Response
{
if($blog->getStatus()) {
$body = '';
$adv = '<div class="row grafik-block">
<div class="col-lg-6 col-md-12 item mb-30">
<a id="authors-rinc" href="/rinc?utm_source=blog">
<img src="/images/rinc_img_bige.jpg" alt="">
</a>
</div>
<div class="col-lg-6 col-md-12 item">
<a id="authors-vak" href="/vak?utm_source=blog">
<img src="/images/vak_img_bige.jpg" alt="">
</a>
</div>
</div>';
$content_avds = explode('</p>', $blog->getBody());
if(count($content_avds) > 1){
foreach ($content_avds as $key =>$content_avd){
$body .= $content_avd;
if($key == 1) $body .= $adv;
}
} else{
$body .= $blog->getBody().$adv;
}
// Функция поиска и генерации содержимого по заголовкам h2
preg_match_all('/<h2[^>]*>(.*?)<\/h2>/i', $body, $matches);
$contents = [];
if(!empty($matches[1])) {
foreach ($matches[1] as $index => $header) {
$slug = 'block-' . $index; // Создание уникального якоря
$contents[] = ['slug' => $slug, 'title' => trim(html_entity_decode(strip_tags($header)))];
// Замена заголовка в тексте на заголовок с якорем
$body = str_replace($matches[0][$index], '<h2 id="' . $slug . '">' . $header . '</h2>', $body);
}
}
return $this->render('blog/show.html.twig', [
'body_text' => $body,
'contents' => $contents,
'blog' => $blog,
'categorys' => $this->getParameter('blog'),
'blogs' => $this->em->getRepository(Blog::class)->getSimilarBlog($blog->getId(), $blog->getCategory()),
]);
}
throw $this->createNotFoundException('404');
}
/**
* @Route("/admin/blog/{id}/edit", name="blog_edit", methods={"GET","POST"})
*/
public function edit(Request $request, Blog $blog, FileUploader $fileUploader, PathEntity $pathEntity): Response
{
$form = $this->createForm(BlogType::class, $blog);
$form->handleRequest($request);
$error = [];
if ($form->isSubmitted() && $form->isValid()) {
$blog->setUpdated(time());
$Preview = $form->get('preview')->getData();
if ($Preview) {
$PreviewFileName = $fileUploader->upload($Preview, 'file/blog');
if($blog->getPreview() && file_exists($blog->getPreview())) $fileUploader->delete($blog->getPreview());
$blog->setPreview($PreviewFileName);
} elseif(!$blog->getPreview()){
$error[] = 'Не заполнено превью';
}
$Image = $form->get('image')->getData();
if ($Image) {
$ImageFileName = $fileUploader->upload($Image, 'file/blog');
if($blog->getImage() && file_exists($blog->getImage())) $fileUploader->delete($blog->getImage());
$blog->setImage($ImageFileName);
} elseif(!$blog->getImage()){
$error[] = 'Не заполнена картинка блога';
}
if(empty($error)) {
$this->em->flush();
$pathEntity->setPath($blog);
return $this->redirectToRoute('admin_blog_index');
}
}
return $this->render('admin/blog/edit.html.twig', [
'blog' => $blog,
'errors' => $error,
'form' => $form->createView(),
]);
}
/**
* @Route("/admin/blog/{id}", priority=11, name="blog_delete", methods={"DELETE"})
*/
public function delete(Request $request, Blog $blog): Response
{
if ($this->isCsrfTokenValid('delete'.$blog->getId(), $request->request->get('_token'))) {
$this->em->remove($blog);
$this->em->flush();
}
return $this->redirectToRoute('admin_blog_index');
}
}