From c341a9b84bc192373f8fd89c5a5567943bb4f6e3 Mon Sep 17 00:00:00 2001 From: Emmanuel ROY Date: Tue, 23 Feb 2021 15:28:23 +0100 Subject: [PATCH] Update 3.2.0 --- application/class/Bdd.php | 2 +- application/class/Controlleur.php | 9 ++- application/class/ControlleurAction.php | 8 +- application/class/HttpMethod.php | 7 +- application/class/HttpMethodRequete.php | 36 --------- application/class/Implement/Action.php | 19 +++++ application/class/Modele.php | 9 +++ application/class/Url.php | 74 +++++++++++-------- application/class/Vue.php | 28 +++++-- ...e. Comment modifier proprement une page.md | 20 +++-- 10 files changed, 118 insertions(+), 94 deletions(-) diff --git a/application/class/Bdd.php b/application/class/Bdd.php index 0b3d3f0..4c8984d 100644 --- a/application/class/Bdd.php +++ b/application/class/Bdd.php @@ -6,7 +6,7 @@ class Bdd { public $bdd; - public function __construct($bdd = 'bdd') + public function __construct($bdd = 'default') { switch ($bdd) { case 'bdd1': diff --git a/application/class/Controlleur.php b/application/class/Controlleur.php index fa022fa..7a1caa4 100644 --- a/application/class/Controlleur.php +++ b/application/class/Controlleur.php @@ -22,6 +22,7 @@ class Controlleur } // no break default: + //si c'est une route symfony alors on appelle le conduit associé if ($application->route != null) { $application->url->page['name'] = $application->route['_route']; $conduit = explode('::', $application->route['controller']); @@ -32,20 +33,20 @@ class Controlleur $class->initialize($application); $this->vue = new VueVide(); $this->vue->ecran = $class->$method(); + //si c'est une page de traitement PRG on appelle le fichier de controle de formulaire } elseif ($application->url->page['control']) { $url_params = $application->url->page['params']; require TRAITEMENT_PATH . DIRECTORY_SEPARATOR . $application->url->page['name'] . '.php'; + //sinon c'est une page MVC normale } else { $this->modele = new Modele($application->url->page); + //on appelle le garde d'authentification if(isset($this->modele->page['authentification']) && $this->modele->page['authentification'] == 'yes'){ //on declare la session lors du chargement du controlleur, // ainsi on instancie la page précédente et le javascript et le css asynchrone \MVC\Object\Session::createAndTestSession(); - }else{ - \MVC\Object\Session::sessionStart(); - \MVC\Object\History::setPagePrecedente(); - \MVC\Object\Asynchronous::declare(); } + //fixme: doit on passer l'application entière dans la vue ou seulement $application->modele->page ? $this->vue = new Vue($this); } } diff --git a/application/class/ControlleurAction.php b/application/class/ControlleurAction.php index 76d4452..9ec5a3d 100644 --- a/application/class/ControlleurAction.php +++ b/application/class/ControlleurAction.php @@ -7,17 +7,21 @@ class ControlleurAction { public static function inserer($action, $data = array()) { + //on extrait la classe d'appel de l'action $action = explode('.', $action); $class = ucfirst($action[0]) . "Action"; - //echo $class; + //TODO: use try ... catch with \MVC\Classe\Logger to log error if (is_file(ACTION_PATH . DIRECTORY_SEPARATOR . $class . ".php")) { require_once ACTION_PATH . DIRECTORY_SEPARATOR . $class . ".php"; + //On charge la classe Action de façon réflextive $slot = new $class(); + //si l'action passé en parametre est fournit avec une methode pointée on charge celle demandée sinon on charge celle par defaut if (isset($action[1])) { $method = $action[1]; + //On appel la méthode de la classe action de manière reflextive return $slot->$method(...$data); } else { - return $slot->default($data); + return $slot->default(...$data); } } else { /*HandleError*/ diff --git a/application/class/HttpMethod.php b/application/class/HttpMethod.php index 3413484..529dffd 100644 --- a/application/class/HttpMethod.php +++ b/application/class/HttpMethod.php @@ -23,13 +23,8 @@ class HttpMethod case 'POST': break; case 'PUT': - //$this->data['GET'] = ... - //POST DATA except enctype="multipart/form-data" - $this->data = json_decode(file_get_contents("php://input"), true); - // no break case 'DELETE': - //$this->data['GET'] = ... - //POST DATA except enctype="multipart/form-data" + //on décode les données depuis l'input afin de les traiter $this->data = json_decode(file_get_contents("php://input"), true); break; default: diff --git a/application/class/HttpMethodRequete.php b/application/class/HttpMethodRequete.php index 284f446..785310d 100644 --- a/application/class/HttpMethodRequete.php +++ b/application/class/HttpMethodRequete.php @@ -3,42 +3,6 @@ namespace MVC\Classe; -/** - * Class Response - * - * example use: - * $data = array('a','b','c'); - * - * Three Way to send a request - * - * $request = new Response('http://myurl','mymethod'); - * $request->addContent($data); - * $request->send(); - * - * OR - * - * $request = new Response('http://myurl'); - * ( - * $request->createContext('mymethod') - * $request->addContent($data); - * $request->send(); - * ) OR ( - * $request->get($data); - * $request->post($data); - * $request->put($data); - * $request->delete($data); - * - * - * OR - * - * $request = new Response(); - * $request->setUrl('http://myurl')->get($data) - * $request->setUrl('http://myurl')->post($data) - * $request->setUrl('http://myurl')->put($data) - * $request->setUrl('http://myurl')->delete($data) - * - * @package MVC\Classe - */ class HttpMethodRequete { protected $url; diff --git a/application/class/Implement/Action.php b/application/class/Implement/Action.php index 5c74b35..99409a0 100644 --- a/application/class/Implement/Action.php +++ b/application/class/Implement/Action.php @@ -6,6 +6,25 @@ namespace MVC\Classe\Implement; class Action { public function render($view, $data) + { + return $this->renderBlade($view,$data); + } + + public function renderTwig($view, $data) + { + $paths = new \SplPriorityQueue; + + $paths->insert(VIEW_PATH . DIRECTORY_SEPARATOR . "system", 100); + $paths->insert(VIEW_PATH . DIRECTORY_SEPARATOR . "layout", 200); + $paths->insert(VIEW_PATH . DIRECTORY_SEPARATOR . "view", 300); + + $renderer = new \Windwalker\Renderer\TwigRenderer($paths); + $view .= '.html'; + + return $renderer->render($view, $data); + } + + public function renderBlade($view, $data) { $paths = new \SplPriorityQueue; diff --git a/application/class/Modele.php b/application/class/Modele.php index 9597b51..6cc418f 100644 --- a/application/class/Modele.php +++ b/application/class/Modele.php @@ -30,11 +30,20 @@ class Modele $this->page[$matches[1]] = $matches[2]; } } + $this->page['url_params'] = $base_param['params']; + //export nom a nom les variable dans la superglobale $_GET + foreach($base_param['params'] as $key => $value){ + $_GET[$key] = $value; + } } else { $this->page['name'] = $base_param['name']; $this->page['description'] = $base_param['description']; $this->page['params'] = $base_param['params']; + //export nom a nom les variable dans la superglobale $_GET + foreach($base_param['params'] as $key => $value){ + $_GET[$key] = $value; + } } } } diff --git a/application/class/Url.php b/application/class/Url.php index 7ba8aa7..427f0bd 100644 --- a/application/class/Url.php +++ b/application/class/Url.php @@ -2,8 +2,6 @@ namespace MVC\Classe; -//require_once dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR."config".DIRECTORY_SEPARATOR."define-constantes.php"; - class Url { public $page; @@ -37,21 +35,20 @@ class Url } } - //print_r($urlParts); + //Récupération du nom de la page if (isset($urlParts[0])) { - //Récupération du nom de la page - ($urlParts[0] == 'index' || $urlParts[0] == '') ? $page['name'] = 'index' : $page['name'] = $urlParts[0]; + //il se peut que l'on ait des variable avec ? dans l'url + $urlQuery = explode('?', $urlParts[0]); + $urlQueryPageName = $urlQuery[0]; + ($urlQueryPageName == 'index' || $urlQueryPageName == '') ? $page['name'] = 'index' : $page['name'] = $urlQueryPageName; unset($urlParts[0]); } else { $page['name'] = 'index'; } - //il se peut que l'on ait des variable avec ? dans l'url - $urlQuery = explode('?', $page['name']); - $page['name'] = $urlQuery[0]; - $page['name'] = strtolower($page['name']); + //si c'est une page de controle de formulaire : on renomme la page if ($page['name'] == 'control') { $page['control'] = true; ($urlParts[1] == 'index' || $urlParts[1] == '') ? $page['name']='index' : $page['name']=$urlParts[1]; @@ -60,7 +57,7 @@ class Url //vérification du nombre de parametres: $numParts = count($urlParts); - //s'il n'existe pas autant de clé que de valeurs, ce peut ^etre un module symfony + //s'il n'existe pas autant de clé que de valeurs, ce peut ^etre un module symfony ou tout autre module if ($numParts%2 != 0) { //si un module symfony n'est pas reférencé avec le nom de la page, on renvoi un erreur if (!in_array($page['name'], $this->registre->getIndex())) { @@ -81,10 +78,13 @@ class Url // si c'est un module alors on charge un a un les parametres if (in_array($page['name'], $this->registre->getIndex())) { foreach ($urlParts as $key => $value) { - $values[] = $value; - $keys[] = $key; + if ($key % 2 == 0) { + $values[] = $value; + } else { + $keys[] = $value; + } } - $page['params'] = $values; + $page['params'] = array_combine($keys, $values); // sinon c'est une page normal du framework } else { $values = array(); @@ -96,11 +96,7 @@ class Url $keys[] = $value; } } - if ($page['control']) { - $page['params'] = array_combine($values, $keys); - } else { - $page['params'] = array_combine($keys, $values); - } + $page['params'] = array_combine($keys, $values); } } $page['name'] = lcfirst($page['name']); @@ -112,21 +108,29 @@ class Url //recherche du fichier controlleur correpondant HTTP1.1 ou HTTP1.0 switch ($method) { //cas des requètes HTTP1.1 - case 'PUT': - case 'DELETE': case 'GET': case 'POST': if ($appRequest) { $page['name'] = ucfirst($page['name']); $pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'HttpReponse.php'; + if (!file_exists($pageFile)) { + $pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'RestReponse.php'; + } } else { - $page['name'] = lcfirst($page['name']); $pageFile = CONTROLLERS_PATH . DIRECTORY_SEPARATOR . $page['name'] . '.php'; if (!file_exists($pageFile)) { $page['name'] = ucfirst($page['name']); $pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'HttpReponse.php'; + if (!file_exists($pageFile)) { + $pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'RestReponse.php'; + } } } + break; + case 'PUT': + case 'DELETE': + $page['name'] = ucfirst($page['name']); + $pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'RestReponse.php'; } } @@ -155,15 +159,6 @@ class Url } } - public static function module_link_rewrite($page, $params = array()) - { - $stringParams = ''; - foreach ($params as $values) { - $stringParams .= "/" . $values; - } - return '/' . BASE_SERVER_DIRECTORY . $page . $stringParams; - } - private static function link_rewrite_slashParam($page, $params = array()) { $stringParams = ''; @@ -194,8 +189,7 @@ class Url $base_url = $scheme . "://" . $url; $url = $base_url; }else{ - $base_url = PATH_URL; - $url = $base_url . BASE_SERVER_DIRECTORY; + $url = PATH_URL; } if ($isControlPatern) { $uri = self::controlLink_rewrite($page, $params); @@ -210,4 +204,20 @@ class Url public static function getBaseDirectory(){ return '/' . BASE_SERVER_DIRECTORY; } + + public static function getRootDirectoryUrl(){ + if(isset($_SERVER['HTTP_HOST'])) { + $url = $_SERVER['HTTP_HOST']; + if (isset($_SERVER['REQUEST_SCHEME'])) { + $scheme = $_SERVER['REQUEST_SCHEME']; + } else { + $scheme = 'http'; + } + $base_url = $scheme . "://" . $url; + $url = $base_url; + }else{ + $url = PATH_URL; + } + return $url . BASE_SERVER_DIRECTORY; + } } diff --git a/application/class/Vue.php b/application/class/Vue.php index 50b3307..66ff082 100644 --- a/application/class/Vue.php +++ b/application/class/Vue.php @@ -12,23 +12,34 @@ class Vue $templateData = array(); extract($application->modele->page); - ob_start(); - if (file_exists(VIEW_PATH.DIRECTORY_SEPARATOR."view".DIRECTORY_SEPARATOR.$name.".blade.php")) { + if(!isset($engine)){$engine = 'blade';} + $flag_exist = false; + switch ($engine){ + case 'twig': + if (file_exists(VIEW_PATH.DIRECTORY_SEPARATOR."view".DIRECTORY_SEPARATOR.$name.".html.twig")) { + $flag_exist = true; + } + break; + case 'blade': + default: + if (file_exists(VIEW_PATH.DIRECTORY_SEPARATOR."view".DIRECTORY_SEPARATOR.$name.".blade.php")) { + $flag_exist = true; + } + } + ob_start(); + + if($flag_exist){ //l'inclusion du controlleur doit renvoyer le tableau $templateData require CONTROLLER_PATH . DIRECTORY_SEPARATOR . $name . '.php'; - - - //TEMPLATING BLADE + //WINWALKER TEMPLATING ENGINE $paths = new \SplPriorityQueue; $paths->insert(VIEW_PATH . DIRECTORY_SEPARATOR . "system", 100); $paths->insert(VIEW_PATH . DIRECTORY_SEPARATOR . "layout", 200); $paths->insert(VIEW_PATH . DIRECTORY_SEPARATOR . "view", 300); - if(!isset($engine)){$engine = 'blade';} - switch ($engine){ case 'twig': $renderer = new \Windwalker\Renderer\TwigRenderer($paths); @@ -36,7 +47,7 @@ class Vue break; case 'blade': default: - $renderer = new \Windwalker\Renderer\BladeRenderer($paths, array('cache_path' => VIEW_PATH . DIRECTORY_SEPARATOR . "cache")); + $renderer = new \Windwalker\Renderer\BladeRenderer($paths, array('cache_path' => VIEW_PATH . DIRECTORY_SEPARATOR . "cache")); } @@ -44,6 +55,7 @@ class Vue foreach ($application->modele->page as $key => $value) { $templateData[$key] = $value; } + //WINWALKER TEMPLATING ENGINE RENDER echo $renderer->render($name, $templateData); } else { include CONTROLLER_PATH . DIRECTORY_SEPARATOR . $name . '.php'; diff --git a/data/docs/00.e. Comment modifier proprement une page.md b/data/docs/00.e. Comment modifier proprement une page.md index afc746e..c1dcc35 100644 --- a/data/docs/00.e. Comment modifier proprement une page.md +++ b/data/docs/00.e. Comment modifier proprement une page.md @@ -1,10 +1,20 @@ #Comment modifier proprement une page contenu dans le framework SAND -Tout d’abord il vous faut reconnaitre la vue pour aller chercher le bon fichier à modifier dans le dossier `application/include`. +Tout d’abord il vous faut reconnaitre le nom de la page suivant le routage pour aller chercher les bons fichiers à modifier dans le dossier `include`. -Si vous désirez modifier le comportement d’une page il vous faudra très certainement modifier le contrôleur et la view associé, voir peut-être l’action et sa vue. +Par exemple : pour la page `index`, les bon fichiers à modifier sont : -Si vous désirez juste modifier l’affichage, il vous suffira simplement de modifier la vue blade ou twig suivant le moteur de rendu. +- `application/include/controlleurs/index.php` +- `application/include/modeles/index.model` +- `application/include/vues/view/index.blade.php` ou `application/include/vues/view/index.html.twig` + +Si vous désirez modifier le comportement d’une page il vous faudra très certainement modifier le contrôleur et la vue associée, voire peut-être l’action et sa vue si la vue mère fait des appels de ce type. + +Les actions se trouve dans le dossier `application/include/actions/` et leurs vues sont dans le même dossiers que les vues mères : `application/include/vues/view/`, il convient de la préfixer par `action-actionnamedescription`. + +Le `.model` de la page contient une variable engine qui peut prendre les valeurs `blade` ou `twig`. Par défaut si ce paramètre de modèle n’est pas renseigné c’est le moteur de rendu `blade` qui sera appelé. + +Si vous désirez juste modifier l’affichage, il vous suffira simplement de modifier la vue `blade` ou `twig` suivant le moteur de rendu. + +Cependant si vous désirez modifier le `head` ou le `layout` de la page vous devrez modifier les fichiers dans `application/include/vues/system/` ou `application/include/vues/layout/` -Le fichier `.model` de la page contient une variable engine qui peut prendre les valeurs `blade` ou `twig`. - Par défaut si ce paramètre de modèle n’est pas renseigné c’est le moteur de rendu blade qui sera appelé.