src/Package/Openform/Front/Controller/SitemapController.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\Package\Openform\Front\Controller;
  3. use Doctrine\ORM\EntityManager;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use App\Package\Openform\Front\Controller\BaseController;
  10. use App\Package\Toolkit\RouteLocalizer\RouteLocalizer;
  11. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  12. use Symfony\Component\Intl\Locales;
  13. use App\Package\Openform\Tools\FrontUtil\FrontUtil;
  14. /**
  15.  * Description of SitemapController
  16.  *
  17.  * @author ostol
  18.  */
  19. class SitemapController extends BaseController {
  20.     protected $routeLocalizer;
  21.     private $em;
  22.     private $frontUtil;
  23.     public function __construct(RequestStack $requestRouteLocalizer $routeLocalizerEntityManagerInterface $emFrontUtil $frontUtil) {
  24.         parent::__construct($request$routeLocalizer$em);
  25.         $this->em $em;
  26.         $this->routeLocalizer $routeLocalizer;
  27.         $this->frontUtil $frontUtil;
  28.     }
  29.     public function indexAction(Request $request) {
  30.         $locale $request->getLocale();
  31.         $entity $this->getPageByIdName('page_sitemap'$locale);
  32.         if (!$entity) {
  33.             throw new NotFoundHttpException();
  34.         }
  35.         return $this->render('@openform_front_templates/Sitemap/index.html.twig', [
  36.                     'entity' => $entity,
  37.                     'sitemap' => $this->getSitemap($localenull'▪'),
  38.         ]);
  39.     }
  40.     private function getSitemap($lang$parentId$bullet) {
  41.         $pages $this->getPagesByParentId($lang$parentId);
  42.         $sitemap = [];
  43.         if (empty($pages)) {
  44.             return $sitemap;
  45.         }
  46.         foreach ($pages as $page) {
  47.             $pageTrans $page->getTranslation()[$lang];
  48.             if ($page->getIdname()) {
  49.                 $route $this->removePagePrefix($page->getIdname());
  50.                 $url $this->frontUtil->pageUrlByIdName($route$lang);
  51.             } else {
  52.                 if (!$pageTrans->getSlug() || $pageTrans->getSlug() == '') {
  53.                     continue;
  54.                 }
  55.                 $url $this->routeLocalizer->generate('page', ['slug' => $pageTrans->getSlug()], $pageTrans->getLang());
  56.             }
  57.             $children $this->getSitemap($lang$page->getId(), '•');
  58.             $arr = [
  59.                 'url' => $url,
  60.                 'bullet' => $bullet,
  61.                 'title' => $pageTrans->getTitle(),
  62.                 'metaTitle' => $pageTrans->getMetaTitle(),
  63.                 'children' => $children,
  64.             ];
  65.             if ($page->getIdname()) {
  66.                 if ($page->getIdname() == 'page_museums') {
  67.                     $arr['children'] = array_merge($arr['children'], $this->getChildren('mak_item''Museum'$lang)) ;
  68.                 }
  69.             
  70.                 if ($page->getIdname() == 'page_archives') {
  71.                     $arr['children'] = array_merge($arr['children'], $this->getChildren('mak_item''Archive'$lang));
  72.                 }
  73.             
  74.                 if ($page->getIdname() == 'page_private_collections') {
  75.                     $arr['children'] = array_merge($arr['children'], $this->getChildren('mak_item''PrivateCollection'$lang));
  76.                 }
  77.             
  78.                 if ($page->getIdname() == 'page_exhibitions') {
  79.                     $arr['children'] = array_merge($arr['children'], $this->getChildren('exhibition_item''Exhibition'$lang));
  80.                 }
  81.                 if ($page->getIdname() == 'page_proposal') {
  82.                     $arr['children'] = array_merge($arr['children'], $this->getChildren('proposal_item''Proposal'$lang));
  83.                 }
  84.                 
  85.                 if ($page->getIdname() == 'page_news') {
  86.                     $arr['children'] = array_merge($arr['children'], $this->getChildren('news_item''News'$lang));
  87.                 }
  88.                 if ($page->getIdname() == 'page_mission') {
  89.                     $arr['children'] = array_merge($arr['children'], $this->getChildren('mission_item''Mission'$lang));
  90.                 }
  91.             }
  92.             $sitemap[] = $arr;
  93.         }
  94.         return $sitemap;
  95.     }
  96.     private function getChildren($route$entityName$lang
  97.     {
  98.         $items $this->em->getRepository('\App\Package\Openform\Entity\\' $entityName)
  99.                 ->createQueryBuilder('m')
  100.                 ->select('m, t')
  101.                 ->leftJoin('m.Translation''t')
  102.                 ->andWhere('m.stat = 1')
  103.                 ->andWhere('t.title IS NOT NULL AND t.title <> \'\' AND t.lang = :lang')
  104.                 ->setParameter('lang'$lang)
  105.                 ->getQuery()
  106.                 ->getResult();
  107.         $childrenEntries = [];
  108.         foreach ($items as $item) {
  109.             
  110.             $trans $item->getTranslation()[$lang];
  111.             
  112.             if (!$trans->getSlug() || $trans->getSlug() == '') {
  113.                 continue;
  114.             }
  115.             
  116.             $row = [
  117.                 'bullet' => method_exists($item'getDepartments') || method_exists($item'getExhibitionDepartment') ? '▪' '•',
  118.                 'url' => $this->routeLocalizer->generate($route, ['slug' => $trans->getSlug(),  'makSlug' => isset($item->isMak) ? $item->getMakSlug($lang) : null, ], $lang),
  119.                 'title' => $trans->getTitle(),
  120.                 'metaTitle' => $trans->getMetaTitle(),
  121.                 'children' => [],
  122.             ];
  123.             
  124.             if (method_exists($item'getMenuPage')) {
  125.                 $row['children'] = array_merge($row['children'], $this->getMenuPages($lang$item->getId(), null$item->getMakSlug($lang), $entityName));
  126.             }
  127.             if (method_exists($item'getDepartments')) {
  128.                 $row['children'] = array_merge($row['children'], $this->getDepartments($lang$item->getId(), null$item->getMakSlug($lang), $entityName));
  129.             }
  130.             if (method_exists($item'getExhibitionDepartment')) {
  131.                 $row['children'] = array_merge($row['children'], $this->getDepartments($lang$item->getId(), null$item->getMakSlug($lang), $entityName));
  132.             }
  133.             $childrenEntries[] = $row;
  134.         }
  135.         return $childrenEntries;
  136.     }
  137.     private function getMenuPages($lang$makId$parentId$makSlug$entityName
  138.     {
  139.         $qb $this->em->getRepository('\App\Package\Openform\Entity\MenuPage')
  140.                 ->createQueryBuilder('e')
  141.                 ->select('e, t')
  142.                 ->leftJoin('e.Translation''t')
  143.                 ->andWhere('e.stat = 1')
  144.                 ->andWhere('t.title IS NOT NULL AND t.title <> \'\' AND t.lang = :lang')
  145.                 ->setParameter('lang'$lang);
  146.         if ($makId) {
  147.             $qb->andWhere('e.'.$entityName.' = :makId');
  148.             $qb->setParameter('makId'$makId);
  149.             
  150.         } else if ($parentId) {
  151.             $qb->andWhere('e.Parent = :parentId');
  152.             $qb->setParameter('parentId'$parentId);
  153.         } else {
  154.             $qb->andWhere('e.Parent'.$entityName.'Department IS NULL');
  155.         }
  156.         $entities $qb->getQuery()->getResult();
  157.         $result = [];
  158.         foreach ($entities as $entity) {
  159.             $entityTrans $entity->getTranslation()[$lang];
  160.             $entry = [
  161.                 'url' => $this->routeLocalizer->generate('menu_page', ['slug' => $entityTrans->getSlug(), 'makSlug' => $entity->getMakSlug($lang), 'rootParentSlug' => $entity->getRootParentSlug($lang)], $entityTrans->getLang()),
  162.                 'bullet' => '•',
  163.                 'title' => $entityTrans->getTitle(),
  164.                 'metaTitle' => $entityTrans->getMetaTitle(),
  165.                 'children' => [],
  166.             ];            
  167.             $entry['children'] = array_merge($entry['children'], $this->getMenuPages($langfalse$entity->getId(), $makSlug$entityName));
  168.             
  169.             $result[] = $entry;
  170.         }
  171.         return $result;
  172.     }
  173.     
  174.     private function getDepartments($lang$makId$parentId$makSlug$entityName
  175.     {
  176.         $qb $this->em->getRepository('\App\Package\Openform\Entity\\'.$entityName.'Department')
  177.                 ->createQueryBuilder('e')
  178.                 ->select('e, t')
  179.                 ->leftJoin('e.Translation''t')
  180.                 ->andWhere('e.stat = 1')
  181.                 ->andWhere('t.title IS NOT NULL AND t.title <> \'\' AND t.lang = :lang')
  182.                 ->setParameter('lang'$lang);
  183.         if ($makId) {
  184.             $qb->andWhere('e.'.$entityName.' = :makId');
  185.             $qb->setParameter('makId'$makId);
  186.             
  187.         } else if ($parentId) {
  188.             $qb->andWhere('e.Parent'.$entityName.'Department = :parentId');
  189.             $qb->setParameter('parentId'$parentId);
  190.         } else {
  191.             $qb->andWhere('e.Parent'.$entityName.'Department IS NULL');
  192.         }
  193.         $entities $qb->getQuery()->getResult();
  194.         $result = [];
  195.         foreach ($entities as $entity) {
  196.             $entityTrans $entity->getTranslation()[$lang];
  197.             if ($entityName == 'Exhibition') {
  198.                 $url $this->routeLocalizer->generate('exhibition_department_item', ['slug' => $entityTrans->getSlug()], $entityTrans->getLang());
  199.             } else {
  200.                 $url $this->routeLocalizer->generate('mak_department_item', ['slug' => $entityTrans->getSlug(), 'makSlug' => $makSlug], $entityTrans->getLang());
  201.             }
  202.             $entry = [
  203.                 'url' => $url,
  204.                 'bullet' => '•',
  205.                 'title' => $entityTrans->getTitle(),
  206.                 'metaTitle' => $entityTrans->getMetaTitle(),
  207.                 'children' => [],
  208.             ];
  209.             
  210.             $entry['children'] = array_merge($entry['children'], $this->getDepartments($langfalse$entity->getId(), $makSlug$entityName));
  211.             $entry['children'] = array_merge($entry['children'], $this->getAntiqueSuits($lang$entity->getId(), $entityName));
  212.             $entry['children'] = array_merge($entry['children'], $this->getRelictPacks($lang$entity->getId(), $entityName));
  213.             
  214.             $result[] = $entry;
  215.         }
  216.         return $result;
  217.     }
  218.   
  219.     private function getAntiqueSuits($lang$parentId$parentEntityName
  220.     {
  221.         $parentEntityPath '\App\Package\Openform\Entity\\'.$parentEntityName.'Department';
  222.         
  223.         if (!method_exists($parentEntityPath'getAntiqueSuit')) {
  224.             return [];
  225.         }
  226.         
  227.         $qb $this->em->getRepository('\App\Package\Openform\Entity\\AntiqueSuit')
  228.             ->createQueryBuilder('e')
  229.             ->select('e, t, a, at')
  230.             ->leftJoin('e.Translation''t')
  231.             ->leftJoin('e.Antique''a')
  232.             ->leftJoin('a.Translation''at')
  233.             ->andWhere('e.stat = 1')
  234.             ->andWhere('t.title IS NOT NULL AND t.title <> \'\' AND t.lang = :lang')
  235.             ->andWhere('at.title IS NOT NULL AND at.title <> \'\' AND at.lang = :lang')
  236.             ->andWhere('e.'.$parentEntityName.'Department = :parentId'
  237.             ->setParameter('lang'$lang)
  238.             ->setParameter('parentId'$parentId);
  239.         $antiqueSuits $qb->getQuery()->getResult();
  240.         $antiqueSuitEntries = [];
  241.         foreach ($antiqueSuits as $antiqueSuit) {
  242.             $antiqueEntries = [];
  243.             foreach ($antiqueSuit->getAntique() as $antique) {
  244.                 $antiqueTrans $antique->getTranslation()[$lang];
  245.                 $antiqueEntries[] = [
  246.                     'url' => $this->routeLocalizer->generate('antique_item', ['slug' => $antiqueTrans->getSlug()], $antiqueTrans->getLang()),
  247.                     'bullet' => '-',
  248.                     'title' => $antiqueTrans->getTitle(),
  249.                     'metaTitle' => $antiqueTrans->getMetaTitle(),
  250.                     'children' => [],
  251.                 ];
  252.             }
  253.             $entityTrans $antiqueSuit->getTranslation()[$lang];
  254.             $antiqueSuitEntries[] = [
  255.                 'url' => $this->routeLocalizer->generate('antique_suit_item', ['slug' => $entityTrans->getSlug()], $entityTrans->getLang()),
  256.                 'bullet' => '•',
  257.                 'title' => $entityTrans->getTitle(),
  258.                 'metaTitle' => $entityTrans->getMetaTitle(),
  259.                 'children' => $antiqueEntries
  260.             ];
  261.         }
  262.         return $antiqueSuitEntries;
  263.     }
  264.     private function getRelictPacks($lang$parentId$parentEntityName
  265.     {
  266.         $parentEntityPath '\App\Package\Openform\Entity\\'.$parentEntityName.'Department';
  267.         
  268.         if (!method_exists($parentEntityPath'getRelictPack')) {
  269.             return [];
  270.         }
  271.         
  272.         $qb $this->em->getRepository('\App\Package\Openform\Entity\\RelictPack')
  273.             ->createQueryBuilder('e')
  274.             ->select('e, t, a, at')
  275.             ->leftJoin('e.Translation''t')
  276.             ->leftJoin('e.Relict''a')
  277.             ->leftJoin('a.Translation''at')
  278.             ->andWhere('e.stat = 1')
  279.             ->andWhere('t.title IS NOT NULL AND t.title <> \'\' AND t.lang = :lang')
  280.             ->andWhere('at.title IS NOT NULL AND at.title <> \'\' AND at.lang = :lang')
  281.             ->andWhere('e.Parent = :parentId')
  282.             ->setParameter('lang'$lang)
  283.             ->setParameter('parentId'$parentId);
  284.         $relictPacks $qb->getQuery()->getResult();
  285.         $relictPackEntries = [];
  286.         foreach ($relictPacks as $relictPack) {
  287.             
  288.             $relictEntries = [];
  289.             foreach ($relictPack->getRelict() as $relict) {
  290.                 $relictTrans $relict->getTranslation()[$lang];
  291.                 $relictEntries[] = [
  292.                     'url' => $this->routeLocalizer->generate('relict_item', ['slug' => $relictTrans->getSlug()], $relictTrans->getLang()),
  293.                     'bullet' => '-',
  294.                     'title' => $relictTrans->getTitle(),
  295.                     'metaTitle' => $relictTrans->getMetaTitle(),
  296.                     'children' => [],
  297.                 ];
  298.             }
  299.             $relictPackTrans $relictPack->getTranslation()[$lang];
  300.             $relictPackEntries[] = [
  301.                 'url' => $this->routeLocalizer->generate('relict_pack_item', ['slug' => $relictPackTrans->getSlug()], $relictPackTrans->getLang()),
  302.                 'bullet' => '•',
  303.                 'title' => $relictPackTrans->getTitle(),
  304.                 'metaTitle' => $relictPackTrans->getMetaTitle(),
  305.                 'children' => $relictEntries
  306.             ];
  307.         }
  308.         return $relictPackEntries;
  309.     }
  310.     private function getPagesByParentId($locale$parentId null
  311.     {
  312.         $params = [
  313.             'lang' => $locale,
  314.         ];
  315.         $qb $this->em->getRepository(\App\Package\Openform\Entity\Page::class)->createQueryBuilder('e')
  316.                 ->select('e, t')
  317.                 ->leftJoin('e.Translation''t')
  318.                 ->andWhere('e.stat = 1')
  319.                 ->andWhere('t.title IS NOT NULL AND t.title <> \'\' AND t.lang = :lang');
  320.         if ($parentId) {
  321.             $qb->andWhere('e.parentId = :parentId');
  322.             $params['parentId'] = $parentId;
  323.         } else {
  324.             $qb->andWhere('e.parentId IS NULL');
  325.         }
  326.         $qb->setParameters($params);
  327.         $qb->addOrderBy('e.ord''DESC');
  328.         return $qb->getQuery()->getResult();
  329.     }
  330.     function removePagePrefix($inputString
  331.     {
  332.         if (substr($inputString06) === 'page_') {
  333.             return substr($inputString6);
  334.         } else {
  335.             return $inputString;
  336.         }
  337.     }
  338. }