<?php
namespace Felix\IndexBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Felix\IndexBundle\IndexBundle;
/**
* Index controller.
*
*/
class IndexController extends Controller
{
protected $_namespace;
/**
* Site courant
*
*/
private static $__site;
/**
* Page courante
*
*/
private static $__page;
/**
* @Route("/", name="index_home", schemes={"%protocol%"})
* @Route("/{pageCode}", name="index_domain", schemes={"%protocol%"})
* @Route("/{siteCode}/{pageCode}", name="index", options={"expose"=true}, schemes={"%protocol%"})
* @Route("/{pageCode}/post/{code}", schemes={"%protocol%"})
* @Route("/{siteCode}/{pageCode}/post/{code}", schemes={"%protocol%"})
*/
public function indexAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
//On récupère le site
$site = $this->getDoctrine()->getRepository('CoreBundle:Site')->findById($request->getSession()->get('site'));
//Récupération de la page
$page = $home = $this->getDoctrine()->getRepository('CoreBundle:Page')->findDefaultPage($site);
if ($request->get('pageCode') != null) {
$page = $this->getDoctrine()->getRepository('CoreBundle:Page')->findByCodeAndSite($request->get('pageCode'), $site);
}
//Si pas de page (ou page non publié)
$template = null;
$loadContent = true;
if ($page == null || ($page->getOnline() == 0 && !$request->get('preview'))) {
$page = $this->getDoctrine()->getRepository('CoreBundle:Page')->findByCodeAndSite('404', $site);
if ($page == null) {
$page = $this->getDoctrine()->getRepository('CoreBundle:Page')->findDefaultPage($site);
$template = 'IndexBundle::front/404.html.twig';
}
$loadContent = false;
} else {
//gestion des acces front
$autorisation = true;
if (count($page->getGroupsFront()) > 0 ) {
if($this->getUser() == null){
$autorisation = false;
} else if (!in_array('ROLE_SUPER_ADMIN', $this->getUser()->getRoles()) && !in_array('ROLE_ADMIN', $this->getUser()->getRoles())){
$autorisation = false;
foreach ($page->getGroupsFront() as $groupFront){
foreach ($this->getUser()->getGroups() as $group){
if($group->getId() == $groupFront->getId()){
$autorisation = true;
}
}
}
}
}
//le template
if($autorisation == false){
$template = 'IndexBundle::front/login.html.twig';
$loadContent = false;
}
}
//Si c'est une page fictive qui ne sert qu'à l'arborescence
if ($page->getPageArbo()) {
if (count($page->getChildren()) > 0) {
$page = $page->getChildren()->first();
} else {
$page = $this->getDoctrine()->getRepository('CoreBundle:Page')->findDefaultPage($site);
}
return $this->redirectToRoute('index', array('siteCode' => $site->getSiteCode(), 'pageCode' => $page->getPageCode()));
}
self::setSite($site);
self::setPage($page);
$layout = $site->getLayout();
if ($page->getLayout()) {
$layout = $page->getLayout();
}
if ($template == null) {
$template = 'IndexBundle::front/' . $layout->getLayoutCode().'/templates/'.$page->getTemplate()->getTemplateCode().'.html.twig';
}
//inclusion css layout/templates
$cssLayout = 'css/' . $layout->getLayoutCode() . '.css';
$cssTemplate = 'css/' . $layout->getLayoutCode() . '/templates/' . $page->getTemplate()->getTemplateCode() . '.css';
//Gestion des balises dans le SEO et des actions
$actions = array();
$keywords = array();
$balises = array();
$seo = $page->getSeo();
if ($seo) {
if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/", $seo->getMetaTitle(), $results)) {
$balises = array_merge($balises, $results[1]);
}
if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/", $seo->getMetaDescription(), $results)) {
$balises = array_merge($balises, $results[1]);
}
if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/", $seo->getMetaOgTitle(), $results)) {
$balises = array_merge($balises, $results[1]);
}
if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/", $seo->getMetaOgDescription(), $results)) {
$balises = array_merge($balises, $results[1]);
}
}
if ($loadContent) {
foreach ($page->getZones() as $zone){
foreach ($zone->getCols() as $col){
foreach ($col->getBlocks() as $block){
//On parcourt les blocks action, pour lancer les redirections si il y a
if ($block->getBlockType()->getTypeCode() == 'action') {
$action = $block->getAction();
$params = array('request' => $request);
$url = $action->getActionBundle() . ':Front:' . $action->getActionCode();
$filter = '';
if ($block->getActionFilter()) {
$params['filter'] = $block->getActionFilter();
$filter = $block->getActionFilter();
}
$actionResponse = $this->forward($url, $params, $request->query->all());
if ($actionResponse->isRedirection()) {
return $actionResponse;
} elseif ($actionResponse->isClientError()) {
$template = 'IndexBundle::front/404.html.twig';
break 3;
} else {
$actions[$url . ':' . $filter] = $actionResponse->getContent();
}
// On enregistre les balises des fiches pour le SEO, si la fiche existe
if (!empty($actionResponse->getContent()) && $action->getActionView()) {
$entity = $action->getActionBundle() . ':' . $action->getActionEntity();
$metadataEntity = $em->getClassMetadata($entity);
$fields = $metadataEntity->getFieldNames();
//On ajoute les champs si il y a une table de traduction I18n
$fullEntityName = $metadataEntity->getName();
$entityI18n = $fullEntityName . 'I18n';
if (class_exists($entityI18n)) {
$entityI18nFields = $em->getClassMetadata($entityI18n)->getFieldNames();
foreach ($entityI18nFields as $subEntityI18nKey => $entityI18nField) {
$fields[] = $entityI18nField;
}
}
//On ajoute les méthodes qui commence par getSeo en tant que champs
$classMethod = get_class_methods($metadataEntity->getName());
foreach ($classMethod as $method) {
if (strpos($method, 'getSeo') !== false && $method !== 'getSeo') {
$str = str_replace('getSeo', 'seo', $method);
$fields[] = $str;
}
}
$object = $this->getDoctrine()->getRepository($entity)->findByCode($request->get('code'));
foreach ($fields as $field) {
if (!in_array($field, $balises)) {
continue;
}
$methodGet = 'get'.ucfirst($field);
if (method_exists($object, $methodGet)) {
$value = $object->{$methodGet}();
$value = self::__formatFieldValue($entity, $field, $value);
} elseif (strpos($field, 'I18n')) {
if (method_exists($object, 'getTraduction')) {
$value = $object->getTraduction();
$value = $value->{$methodGet}();
$value = self::__formatFieldValue($entity, $field, $value);
}
}
$keywords[$field] = $value;
}
$fieldsMapping = $metadataEntity->getAssociationNames();
foreach ($fieldsMapping as $field) {
if ($field == "i18n") {
continue;
}
foreach ($balises as $balise) {
if (strpos($balise, '.')) {
$balisePart = explode('.', $balise);
if ($balisePart[0] == $field) {
$methodGet = 'get'.ucfirst($field);
if (method_exists($object, $methodGet)) {
$relation = $object->{$methodGet}();
$methodRelationGet = 'get' . ucfirst($balisePart[1]);
$subEntity = $metadataEntity->getAssociationTargetClass($field);
$value = '';
if (is_a($relation, 'Doctrine\ORM\PersistentCollection')) {
$multipleValue = array();
foreach ($relation as $item) {
if (method_exists($item, $methodRelationGet)) {
$tmpValue = $item->{$methodRelationGet}();
$tmpValue = self::__formatFieldValue($subEntity, $balisePart[1], $tmpValue);
$multipleValue[] = $tmpValue;
} elseif (strpos($balisePart[1], 'I18n')) {
if (method_exists($item, 'getTraduction')) {
$tmpValue = $item->getTraduction();
$tmpValue = $tmpValue->{$methodRelationGet}();
$tmpValue = self::__formatFieldValue($subEntity, $balisePart[1], $tmpValue);
$multipleValue[] = $tmpValue;
}
}
}
$value = implode(', ', $multipleValue);
} else {
if (method_exists($relation, $methodRelationGet)) {
$value = $relation->{$methodRelationGet}();
$value = self::__formatFieldValue($subEntity, $balisePart[1], $value);
} elseif (strpos($balisePart[1], 'I18n')) {
if (method_exists($relation, 'getTraduction')) {
$value = $relation->getTraduction();
$value = $value->{$methodRelationGet}();
$value = self::__formatFieldValue($subEntity, $balisePart[1], $value);
}
}
}
$keywords[$balise] = $value;
}
}
}
}
}
}
}
}
}
}
}
$seoBalises = array();
$seoBalises['title'] = $seoBalises['ogTitle'] = $page->getPageName();
$seoBalises['description'] = $seoBalises['ogDescription'] = NULL;
$seoBalises['canonical'] = $seoBalises['ogUrl'] = NULL;
$seoBalises['ogLocale'] = $site->getLanguage()->getLanguageLocale();
$seoBalises['ogType'] = 'website';
$seoBalises['index'] = 'index';
$seoBalises['follow'] = 'follow';
if ($seo) {
if(!empty($seo->getMetaTitle())) {
$seoBalises['title'] = $seoBalises['ogTitle'] = $seo->getMetaTitle();
}
if(!empty($seo->getMetaDescription())) {
$seoBalises['description'] = $seoBalises['ogDescription'] = $seo->getMetaDescription();
}
if(!empty($seo->getMetaCanonical())) {
$seoBalises['canonical'] = $seoBalises['ogUrl'] = $seo->getMetaCanonical();
}
if (!empty($seo->getMetaOgTitle())) {
$seoBalises['ogTitle'] = $seo->getMetaOgTitle();
}
if (!empty($seo->getMetaOgDescription())) {
$seoBalises['ogDescription'] = $seo->getMetaOgDescription();
}
if (!empty($seo->getMediaRelation())) {
$seoBalises['ogImage'] = $seo->getMediaRelation()->getMedia()->getWebPath();
}
$seoBalises['index'] = $seo->getMetaIndex() ? 'index' : 'noindex';
$seoBalises['follow'] = $seo->getMetaFollow() ? 'follow' : 'nofollow';
foreach ($keywords as $key => $keyword) {
$seoBalises['title'] = str_replace('['.$key.']', $keyword, $seoBalises['title']);
$seoBalises['description'] = str_replace('['.$key.']', $keyword, $seoBalises['description']);
$seoBalises['ogTitle'] = str_replace('['.$key.']', $keyword, $seoBalises['ogTitle']);
$seoBalises['ogDescription'] = str_replace('['.$key.']', $keyword, $seoBalises['ogDescription']);
}
}
$t = $this->get('translator');
$response = $this->render( 'IndexBundle::front/' . $layout->getLayoutCode() . '/layout.html.twig', array(
'site' => $site,
'template' => $template,
'content' => 'IndexBundle::front/zones.html.twig',
'home' => $home,
'current' => $page,
'language' => $request->getLocale(),
'cssLayout' => $cssLayout,
'cssTemplate' => $cssTemplate,
'request' => $request,
'actions' => $actions,
'seo' => $seoBalises,
'sunrise' => date_sunrise(time(), SUNFUNCS_RET_STRING, 45.89, 6.12, 90, $t->trans('valeur-du-gmt')),
'sunset' => date_sunset(time(), SUNFUNCS_RET_STRING, 45.89, 6.12, 90, $t->trans('valeur-du-gmt')),
));
if ($template == 'IndexBundle::front/404.html.twig' || $page->getPageCode() == '404') {
$response->setStatusCode(404);
}
return $response;
}
private function __formatFieldValue($entity, $field, $value)
{
if (!empty($value)) {
$em = $this->getDoctrine()->getManager();
$type = $em->getClassMetadata($entity)->getTypeOfField($field);
if ($type == 'datetime' || $type == 'date') {
$value = $value->format('d/m/Y');
}
} else {
$value = '';
}
return html_entity_decode(strip_tags($value));
}
/**
* Retourne l'objet site courant
*
*/
public static function getSite()
{
return self::$__site;
}
/**
* Affecte l'objet de site courant
*
*/
public static function setSite($site)
{
self::$__site = $site;
}
/**
* Retourne l'objet page courante
*
*/
public static function getPage()
{
return self::$__page;
}
/**
* Affecte l'objet de page courante
*
*/
public static function setPage($page)
{
self::$__page = $page;
}
}