query($selectStatement); foreach ($query as $row) { self::$kvd[$row->cle]=$row->valeur; } } return self::$kvd; } /** * Renvoi la connexion PDO pour accéder a la table des KVD */ protected static function getBdd(){ if (self::$bdd != null) return self::$bdd; // Récupération des paramètres de configuration BD $dbname = getenv('DB_NAME', true) ?: getenv('DB_NAME') ?: Configuration::get("BD", "dbname", null); $host = getenv('DB_HOST', true) ?: getenv('DB_HOST') ?: Configuration::get("BD", "host", null); $port = Configuration::get('BD', 'port', '3306'); $dsn = "mysql:host=$host;dbname=$dbname;port=$port"; $login = getenv('DB_USER', true) ?: getenv('DB_USER') ?: Configuration::get("BD", "user", null); $mdp = getenv('DB_PASS', true) ?: getenv('DB_PASS') ?: Configuration::get("BD", "password", null); // Création de la connexion self::$bdd = new \PDO($dsn, $login, $mdp, array(\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); self::$bdd->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ); //Creation de la table des KVD s'il n'existe pas $createStatement = "CREATE TABLE if not exists `kvd` (`cle` varchar(255) NOT NULL, `valeur` varchar(255) NOT NULL, PRIMARY KEY (`cle`));"; self::$bdd->exec($createStatement); return self::$bdd; } /** * Sauvegarde les KVD en bdd */ public static function save() { $kvds = self::getKvds(); $bdd = self::getBdd(); $saveStatement = "delete from `kvd`;"; $saveStatement.= "insert into `kvd` (`cle`, `valeur`) values "; $params = array(); $first=true; foreach ($kvds as $cle=>$valeur){ if (!$first) $saveStatement.=", "; else $first=false; $saveStatement.="(?, ?)"; $params[]=$cle; $params[]=$valeur; } $saveStatement.=";"; $query = $bdd->prepare($saveStatement); $query->execute($params); } } routerRequeteFront(); } /** * Route une requête entrante : exécute l'action associée */ public function routerRequeteFront() { try { $this->goToFrontOffice(); } catch (Exception $e) { //Generation d'une erreur $this->gererErreur($e); } } /** * Renvoi vers les fronts office */ private function goToFrontOffice() { //Auto chargement des classes spl_autoload_register('\Oceanis\Framework\RouteurMiweb::autoLoadModele'); spl_autoload_register('\Oceanis\Framework\RouteurMiweb::autoLoadRepository'); spl_autoload_register('\Oceanis\Framework\RouteurMiweb::autoLoadControleur'); //Ajout des constantes self::autoLoadConstantes(); //Definition de la societe $site = \Site::getSiteWithHostname($_SERVER['HTTP_HOST']); if (!$site) { //Pas de site on redirige vers la page de connexion de miweb header("Location: /index.php?module=back&controleur=connexion"); } //Initialisation du kve KVDMiWeb::setSite($site); self::$site = $site; $params = array_merge($_GET, $_POST); $requete = new Requete($params); // if ($requete->existeParametre('source')) // $requete->setParametreSession('tracking_source',$requete->getParametre('source')); // if ($requete->existeParametre('clickid')) // $requete->setParametreSession('tracking_clickid',$requete->getParametre('clickid')); if (!isset($params["controleur"]) && ($_SERVER["REQUEST_URI"] != "/" && $_SERVER["REQUEST_URI"] != "/index.php")) { //On va retrouver la page qui correspond à l'url //1 URL Réecrite ???? $urlRewrite = (isset($_SERVER['REDIRECT_URL']) ? substr($_SERVER['REDIRECT_URL'], 1) : null); // On va d'abord regarder si cette url n'est pas une redirection dans la base de données $urlRedirection = $site->getUrlRedirection($urlRewrite); if ($urlRedirection) { http_response_code($urlRedirection->code); header("Location:/" . $urlRedirection->url); exit; } if ($urlRewrite) { $urlRewrite = rtrim($urlRewrite, '/'); $infoRubrique = Rubrique::getRubriqueWithSiteIdAndUrlReecrite($site->getId(), $urlRewrite); if ($infoRubrique) { $params["id"] = $infoRubrique["rubrique"]->getId(); $params["controleur"] = $infoRubrique["rubrique"]->getModele()->libelle; } else { //On regarde au niveau de l'article $infoRubrique = Article::getArticleWithSiteIdAndUrlReecrite($site->getId(), $urlRewrite); if ($infoRubrique) { $params["id"] = $infoRubrique["article"]->getId(); $params["controleur"] = DETAIL_ARTICLE; } else { // On regarde si c'est un avis $infoRubrique = NicolsAvis::getAvisWithUrlReecrite($urlRewrite); if ($infoRubrique) { $params["id"] = $infoRubrique->getId(); $params["controleur"] = DETAIL_AVIS; } else { $requestUri = (isset($_SERVER['REQUEST_URI']) ? substr($_SERVER['REQUEST_URI'], 1) : null); $newUrl = null; if ($requestUri) { $newUrl = $site->getUrlRedirection($requestUri); if ($newUrl) { http_response_code($newUrl->code); if ($newUrl->url == '/') { header("Location:" . $newUrl->url . "?" . $_SERVER['QUERY_STRING']); } else { header("Location:/" . $newUrl->url . "?" . $_SERVER['QUERY_STRING']); } exit; } } if (!$requestUri || !$newUrl) { $newUrl = $site->getUrlRedirection($urlRewrite); if ($newUrl) { http_response_code($newUrl->code); header("Location:/" . $newUrl->url . "?" . $_SERVER['QUERY_STRING']); exit; } } header("HTTP/1.0 404 Not Found"); $params["controleur"] = "edito"; $params["id"] = ID_RUB_404; } } } } if (isset($_GET['idRubrique'])) { $rubrique = Rubrique::getRubriqueWithId($_GET['idRubrique']); if ($rubrique) { $params["id"] = $_GET['idRubrique']; $params["controleur"] = $rubrique->getModele()->libelle; } } if (isset($_GET['idArticle'])) { $rubrique = Article::getArticleWithId($_GET['idArticle']); if ($rubrique) { $params["id"] = $_GET['idArticle']; $params["controleur"] = DETAIL_ARTICLE; } } } $requete = new Requete($params); $controleur = $this->creerControleurFront($requete, $site); $action = $this->creerAction($requete); $controleur->executerAction($action); } /** * Crée le contrôleur approprié pour le FO en fonction de la requête reçue */ private function creerControleurFront(Requete $requete, \Site $site) { $controleur = parent::creerControleur($requete); // Creation du controleur // Récupération de la langue depuis l'HTTP_HOST $codeIso = ($langue = $site->getLangueWithHTTPHost($_SERVER['HTTP_HOST'])) ? $langue->getCodeIso() : 'fr_FR'; $requete->setParametreSession(SESSION_CODE_ISO, $codeIso); I18N::setCodeIso($codeIso); // Affectation du site $controleur->setSite($site); // Affectation au controleur KVDMiWeb::setSite($site); // KVD pour miweb return $controleur; } /** * Autochargement des controleurs */ public static function autoLoadControleur($class) { $elements = explode("\\", $class); //ON met la premiere lettre en minuscule $controleur = $elements[count($elements) - 1]; $controleur = strtolower(substr($controleur, 0, 1)) . substr($controleur, 1); if (substr($controleur, -4) == "Base") { $fichierControleur = "src/controleur/front_base/" . substr($controleur, 0, -4) . ".php"; } else { $fichierControleur = "src/controleur/front/$controleur.php"; $fichierControleurSoc = "src/controleur/front_" . str_pad(self::$site->getId(), 2, "0", STR_PAD_LEFT) . "/$controleur.php"; if (file_exists($fichierControleurSoc)) $fichierControleur = $fichierControleurSoc; } if (file_exists($fichierControleur)) include $fichierControleur; } } prepare($selectStatement); $query->execute(array(self::$site->getId())); foreach ($query as $row) { self::$kvd[$row->cle] = $row->valeur; } } return self::$kvd; } /** * Sauvegarde les KVD en bdd */ public static function save() { $kvds = self::getKvds(); $bdd = self::getBdd(); $saveStatement = "delete from `kvd` where Site_id=?;"; $saveStatement .= "insert into `kvd` (`cle`, `valeur`, `site_id`) values "; $params = array(); $params[] = self::$site->getId(); $first = true; foreach ($kvds as $cle => $valeur) { if (!$first) $saveStatement .= ", "; else $first = false; $saveStatement .= "(?, ?, ?)"; $params[] = $cle; if ($valeur == null) $valeur = ''; $params[] = $valeur; $params[] = self::$site->getId(); } $saveStatement .= ";"; $query = $bdd->prepare($saveStatement); $query->execute($params); } } site = $site; } /** * renvoi le site entrante */ public function getSite() { return $this->site; } /** * Génère la vue du front office associée au contrôleur courant */ protected function genererVueFront($donneesVue = array(), $titre = null, $description = null, $urlCanonique = null, $javascripts = array(), $stylesheets = array(), $gabarit = null) { //Récupération des valeurs par défaut si besoin if ($titre == null) $titre = Configuration::get('DEFAUT', 'titre'); if ($description == null) $description = Configuration::get('DEFAUT', 'description'); if ($gabarit == null) $gabarit = Configuration::get('DEFAUT', 'gabarit'); if ($javascripts == null) $javascripts = array(); if ($stylesheets == null) $stylesheets = array(); // Détermination du nom du fichier vue à partir du nom du contrôleur actuel $classeControleur = get_class($this); $controleur = strtolower(str_replace("Controleur", "", $classeControleur)); // Instanciation et génération de la vue $vue = new VueMiWeb($this->action, $this->site, $titre, $description, $gabarit, $this->module, $controleur, $this->requete->getParametre('id'), $javascripts, $stylesheets, $urlCanonique); $vue->generer($donneesVue); } } fichier .= "vue" . ucfirst($action) . ".php"; //Page Id $this->pageId = $pageId; // Affectation de la societe $this->site = $site; //Affectation titre $this->titre = $titre; //Affectation de l'url canonique $this->urlCanonique = $urlCanonique; //Meta description $this->metaDescription = $meta; //Gabarit $this->gabarit = $gabarit; //Action $this->action = $action; //Module $this->module = $module; //Controleur $this->controleur = $controleur; //Gestion des assets $this->assets = new Asset(); foreach ($javascripts as $script) { $this->assets->addJavaScript($script); } foreach ($stylesheets as $style) { $this->assets->addStyleSheet($style); } } /** * Génère et affiche la vue */ public function generer($donnees) { //Detection si mode mobile ou non $detection = new MobileDetect(); $isMobile = null; if ($detection->isMobile() == true && $detection->isTablet() == false) { $isMobile = true; } if ($isMobile) { $prefixeVue = "m_"; } else { $prefixeVue = ""; } //on ajoute la societe au donnees à envoyer $donnees["site"] = $this->site; //Repertoire des vues et gabarit $repDefaut = "src/vue/" . $this->module . "/"; $repSociete = $repDefaut; //Si une societe est defini (cas du front office par exemple) on regarde si la vue n'est pas surchargé if ($this->site != null) $repSociete = "src/vue/" . $this->module . "_" . str_pad($this->site->getId(), 2, "0", STR_PAD_LEFT) . "/"; //Determination du gabarit $nom_gabarit = "gabarit"; if ($this->gabarit != null) $nom_gabarit = $this->gabarit; $gabarit = $repDefaut . $nom_gabarit . ".php"; if (file_exists($repSociete . $nom_gabarit . ".php")) $gabarit = $repSociete . $nom_gabarit . ".php"; //On regarde si le gabarit mobile existe if (file_exists(dirname($gabarit) . "/" . $prefixeVue . basename($gabarit))) $gabarit = dirname($gabarit) . "/" . $prefixeVue . basename($gabarit); //On récupérer les éléments à intégré dans le gabarit //On recherche la présence des balises header, contenu et footer $gabarit_content = file_get_contents($gabarit); preg_match_all("#<\?=(.*)\?>#", $gabarit_content, $gabarit_variable); $trimmedVariables = array_map('trim', $gabarit_variable[1]); //Chargement du header if (in_array("\$header", $trimmedVariables)) { $fileHeader = $repDefaut . "vueHeader.php"; if (file_exists($repSociete . "vueHeader.php")) $fileHeader = $repSociete . "vueHeader.php"; //On regarde si le gabarit mobile existe if (file_exists(dirname($fileHeader) . "/" . $prefixeVue . basename($fileHeader))) $fileHeader = dirname($fileHeader) . "/" . $prefixeVue . basename($fileHeader); // Génération de la partie header spécifique de la vue $header = $this->genererFichier($fileHeader, $donnees); } else { $header = ""; } if (in_array("\$contenu", $trimmedVariables)) { $fileContenu = $repDefaut . $this->controleur . "/" . $this->fichier; if (file_exists($repSociete . $this->controleur . "/" . $this->fichier)) $fileContenu = $repSociete . $this->controleur . "/" . $this->fichier; //On regarde si le gabarit mobile existe if (file_exists(dirname($fileContenu) . "/" . $prefixeVue . basename($fileContenu))) $fileContenu = dirname($fileContenu) . "/" . $prefixeVue . basename($fileContenu); // Génération de la partie spécifique de la vue $contenu = $this->genererFichier($fileContenu, $donnees); } else { $contenu = ""; } //Chargement du footer if (in_array("\$footer", $trimmedVariables)) { $fileFooter = $repDefaut . "vueFooter.php"; if (file_exists($repSociete . "vueFooter.php")) $fileFooter = $repSociete . "vueFooter.php"; //On regarde si le gabarit mobile existe if (file_exists(dirname($fileFooter) . "/" . $prefixeVue . basename($fileFooter))) $fileFooter = dirname($fileFooter) . "/" . $prefixeVue . basename($fileFooter); // Génération de la partie header spécifique de la vue $footer = $this->genererFichier($fileFooter, $donnees); } else { $footer = ""; } // Génération du gabarit commun utilisant la partie spécifique $vue = $this->genererFichier($gabarit, array( 'contenu' => $contenu, 'header' => $header, 'pageId' => $this->pageId, 'footer' => $footer, 'titre' => $this->titre, 'urlCanonique' => $this->urlCanonique, 'metaDescription' => $this->metaDescription, 'site' => $this->site, 'javascripts' => $this->assets->outputJavaScripts(), 'stylesheets' => $this->assets->outputStyleSheets() )); // Renvoi de la vue au navigateur echo $vue; } }