src/Felix/IndexBundle/Controller/IndexController.php line 39

Open in your IDE?
  1. <?php
  2. namespace Felix\IndexBundle\Controller;
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  6. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  7. use Felix\IndexBundle\IndexBundle;
  8. /**
  9.  * Index controller.
  10.  *
  11.  */
  12. class IndexController extends Controller
  13. {
  14.     protected $_namespace;
  15.     
  16.     /**
  17.      * Site courant
  18.      *
  19.      */
  20.     private static $__site;
  21.     
  22.     
  23.     /**
  24.      * Page courante
  25.      *
  26.      */
  27.     private static $__page;
  28.       
  29.     /**
  30.      * @Route("/", name="index_home", schemes={"%protocol%"})
  31.      * @Route("/{pageCode}", name="index_domain", schemes={"%protocol%"})
  32.      * @Route("/{siteCode}/{pageCode}", name="index", options={"expose"=true}, schemes={"%protocol%"})
  33.      * @Route("/{pageCode}/post/{code}", schemes={"%protocol%"})
  34.      * @Route("/{siteCode}/{pageCode}/post/{code}", schemes={"%protocol%"})
  35.      */
  36.     public function indexAction(Request $request)
  37.     {               
  38.         $em $this->getDoctrine()->getManager();
  39.         //On récupère le site
  40.         $site $this->getDoctrine()->getRepository('CoreBundle:Site')->findById($request->getSession()->get('site'));
  41.         //Récupération de la page
  42.         $page $home $this->getDoctrine()->getRepository('CoreBundle:Page')->findDefaultPage($site);
  43.         if ($request->get('pageCode') != null) {
  44.             $page $this->getDoctrine()->getRepository('CoreBundle:Page')->findByCodeAndSite($request->get('pageCode'), $site);
  45.         }
  46.         //Si pas de page (ou page non publié)
  47.         $template null;
  48.         $loadContent true;
  49.         if ($page == null || ($page->getOnline() == && !$request->get('preview'))) {
  50.             $page  $this->getDoctrine()->getRepository('CoreBundle:Page')->findByCodeAndSite('404'$site);
  51.             if ($page == null) {
  52.                 $page  $this->getDoctrine()->getRepository('CoreBundle:Page')->findDefaultPage($site);
  53.                 $template 'IndexBundle::front/404.html.twig';
  54.             }
  55.             $loadContent false;
  56.         } else {
  57.             //gestion des acces front
  58.             $autorisation true;
  59.             if (count($page->getGroupsFront()) > ) {
  60.                 if($this->getUser() == null){
  61.                     $autorisation false;
  62.                 } else if (!in_array('ROLE_SUPER_ADMIN'$this->getUser()->getRoles()) && !in_array('ROLE_ADMIN'$this->getUser()->getRoles())){
  63.                     $autorisation false;
  64.                     foreach ($page->getGroupsFront() as $groupFront){
  65.                         foreach ($this->getUser()->getGroups() as $group){
  66.                             if($group->getId() == $groupFront->getId()){
  67.                                 $autorisation true;
  68.                             }
  69.                         }
  70.                     }
  71.                 }
  72.             }
  73.             //le template
  74.             if($autorisation == false){
  75.                 $template 'IndexBundle::front/login.html.twig';
  76.                 $loadContent false;
  77.             }
  78.         }
  79.         //Si c'est une page fictive qui ne sert qu'à l'arborescence
  80.         if ($page->getPageArbo()) {
  81.             if (count($page->getChildren()) > 0) {
  82.                 $page $page->getChildren()->first();
  83.             } else {
  84.                 $page  $this->getDoctrine()->getRepository('CoreBundle:Page')->findDefaultPage($site);
  85.             }
  86.             return $this->redirectToRoute('index', array('siteCode' => $site->getSiteCode(), 'pageCode' => $page->getPageCode()));
  87.         }
  88.         self::setSite($site);
  89.         self::setPage($page);
  90.         $layout $site->getLayout();
  91.         if ($page->getLayout()) {
  92.             $layout $page->getLayout();
  93.         }
  94.         if ($template == null) {
  95.             $template 'IndexBundle::front/' $layout->getLayoutCode().'/templates/'.$page->getTemplate()->getTemplateCode().'.html.twig';
  96.         }
  97.         //inclusion css layout/templates
  98.         $cssLayout 'css/' $layout->getLayoutCode() . '.css';
  99.         $cssTemplate 'css/' $layout->getLayoutCode() . '/templates/' $page->getTemplate()->getTemplateCode() . '.css';
  100.         //Gestion des balises dans le SEO et des actions
  101.         $actions = array();
  102.         $keywords = array();
  103.         $balises = array();
  104.         $seo $page->getSeo();
  105.         if ($seo) {
  106.             if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/"$seo->getMetaTitle(), $results)) {
  107.                 $balises array_merge($balises$results[1]);
  108.             }
  109.             if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/"$seo->getMetaDescription(), $results)) {
  110.                 $balises array_merge($balises$results[1]);
  111.             }
  112.             if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/"$seo->getMetaOgTitle(), $results)) {
  113.                 $balises array_merge($balises$results[1]);
  114.             }
  115.             if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/"$seo->getMetaOgDescription(), $results)) {
  116.                 $balises array_merge($balises$results[1]);
  117.             }
  118.         }
  119.         if ($loadContent) {
  120.             foreach ($page->getZones() as $zone){
  121.                 foreach ($zone->getCols() as $col){
  122.                     foreach ($col->getBlocks() as $block){
  123.                         //On parcourt les blocks action, pour lancer les redirections si il y a
  124.                         if ($block->getBlockType()->getTypeCode() == 'action') {
  125.                             $action $block->getAction();
  126.                             $params = array('request' => $request);
  127.                             $url $action->getActionBundle() . ':Front:' $action->getActionCode();
  128.                             $filter '';
  129.                             if ($block->getActionFilter()) {
  130.                                 $params['filter'] = $block->getActionFilter();
  131.                                 $filter $block->getActionFilter();
  132.                             }
  133.                             $actionResponse $this->forward($url$params$request->query->all());
  134.                             if ($actionResponse->isRedirection()) {
  135.                                 return $actionResponse;
  136.                             } elseif ($actionResponse->isClientError()) {
  137.                                 $template 'IndexBundle::front/404.html.twig';
  138.                                 break 3;
  139.                             } else {
  140.                                 $actions[$url ':' $filter] = $actionResponse->getContent();
  141.                             }
  142.                             // On enregistre les balises des fiches pour le SEO, si la fiche existe
  143.                             if (!empty($actionResponse->getContent()) && $action->getActionView()) {
  144.                                 $entity $action->getActionBundle() . ':' $action->getActionEntity();
  145.                                 $metadataEntity $em->getClassMetadata($entity);
  146.                                 $fields $metadataEntity->getFieldNames();
  147.                                 //On ajoute les champs si il y a une table de traduction I18n
  148.                                 $fullEntityName $metadataEntity->getName();
  149.                                 $entityI18n $fullEntityName 'I18n';
  150.                                 if (class_exists($entityI18n)) {
  151.                                     $entityI18nFields $em->getClassMetadata($entityI18n)->getFieldNames();
  152.                                     foreach ($entityI18nFields as $subEntityI18nKey => $entityI18nField) {
  153.                                         $fields[] = $entityI18nField;
  154.                                     }
  155.                                 }
  156.                                 //On ajoute les méthodes qui commence par getSeo en tant que champs
  157.                                 $classMethod get_class_methods($metadataEntity->getName());
  158.                                 foreach ($classMethod as $method) {
  159.                                     if (strpos($method'getSeo') !== false && $method !== 'getSeo') {
  160.                                         $str str_replace('getSeo''seo'$method);
  161.                                         $fields[] = $str;
  162.                                     }
  163.                                 }
  164.                                 $object $this->getDoctrine()->getRepository($entity)->findByCode($request->get('code'));
  165.                                 foreach ($fields as $field) {
  166.                                     if (!in_array($field$balises)) {
  167.                                         continue;
  168.                                     }
  169.                                     $methodGet 'get'.ucfirst($field);
  170.                                     if (method_exists($object$methodGet)) {
  171.                                         $value $object->{$methodGet}();
  172.                                         $value self::__formatFieldValue($entity$field$value);
  173.                                     } elseif (strpos($field'I18n')) {
  174.                                         if (method_exists($object'getTraduction')) {
  175.                                             $value $object->getTraduction();
  176.                                             $value $value->{$methodGet}();
  177.                                             $value self::__formatFieldValue($entity$field$value);
  178.                                         }
  179.                                     }
  180.                                     $keywords[$field] = $value;
  181.                                 }
  182.                                 $fieldsMapping $metadataEntity->getAssociationNames();
  183.                                 foreach ($fieldsMapping as $field) {
  184.                                     if ($field == "i18n") {
  185.                                         continue;
  186.                                     }
  187.                                     foreach ($balises as $balise) {
  188.                                         if (strpos($balise'.')) {
  189.                                             $balisePart explode('.'$balise);
  190.                                             if ($balisePart[0] == $field) {
  191.                                                 $methodGet 'get'.ucfirst($field);
  192.                                                 if (method_exists($object$methodGet)) {
  193.                                                     $relation $object->{$methodGet}();
  194.                                                     $methodRelationGet 'get' ucfirst($balisePart[1]);
  195.                                                     $subEntity $metadataEntity->getAssociationTargetClass($field);
  196.                                                     $value '';
  197.                                                     if (is_a($relation'Doctrine\ORM\PersistentCollection')) {
  198.                                                         $multipleValue = array();
  199.                                                         foreach ($relation as $item) {
  200.                                                             if (method_exists($item$methodRelationGet)) {
  201.                                                                 $tmpValue $item->{$methodRelationGet}();
  202.                                                                 $tmpValue self::__formatFieldValue($subEntity$balisePart[1], $tmpValue);
  203.                                                                 $multipleValue[] = $tmpValue;
  204.                                                             } elseif (strpos($balisePart[1], 'I18n')) {
  205.                                                                 if (method_exists($item'getTraduction')) {
  206.                                                                     $tmpValue $item->getTraduction();
  207.                                                                     $tmpValue $tmpValue->{$methodRelationGet}();
  208.                                                                     $tmpValue self::__formatFieldValue($subEntity$balisePart[1], $tmpValue);
  209.                                                                     $multipleValue[] = $tmpValue;
  210.                                                                 }
  211.                                                             }
  212.                                                         }
  213.                                                         $value implode(', '$multipleValue);
  214.                                                     } else {
  215.                                                         if (method_exists($relation$methodRelationGet)) {
  216.                                                             $value $relation->{$methodRelationGet}();
  217.                                                             $value self::__formatFieldValue($subEntity$balisePart[1], $value);
  218.                                                         } elseif (strpos($balisePart[1], 'I18n')) {
  219.                                                             if (method_exists($relation'getTraduction')) {
  220.                                                                 $value $relation->getTraduction();
  221.                                                                 $value $value->{$methodRelationGet}();
  222.                                                                 $value self::__formatFieldValue($subEntity$balisePart[1], $value);
  223.                                                             }
  224.                                                         }
  225.                                                     }
  226.                                                     $keywords[$balise] = $value;
  227.                                                 }
  228.                                             }
  229.                                         }
  230.                                     }
  231.                                 }
  232.                             }
  233.                         }
  234.                     }
  235.                 }
  236.             }
  237.         }
  238.         $seoBalises = array();
  239.         $seoBalises['title'] = $seoBalises['ogTitle'] = $page->getPageName();
  240.         $seoBalises['description'] = $seoBalises['ogDescription'] = NULL;
  241.         $seoBalises['canonical'] = $seoBalises['ogUrl'] = NULL;
  242.         $seoBalises['ogLocale'] = $site->getLanguage()->getLanguageLocale();
  243.         $seoBalises['ogType'] = 'website';
  244.         $seoBalises['index'] = 'index';
  245.         $seoBalises['follow'] = 'follow';
  246.         if ($seo) {
  247.             if(!empty($seo->getMetaTitle())) {
  248.                 $seoBalises['title'] = $seoBalises['ogTitle'] = $seo->getMetaTitle();
  249.             }
  250.             if(!empty($seo->getMetaDescription())) {
  251.                 $seoBalises['description'] = $seoBalises['ogDescription'] = $seo->getMetaDescription();
  252.             }
  253.             if(!empty($seo->getMetaCanonical())) {
  254.                 $seoBalises['canonical'] = $seoBalises['ogUrl'] = $seo->getMetaCanonical();
  255.             }
  256.             if (!empty($seo->getMetaOgTitle())) {
  257.                 $seoBalises['ogTitle'] = $seo->getMetaOgTitle();
  258.             }
  259.             if (!empty($seo->getMetaOgDescription())) {
  260.                 $seoBalises['ogDescription'] = $seo->getMetaOgDescription();
  261.             }
  262.             if (!empty($seo->getMediaRelation())) {
  263.                 $seoBalises['ogImage'] = $seo->getMediaRelation()->getMedia()->getWebPath();
  264.             }
  265.             $seoBalises['index'] = $seo->getMetaIndex() ? 'index' 'noindex';
  266.             $seoBalises['follow'] = $seo->getMetaFollow() ? 'follow' 'nofollow';
  267.             foreach ($keywords as $key => $keyword) {
  268.                 $seoBalises['title'] = str_replace('['.$key.']'$keyword$seoBalises['title']);
  269.                 $seoBalises['description'] = str_replace('['.$key.']'$keyword$seoBalises['description']);
  270.                 $seoBalises['ogTitle'] = str_replace('['.$key.']'$keyword$seoBalises['ogTitle']);
  271.                 $seoBalises['ogDescription'] = str_replace('['.$key.']'$keyword$seoBalises['ogDescription']);
  272.             }
  273.         }
  274.         $t $this->get('translator');
  275.         $response $this->render'IndexBundle::front/' $layout->getLayoutCode() . '/layout.html.twig', array(
  276.             'site' => $site,
  277.             'template' => $template,
  278.             'content' => 'IndexBundle::front/zones.html.twig',
  279.             'home' => $home,
  280.             'current' => $page,
  281.             'language' => $request->getLocale(),
  282.             'cssLayout' => $cssLayout,
  283.             'cssTemplate' => $cssTemplate,
  284.             'request' => $request,
  285.             'actions' => $actions,
  286.             'seo' => $seoBalises,
  287.             'sunrise' => date_sunrise(time(), SUNFUNCS_RET_STRING45.896.1290$t->trans('valeur-du-gmt')),
  288.             'sunset' => date_sunset(time(), SUNFUNCS_RET_STRING45.896.1290$t->trans('valeur-du-gmt')),
  289.         ));
  290.         if ($template == 'IndexBundle::front/404.html.twig' || $page->getPageCode() == '404') {
  291.             $response->setStatusCode(404);
  292.         }
  293.         return $response;
  294.     }
  295.     private function __formatFieldValue($entity$field$value)
  296.     {
  297.         if (!empty($value)) {
  298.             $em $this->getDoctrine()->getManager();
  299.             $type $em->getClassMetadata($entity)->getTypeOfField($field);
  300.             if ($type == 'datetime' || $type == 'date') {
  301.                 $value $value->format('d/m/Y');
  302.             }
  303.         } else {
  304.             $value '';
  305.         }
  306.         return html_entity_decode(strip_tags($value));
  307.     }
  308.     /**
  309.      * Retourne l'objet site courant
  310.      *
  311.      */
  312.     public static function getSite()
  313.     {
  314.         return self::$__site;
  315.     }
  316.     /**
  317.      * Affecte l'objet de site courant
  318.      *
  319.      */
  320.     public static function setSite($site)
  321.     {
  322.         self::$__site $site;
  323.     }
  324.     /**
  325.      * Retourne l'objet page courante
  326.      *
  327.      */
  328.     public static function getPage()
  329.     {
  330.         return self::$__page;
  331.     }
  332.     /**
  333.      * Affecte l'objet de page courante
  334.      *
  335.      */
  336.     public static function setPage($page)
  337.     {
  338.         self::$__page $page;
  339.     }
  340.     
  341. }