Update 3.2.0

This commit is contained in:
Emmanuel ROY 2021-02-23 15:28:23 +01:00
parent 5be76d38f6
commit c341a9b84b
10 changed files with 118 additions and 94 deletions

View file

@ -6,7 +6,7 @@ class Bdd
{
public $bdd;
public function __construct($bdd = 'bdd')
public function __construct($bdd = 'default')
{
switch ($bdd) {
case 'bdd1':

View file

@ -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);
}
}

View file

@ -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*/

View file

@ -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:

View file

@ -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;

View file

@ -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;

View file

@ -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;
}
}
}
}

View file

@ -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;
}
}

View file

@ -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';

View file

@ -1,10 +1,20 @@
#Comment modifier proprement une page contenu dans le framework SAND
Tout dabord il vous faut reconnaitre la vue pour aller chercher le bon fichier à modifier dans le dossier `application/include`.
Tout dabord 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 dune page il vous faudra très certainement modifier le contrôleur et la view associé, voir peut-être laction et sa vue.
Par exemple : pour la page `index`, les bon fichiers à modifier sont :
Si vous désirez juste modifier laffichage, 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 dune page il vous faudra très certainement modifier le contrôleur et la vue associée, voire peut-être laction 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 nest pas renseigné cest le moteur de rendu `blade` qui sera appelé.
Si vous désirez juste modifier laffichage, 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 nest pas renseigné cest le moteur de rendu blade qui sera appelé.