src/Controller/BlogController.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Blog;
  4. use App\Form\BlogType;
  5. use App\Service\FileUploader;
  6. use App\Service\MetaTags\MetaTags;
  7. use App\Service\Path\Classes\PathEntity;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Knp\Component\Pager\PaginatorInterface;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  12. use Symfony\Component\Form\Extension\Core\Type\TextType;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. class BlogController extends AbstractController
  17. {
  18.     private $em;
  19.     
  20.     public function __construct(EntityManagerInterface $em)
  21.     {
  22.         $this->em $em;
  23.     }
  24.     /**
  25.      * @Route("/blog", priority=2, name="blog_index", methods={"GET"})
  26.      */
  27.     public function index(Request $requestPaginatorInterface $paginatorMetaTags $metaTags)
  28.     {
  29.         $Blogs $this->em->getRepository(Blog::class)->createQueryBuilder('b')->andWhere('b.status = 1')->orderBy('b.updated''DESC');
  30.         if($request->get('cat')){
  31.             $Blogs->andWhere('b.category = :cat')
  32.                 ->setParameter('cat'$request->get('cat'));
  33.         }
  34.         $page = (!empty($request->query->getInt('page'1)))?$request->query->getInt('page'1):1;
  35.         $pagination $paginator->paginate(
  36.             $Blogs->getQuery(), $page9);
  37.         return $this->render('blog/index.html.twig', [
  38.             'blogs' => $pagination,
  39.             'categorys' => $this->getParameter('blog'),
  40.             'metaTags' => $metaTags->getBlogs(),
  41.         ]);
  42.     }
  43.     /**
  44.      * @Route("/admin/blog", name="admin_blog_index", methods={"GET"})
  45.      */
  46.     public function admin_index(Request $requestPaginatorInterface $paginator)
  47.     {
  48.         $Blogs $this->em->getRepository(Blog::class)->createQueryBuilder('b')->orderBy('b.updated''DESC');
  49.         $categorys $this->getParameter('blog');
  50.         $defaultData = array('name' => '');
  51.         $form $this->createFormBuilder($defaultData, ['csrf_protection' => false])
  52.             ->add('name'TextType::class, [
  53.                 'required' => false,
  54.                 'label' => 'Название блога',
  55.             ])
  56.             ->add('category'ChoiceType::class, [
  57.                 'required' => false,
  58.                 'label' => 'Категория',
  59.                 'choices' => array_flip($categorys['category']),
  60.             ])
  61.             ->setMethod('GET')
  62.             ->getForm();
  63.         if ($request->getMethod() == 'GET') {
  64.             $form->handleRequest($request);
  65.             $data $form->getData();
  66.         }
  67.         if(!empty($data['name'])){
  68.             $Blogs->andWhere('b.name LIKE :name')
  69.                 ->setParameter('name''%'.$data['name'].'%');
  70.         }
  71.         if(!empty($data['category'])){
  72.             $Blogs->andWhere('b.category = :category')
  73.                 ->setParameter('category'$data['category']);
  74.         }
  75.         $pagination $paginator->paginate(
  76.             $Blogs->getQuery(), $request->query->getInt('page'1), 25);
  77.         $pagination->setTemplate('@KnpPaginator/Pagination/twitter_bootstrap_v4_pagination.html.twig');
  78.         return $this->render('admin/blog/index.html.twig', [
  79.             'pagination' => $pagination,
  80.             'form' => $form->createView(),
  81.         ]);
  82.     }
  83.     /**
  84.      * @Route("/admin/blog/new", name="blog_new", methods={"GET","POST"})
  85.      */
  86.     public function new(Request $requestFileUploader $fileUploaderPathEntity $pathEntity): Response
  87.     {
  88.         $blog = new Blog();
  89.         $blog->setUser($this->getUser());
  90.         $form $this->createForm(BlogType::class, $blog);
  91.         $form->handleRequest($request);
  92.         $error = [];
  93.         if ($form->isSubmitted() && $form->isValid()) {
  94.             $blog->setCreated(time());
  95.             $blog->setUpdated(time());
  96.             $Preview $form->get('preview')->getData();
  97.             if ($Preview) {
  98.                 $PreviewFileName $fileUploader->upload($Preview'file/blog');
  99.                 $blog->setPreview($PreviewFileName);
  100.             } else{
  101.                 $error[] = 'Не заполнено превью';
  102.             }
  103.             $Image $form->get('image')->getData();
  104.             if ($Image) {
  105.                 $ImageFileName $fileUploader->upload($Image'file/blog');
  106.                 $blog->setImage($ImageFileName);
  107.             } else{
  108.                 $error[] = 'Не заполнена картинка блога';
  109.             }
  110.             if(empty($error)) {
  111.                 $this->em->persist($blog);
  112.                 $this->em->flush();
  113.                 $pathEntity->setPath($blog);
  114.                 return $this->redirectToRoute('admin_blog_index');
  115.             }
  116.         }
  117.         return $this->render('admin/blog/new.html.twig', [
  118.             'blog' => $blog,
  119.             'errors' => $error,
  120.             'form' => $form->createView(),
  121.         ]);
  122.     }
  123.     public function show(Blog $blog): Response
  124.     {
  125.         if($blog->getStatus()) {
  126.             $body '';
  127.             $adv '<div class="row grafik-block">
  128.                 <div class="col-lg-6 col-md-12 item mb-30">
  129.                     <a id="authors-rinc" href="/rinc?utm_source=blog">
  130.                         <img src="/images/rinc_img_bige.jpg" alt="">
  131.                     </a>
  132.                 </div>
  133.                 <div class="col-lg-6 col-md-12 item">
  134.                     <a id="authors-vak" href="/vak?utm_source=blog">
  135.                         <img src="/images/vak_img_bige.jpg" alt="">
  136.                     </a>
  137.                 </div>
  138.             </div>';
  139.             $content_avds explode('</p>'$blog->getBody());
  140.             if(count($content_avds) > 1){
  141.                 foreach ($content_avds as $key =>$content_avd){
  142.                     $body .= $content_avd;
  143.                     if($key == 1$body .= $adv;
  144.                 }
  145.             } else{
  146.                 $body .= $blog->getBody().$adv;
  147.             }
  148.             // Функция поиска и генерации содержимого по заголовкам h2
  149.             preg_match_all('/<h2[^>]*>(.*?)<\/h2>/i'$body$matches);
  150.             $contents = [];
  151.             if(!empty($matches[1])) {
  152.                 foreach ($matches[1] as $index => $header) {
  153.                     $slug 'block-' $index// Создание уникального якоря
  154.                     $contents[] = ['slug' => $slug'title' => trim(html_entity_decode(strip_tags($header)))];
  155.                     // Замена заголовка в тексте на заголовок с якорем
  156.                     $body str_replace($matches[0][$index], '<h2 id="' $slug '">' $header '</h2>'$body);
  157.                 }
  158.             }
  159.             return $this->render('blog/show.html.twig', [
  160.                 'body_text' => $body,
  161.                 'contents' => $contents,
  162.                 'blog' => $blog,
  163.                 'categorys' => $this->getParameter('blog'),
  164.                 'blogs' => $this->em->getRepository(Blog::class)->getSimilarBlog($blog->getId(), $blog->getCategory()),
  165.             ]);
  166.         }
  167.         throw $this->createNotFoundException('404');
  168.     }
  169.     /**
  170.      * @Route("/admin/blog/{id}/edit", name="blog_edit", methods={"GET","POST"})
  171.      */
  172.     public function edit(Request $requestBlog $blogFileUploader $fileUploaderPathEntity $pathEntity): Response
  173.     {
  174.         $form $this->createForm(BlogType::class, $blog);
  175.         $form->handleRequest($request);
  176.         $error = [];
  177.         if ($form->isSubmitted() && $form->isValid()) {
  178.             $blog->setUpdated(time());
  179.             $Preview $form->get('preview')->getData();
  180.             if ($Preview) {
  181.                 $PreviewFileName $fileUploader->upload($Preview'file/blog');
  182.                 if($blog->getPreview() && file_exists($blog->getPreview())) $fileUploader->delete($blog->getPreview());
  183.                 $blog->setPreview($PreviewFileName);
  184.             } elseif(!$blog->getPreview()){
  185.                 $error[] = 'Не заполнено превью';
  186.             }
  187.             $Image $form->get('image')->getData();
  188.             if ($Image) {
  189.                 $ImageFileName $fileUploader->upload($Image'file/blog');
  190.                 if($blog->getImage() && file_exists($blog->getImage())) $fileUploader->delete($blog->getImage());
  191.                 $blog->setImage($ImageFileName);
  192.             } elseif(!$blog->getImage()){
  193.                 $error[] = 'Не заполнена картинка блога';
  194.             }
  195.             if(empty($error)) {
  196.                 $this->em->flush();
  197.                 $pathEntity->setPath($blog);
  198.                 return $this->redirectToRoute('admin_blog_index');
  199.             }
  200.         }
  201.         return $this->render('admin/blog/edit.html.twig', [
  202.             'blog' => $blog,
  203.             'errors' => $error,
  204.             'form' => $form->createView(),
  205.         ]);
  206.     }
  207.     /**
  208.      * @Route("/admin/blog/{id}", priority=11, name="blog_delete", methods={"DELETE"})
  209.      */
  210.     public function delete(Request $requestBlog $blog): Response
  211.     {
  212.         if ($this->isCsrfTokenValid('delete'.$blog->getId(), $request->request->get('_token'))) {
  213.             $this->em->remove($blog);
  214.             $this->em->flush();
  215.         }
  216.         return $this->redirectToRoute('admin_blog_index');
  217.     }
  218. }