<?php
namespace Core\Controller;
use Core\Controller\Traits\BaseController;
use Core\Entity\ComingSoonConfiguration;
use Core\Entity\MaintenanceConfiguration;
use Core\Service\History\HistoryMessage;
use Core\Service\Session\Session;
use Sender\Service\Email\Mailer;
use Shopping\Controller\Traits\BaseShoppingController;
use Shopping\Entity\Category;
use Shopping\Entity\Product;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use User\Controller\Traits\BaseUserController;
use User\Entity\AuthorizationType;
use function MongoDB\BSON\toJSON;
class PageController extends AbstractController
{
use BaseController;
use BaseUserController;
/**
* Router de l'application, toutes les routes arrivent au router
*/
public function router(Request $request, Mailer $mailer)
{
// Initialisation par default du controller
// $request = $this->initializeController($request);
// Utilisation d'une redirection détectée
if ($this->vars['redirection']['isRedirection']) {
return $this->redirect($this->vars['redirection']['url'], $this->vars['redirection']['status']);
}
if ($this->vars['controller'] != null) {
// Clé d'authorization
$authorization_key = $this->vars['controller']['controller_action'];
// Pages autorisées à passer au travers des "Maintenance" et "Coming Soon"
$pages_allowed = [
'User\Controller\PageController::connect',
'User\Controller\PageController::disconnect',
'User\Controller\PageController::forgotpassword',
'User\Controller\PageController::forgotpasswordreset',
'Core\Controller\PageController::maintenance',
'Core\Controller\PageController::error',
'Core\Controller\PageController::error404',
'Core\Controller\PageController::error403',
'User\Controller\PageController::user_desactive',
];
// Utilisation de la page de maintenance et que l'utilisateur n'a pas les authorisations de modifier la page et donc de passer à travers pour voir le site
if ($this->vars['configuration']->getUseMaintenance() && !in_array($this->vars['controller'], $pages_allowed) && $this->vars['controller']['controller_action'] != 'maintenance' &&
!$this->checkAuthorization($request, ['authorization' => 'maintenance', 'type' => AuthorizationType::EDIT])) {
$uri = $this->vars['uri']['protocol'] . $this->vars['uri']['host'] .
$this->vars['pages']['list']['maintenance']->translate($this->vars['languages']['locale'])->getUri();
// Redirection 302 vers le controller correspondant à la page de maintenance
return $this->redirect($uri, 302);
}
// Vérification si l'utilisteur est désactivé
$redirection = $this->checkUserDesactive();
$item = $this->vars['controller']['controller_module'] . '\Controller\\' . $this->vars['controller']['controller'] . '::' . $this->vars['controller']['controller_action'];
if (!in_array($item, $pages_allowed) && $redirection != false) {
return $this->redirect($redirection, 302);
}
// Utilisation d'une page standard et vérification que l'utilisateur à les authorisations de voir la page
if ($this->checkAuthorization($request, ['authorization' => $authorization_key, 'type' => AuthorizationType::VIEW])) {
// Configuration de la page
$this->setPageSettings($request, $this->vars['controller']['controller_action']);
// Accès normal à l'application via un template
if ($this->vars['controller']['controller_entity'] == 'PageDefault') {
if (method_exists(ucfirst($this->vars['controller']['controller_namespace']), $this->vars['controller']['controller_action'])) {
return $this->forward(ucfirst($this->vars['controller']['controller_namespace']) . '::' . $this->vars['controller']['controller_action'], [
'vars' => $this->vars
]);
}
return $this->forward(ucfirst($this->vars['controller']['controller_namespace']) . '::template_auto', [
'vars' => $this->vars
]);
}
// Accès normal à l'application via une page personnalisée
return $this->forward($this->vars['controller']['controller_namespace'] . '::' . $this->vars['controller']['controller_action'], [
'vars' => $this->vars
]);
}
// Connexion recquise - Renvoi vers la page de connexion car l'utilisateur n'a pas les authorisations recquises
if (!$this->checkAuthorization($request, ['authorization' => $authorization_key, 'type' => AuthorizationType::VIEW])) {
// Mise en session de la page demandée
$this->session->set('user_page_redirect', $this->vars['uri']['full']);
// Page de connexion
$uri = $this->vars['uri']['protocol'] . $this->vars['uri']['host'] .
$this->vars['pages']['list']['page_default_5fc91ba0ae778']->translate($this->vars['languages']['locale'])->getUri();
// Une connexion est obligatoire
return $this->redirect($uri, 302);
}
}
// Recherche d'une URL personnalisée ( ex: produit, actualité, ... )
////////////////////
// Accès normal à l'application via une url personnalisée
$response = $this->findByCustomUrl($request);
if ($response['pageFound']) {
// Configuration de la page
$this->setPageSettings($request, $response['forward']['controllerName']);
// Initialisation de variables communes aux controllers et spécifique à l'application
$this->controllerForward('App\Controller\PageController::initialize');
// Transmission au controller correspondant à l'URL personnalisée
return $this->forward($response['forward']['controller_namespace'] . '::' . $response['forward']['controller_action'], $response['forward']['parameters']);
}
// Page introuvable - Renvoi vers la page d'erreur 404
return $this->redirectNotFoundException($request);
}
/**
* Recherche de l'utilisation d'une URL personnalisé ( ex: pour un produit, une actualité, ... )
*/
public function findByCustomUrl(Request $request)
{
// Forward
$controllerName = null;
$forwardController = null;
$forwardParameters = [];
// Page
$pageFound = false;
// Slug
$slug = trim($request->getRequestUri(), '/');
if (preg_match('#^(.){2}/(.)+$#', $slug, $matches)) {
$slug = substr($slug, 3);
}
// TODO Recherche d'une page via un champs url personnalisé
return [
'forward' => [
'name' => $controllerName,
'controller' => $forwardController,
'parameters' => $forwardParameters,
],
'slug' => $slug,
'pageFound' => $pageFound,
];
}
/**
* Effectue un forward personnalisé
*/
private function controllerForward($route, $options = [])
{
return $this->forward($route, array_merge([
'vars' => $this->vars
], $options));
}
}