Compare commits
35 commits
Author | SHA1 | Date | |
---|---|---|---|
Emmanuel ROY | cbcb0eb22f | ||
10bc015688 | |||
8277707a22 | |||
6d4e4f20f7 | |||
5d8dd0f702 | |||
61af7f0fcb | |||
d69e72165d | |||
666a13f719 | |||
73a505ce7b | |||
448f312b2e | |||
df0aeb1b80 | |||
e55358c819 | |||
f8bcc15874 | |||
108e5d7641 | |||
d8075c803b | |||
7a3cf99bea | |||
b725e80591 | |||
4dd174ebbf | |||
58f6adb7ba | |||
037e2b0812 | |||
ae43c2e6bb | |||
fe77b35dcc | |||
67ffc42769 | |||
23878bfe8e | |||
d7ab71841e | |||
22df2ca781 | |||
d4ae501192 | |||
99e7c9544c | |||
aed63829d0 | |||
a09f93cddc | |||
c238bfdcb3 | |||
5dc8af450a | |||
42fde64f60 | |||
0d3b2ae752 | |||
c341a9b84b |
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -9,5 +9,6 @@ application/config/bdd-parameters.php
|
|||
application/config/cas-authentification-config.php
|
||||
application/config/hybrid-authentification-config.php
|
||||
application/config/soap-constantes.php
|
||||
application/config/console-parameters.php
|
||||
|
||||
application/include/vues/cache/*
|
56
README.md
56
README.md
|
@ -1,27 +1,47 @@
|
|||
# Modular Symfony Application
|
||||
# SAND-FRAMEWORK for Modular-Applications
|
||||
|
||||
---
|
||||
---
|
||||
Cette architecture MVC Objet est composée d'un layout Blade (Laravel)
|
||||
|
||||
Les urls d'accès sont de type www.domain.tld/page/varname1/varvalue1/varname2/varvalue2/ ...
|
||||
Cette architecture MVC Objet est composée d'un moteur de template (Blade ou Twig)
|
||||
|
||||
Afin de créer une nouvelle page vous devez instancier trois fichiers contenant diverses variables, dont voici les commandes:
|
||||
Les urls d'accès sont de type www.domain.tld/le_nom_de_mapage/varname1/varvalue1/varname2/varvalue2/ ...
|
||||
|
||||
Afin de créer une nouvelle page vous devez instancier trois fichiers contenant diverses variables, dont voici les adresses:
|
||||
|
||||
"application > include > controlleurs > mapage.php" contenant:
|
||||
> les commandes permettant de gérer un formulaire
|
||||
> un ou plusieurs accès à la base de données
|
||||
> les variables instanciées dans $templateData permettent l'affichage dans la vue blade
|
||||
---
|
||||
|
||||
"application > include > modeles > mapage.model" contenant
|
||||
>les variables spécifiques à la page de l'application exemple:
|
||||
`application > include > controlleurs > le_nom_de_mapage.php` contenant:
|
||||
- les commandes permettant de gérer un formulaire
|
||||
- un ou plusieurs accès à la base de données
|
||||
- des variables instanciées dans le tableau `$templateData` permettant l'affichage dans la vue blade ou twig
|
||||
|
||||
---
|
||||
|
||||
`application > include > modeles > le_nom_de_mapage.model` contenant
|
||||
les variables spécifiques à la page de l'application. soit par exemple:
|
||||
```
|
||||
name : le nom de mapage
|
||||
description : ma description pour les moteur de recherche
|
||||
params : paramètre(s) supplémentaire(s)
|
||||
name : le_nom_de_mapage
|
||||
page_title : le title du head de la page html rendue
|
||||
description : ma description pour les moteurs de recherche
|
||||
engine : none
|
||||
authentification : no
|
||||
ariane : {acceuil, test d'acceuil}
|
||||
arianelink : {index, le_nom_de_mapage}
|
||||
paramsN : paramètre(s) supplémentaire(s)
|
||||
```
|
||||
"application > include > vues > view > mapage.blade.php contenant
|
||||
> le layout blade a instancier
|
||||
avec en plus de cela :
|
||||
`engine : blade` pour un layout blade ou `engine : twig` pour un layout twig
|
||||
|
||||
pour les modules symfony, c'est un peu plus compliqué il faut instancier ces trois précédents fichiers en faisant appel la class Modular,
|
||||
ne pas oublier de référencer le module dans le dossier modules > setup > registre.model
|
||||
et faire correspondre le nom du dossier avec le registre, ici l'exemple est syf43.
|
||||
---
|
||||
|
||||
`application > include > vues > view > le_nom_de_mapage.blade.php` contenant le layout `blade` a instancier
|
||||
`application > include > vues > view > le_nom_de_mapage.html.twig` contenant le layout `twig` a instancier
|
||||
|
||||
> Vous pouvez aussi tout à fait utiliser la commande:
|
||||
>
|
||||
> `php console/bin.php page:add`
|
||||
|
||||
Pour les modules, c'est un peu plus compliqué : il faut instancier ces trois précédents fichiers en faisant appel la class Modular,
|
||||
ne pas oublier de référencer le module dans le dossier modules > setup > registre.model, ajouter le dossier contenant le code du module
|
||||
et faire correspondre le nom du controlleur frontal du module avec le registre.
|
||||
|
|
|
@ -1,5 +1,12 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Package MVC\Classe
|
||||
* @author Emmanuel ROY
|
||||
* @license MIT-licence (open source)
|
||||
* @version 3.5
|
||||
*/
|
||||
|
||||
namespace MVC\Classe;
|
||||
|
||||
class Application
|
||||
|
@ -9,6 +16,8 @@ class Application
|
|||
public $browser;
|
||||
public $route;
|
||||
|
||||
public $controlleur;
|
||||
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
|
@ -17,18 +26,42 @@ class Application
|
|||
|
||||
$this->url = new Url($this->http->method, $this->browser->isAppRequest());
|
||||
|
||||
switch(APP_STATE) {
|
||||
case "CLOSED":
|
||||
case "MAINTAINED":
|
||||
$this->route = null;
|
||||
break;
|
||||
case "OPEN":
|
||||
if(\MVC\Classe\Application::is_under_update()) {
|
||||
$this->route = null;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
$dispacher = new Dispacher();
|
||||
$this->route = $dispacher->route;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function launch()
|
||||
{
|
||||
$controlleur = new Controlleur($this);
|
||||
$this->controlleur = new Controlleur($this);
|
||||
//si la page n'est un controlleur d'action alors on affiche l'écran
|
||||
if (!$this->url->page['control']) {
|
||||
print($controlleur->vue->ecran);
|
||||
print($this->controlleur->vue->ecran);
|
||||
//si on affiche l'écran alors on vide les alertes de la session
|
||||
\MVC\Object\Alert::remove();
|
||||
}
|
||||
}
|
||||
|
||||
public static function is_under_update(){
|
||||
$ajh = new \DateTime('NOW');
|
||||
$maintenance_begin = new \DateTime(MAINTENANCE_DATE_DEBUT);
|
||||
$maintenance_fin = new \DateTime(MAINTENANCE_DATE_FIN);
|
||||
if($maintenance_begin < $ajh && $ajh < $maintenance_fin) {
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ class Bdd
|
|||
{
|
||||
public $bdd;
|
||||
|
||||
public function __construct($bdd = 'bdd')
|
||||
public function __construct($bdd = 'default')
|
||||
{
|
||||
switch ($bdd) {
|
||||
case 'bdd1':
|
||||
|
@ -24,11 +24,13 @@ class Bdd
|
|||
|
||||
public function faireSQLRequete($sql)
|
||||
{
|
||||
$sql = \MVC\Classe\Caracter::avoid_sql_injection($sql);
|
||||
$req = $this->bdd->query($sql);
|
||||
// Print Pdo::ERRORs
|
||||
if (!$req && (ENV == 'TEST' || ENV == 'DEV')) {
|
||||
if (!$req && (ENV == 'TEST' || ENV == 'DEVEL')) {
|
||||
echo "\nPDO::errorInfo():\n";
|
||||
print_r($this->bdd->errorInfo());
|
||||
print_r($sql);
|
||||
}
|
||||
return $req;
|
||||
}
|
||||
|
@ -55,17 +57,44 @@ class Bdd
|
|||
*/
|
||||
public function faireBindRequete($sql, array $params = null)
|
||||
{
|
||||
try{
|
||||
$req = $this->bdd->prepare($sql);
|
||||
// cas de tests des variables qui lance une exception
|
||||
//if(!$Allow) throw new Exception("Le format de l'isbn ne correspond pas au format attendu");
|
||||
if ($params) {
|
||||
foreach ($params as $value) {
|
||||
$req->bindParam($value[0], Caracter::normalise_ChaineDeCaracteres($value[1]), $value[2]);
|
||||
$value[1] = Caracter::normalise_ChaineDeCaracteres($value[1]);
|
||||
if($value[2] !== 'VALUE') {
|
||||
$req->bindParam(':'.$value[0], $value[1], $value[2]);
|
||||
}else{
|
||||
$req->bindValue(':'.$value[0], $value[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
$req->execute();
|
||||
|
||||
}
|
||||
catch(PDOException $pdo_e){
|
||||
if (ENV == 'TEST' || ENV == 'DEVEL')
|
||||
{
|
||||
// Print Pdo::ERRORs
|
||||
if (!$req && (ENV == 'TEST' || ENV == 'DEV')) {
|
||||
echo "\nPDO::errorInfo():\n";
|
||||
//Faire quelque choses en cas d'erreur PDO
|
||||
echo "\nPDOException():\n";
|
||||
print_r($this->bdd->errorInfo());
|
||||
print_r($pdo_e);
|
||||
print_r($sql);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
catch(Exception $e){
|
||||
if (ENV == 'TEST' || ENV == 'DEVEL') {
|
||||
//Pour les autres erreurs faire autre chose
|
||||
echo "\nException():\n";
|
||||
print_r($this->bdd->errorInfo());
|
||||
print_r($e);
|
||||
print_r($sql);
|
||||
}
|
||||
}
|
||||
//$req->closeCursor();
|
||||
return $req;
|
||||
|
|
|
@ -15,6 +15,104 @@ class Browser
|
|||
//Logger::addLog('http.browser',$this->user);
|
||||
}
|
||||
|
||||
public static function get()
|
||||
{
|
||||
// Make case insensitive.
|
||||
$t = strtolower($_SERVER['HTTP_USER_AGENT']);
|
||||
|
||||
// If the string *starts* with the string, strpos returns 0 (i.e., FALSE). Do a ghetto hack and start with a space.
|
||||
// "[strpos()] may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE."
|
||||
// http://php.net/manual/en/function.strpos.php
|
||||
$t = " " . $t;
|
||||
|
||||
// Humans / Regular Users
|
||||
if (strpos($t, 'opera') || strpos($t, 'opr/')) {
|
||||
return 'Opera';
|
||||
} elseif (strpos($t, 'edge')) {
|
||||
return 'Edge';
|
||||
} elseif (strpos($t, 'chrome')) {
|
||||
return 'Chrome';
|
||||
} elseif (strpos($t, 'safari')) {
|
||||
return 'Safari';
|
||||
} elseif (strpos($t, 'firefox')) {
|
||||
return 'Firefox';
|
||||
} elseif (strpos($t, 'msie') || strpos($t, 'trident/7')) {
|
||||
return 'Internet Explorer';
|
||||
}
|
||||
}
|
||||
|
||||
public static function get_firefox_version() {
|
||||
// Make case insensitive.
|
||||
$t = strtolower($_SERVER['HTTP_USER_AGENT']);
|
||||
|
||||
// If the string *starts* with the string, strpos returns 0 (i.e., FALSE). Do a ghetto hack and start with a space.
|
||||
// "[strpos()] may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE."
|
||||
// http://php.net/manual/en/function.strpos.php
|
||||
$t = " " . $t;
|
||||
|
||||
// Firefox Users
|
||||
if (strpos($t, 'firefox')) {
|
||||
preg_match('/rv:(.*)\)/', $_SERVER['HTTP_USER_AGENT'], $matches, PREG_OFFSET_CAPTURE);
|
||||
if(isset($matches[1])) {
|
||||
return intval($matches[1][0]);
|
||||
}else{
|
||||
return 'no-version';
|
||||
}
|
||||
}
|
||||
return 'not-firefox';
|
||||
}
|
||||
|
||||
public static function get_ip() {
|
||||
// IP si internet partagé
|
||||
if (isset($_SERVER['HTTP_CLIENT_IP'])) {
|
||||
return $_SERVER['HTTP_CLIENT_IP'];
|
||||
}
|
||||
// IP derrière un proxy
|
||||
elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
|
||||
return $_SERVER['HTTP_X_FORWARDED_FOR'];
|
||||
}
|
||||
// Sinon : IP normale
|
||||
else {
|
||||
return (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '');
|
||||
}
|
||||
}
|
||||
|
||||
public static function get_os() {
|
||||
$user_agent = $_SERVER['HTTP_USER_AGENT'];
|
||||
$os_platform = "Inconnu";
|
||||
$os_array = array(
|
||||
'/windows nt 10/i' => 'Windows 10',
|
||||
'/windows nt 6.3/i' => 'Windows 8.1',
|
||||
'/windows nt 6.2/i' => 'Windows 8',
|
||||
'/windows nt 6.1/i' => 'Windows 7',
|
||||
'/windows nt 6.0/i' => 'Windows Vista',
|
||||
'/windows nt 5.2/i' => 'Windows Server 2003/XP x64',
|
||||
'/windows nt 5.1/i' => 'Windows XP',
|
||||
'/windows xp/i' => 'Windows XP',
|
||||
'/windows nt 5.0/i' => 'Windows 2000',
|
||||
'/windows me/i' => 'Windows ME',
|
||||
'/win98/i' => 'Windows 98',
|
||||
'/win95/i' => 'Windows 95',
|
||||
'/win16/i' => 'Windows 3.11',
|
||||
'/macintosh|mac os x/i' => 'Mac OS X',
|
||||
'/mac_powerpc/i' => 'Mac OS 9',
|
||||
'/linux/i' => 'Linux',
|
||||
'/ubuntu/i' => 'Ubuntu',
|
||||
'/iphone/i' => 'iPhone',
|
||||
'/ipod/i' => 'iPod',
|
||||
'/ipad/i' => 'iPad',
|
||||
'/android/i' => 'Android',
|
||||
'/blackberry/i' => 'BlackBerry',
|
||||
'/webos/i' => 'Mobile'
|
||||
);
|
||||
foreach ($os_array as $regex => $value) {
|
||||
if (preg_match($regex, $user_agent)) {
|
||||
$os_platform = $value;
|
||||
}
|
||||
}
|
||||
return $os_platform;
|
||||
}
|
||||
|
||||
protected function get_browser_name()
|
||||
{
|
||||
|
||||
|
@ -112,6 +210,17 @@ class Browser
|
|||
|
||||
public function isAppRequest()
|
||||
{
|
||||
switch(APP_STATE) {
|
||||
case "CLOSED":
|
||||
case "MAINTAINED":
|
||||
return false;
|
||||
break;
|
||||
case "OPEN":
|
||||
if(\MVC\Classe\Application::is_under_update()) {
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
if (preg_match('#App#', $this->user)) {
|
||||
return true;
|
||||
} else {
|
||||
|
@ -119,3 +228,4 @@ class Browser
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,4 +74,54 @@ class Caracter
|
|||
$chaine = str_replace('"', '"', $chaine);
|
||||
return $chaine;
|
||||
}
|
||||
public static function avoid_sql_injection($chaine){
|
||||
$chaine = preg_replace("/`;--/", "", $chaine);
|
||||
$chaine = preg_replace("/';--/", "", $chaine);
|
||||
$chaine = preg_replace('/";--/', "", $chaine);
|
||||
$chaine = preg_replace("/;--/", "", $chaine);
|
||||
return $chaine;
|
||||
}
|
||||
public static function avoid_guillemets($chaine)
|
||||
{
|
||||
$chaine = str_replace("'", "", $chaine);
|
||||
$chaine = str_replace('"', '', $chaine);
|
||||
return $chaine;
|
||||
}
|
||||
public static function mettreEnMajusculeAccents($chaine, $trueAccent = false)
|
||||
{
|
||||
if (!$trueAccent) {
|
||||
$chaine = str_replace('é', 'E', $chaine);
|
||||
$chaine = str_replace('è', 'E', $chaine);
|
||||
$chaine = str_replace('ë', 'E', $chaine);
|
||||
$chaine = str_replace('ê', 'E', $chaine);
|
||||
$chaine = str_replace('ç', 'C', $chaine);
|
||||
$chaine = str_replace('Ç', 'C', $chaine);
|
||||
$chaine = str_replace('à', 'A', $chaine);
|
||||
// $chaine = str_replace('','&aeacute;',$chaine);
|
||||
$chaine = str_replace('â', 'A', $chaine);
|
||||
$chaine = str_replace('ä', 'A', $chaine);
|
||||
$chaine = str_replace('î', 'I', $chaine);
|
||||
$chaine = str_replace('ï', 'I', $chaine);
|
||||
$chaine = str_replace('ù', 'U', $chaine);
|
||||
$chaine = str_replace('û', 'U', $chaine);
|
||||
$chaine = str_replace('ü', 'U', $chaine);
|
||||
} else {
|
||||
$chaine = str_replace('é', 'É', $chaine);
|
||||
$chaine = str_replace('è', 'È', $chaine);
|
||||
$chaine = str_replace('ë', 'Ë', $chaine);
|
||||
$chaine = str_replace('ê', 'Ê', $chaine);
|
||||
$chaine = str_replace('ç', 'Ç', $chaine);
|
||||
$chaine = str_replace('Ç', 'Ç', $chaine);
|
||||
$chaine = str_replace('à', 'À', $chaine);
|
||||
// $chaine = str_replace('','&aeacute;',$chaine);
|
||||
$chaine = str_replace('â', 'Â', $chaine);
|
||||
$chaine = str_replace('ä', 'Ä', $chaine);
|
||||
$chaine = str_replace('î', 'Î', $chaine);
|
||||
$chaine = str_replace('ï', 'Ï', $chaine);
|
||||
$chaine = str_replace('ù', 'Ù', $chaine);
|
||||
$chaine = str_replace('û', 'Û', $chaine);
|
||||
$chaine = str_replace('ü', 'Ü', $chaine);
|
||||
}
|
||||
return $chaine;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,12 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Package MVC\Classe
|
||||
* @author Emmanuel ROY
|
||||
* @license MIT-licence (open source)
|
||||
* @version 3.5
|
||||
*/
|
||||
|
||||
namespace MVC\Classe;
|
||||
|
||||
class Controlleur
|
||||
|
@ -22,6 +29,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,23 +40,31 @@ 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'];
|
||||
foreach($application->url->page['params'] as $key => $value){
|
||||
$_GET[$key] = $value;
|
||||
$url_params[$key] = $value;
|
||||
}
|
||||
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();
|
||||
}
|
||||
$this->vue = new Vue($this);
|
||||
$this->vue = new Vue($this->modele->page);
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function callHttpResponse($application)
|
||||
|
|
|
@ -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*/
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -6,6 +6,31 @@ namespace MVC\Classe\Implement;
|
|||
class Action
|
||||
{
|
||||
public function render($view, $data)
|
||||
{
|
||||
return $this->renderBlade($view,$data);
|
||||
}
|
||||
|
||||
public function renderJSON($json)
|
||||
{
|
||||
//header('Content-Type: application/json; charset=utf-8');
|
||||
return json_encode($json, JSON_HEX_APOS);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
|
||||
namespace MVC\Classe;
|
||||
|
||||
use Symfony\Component\Validator\Constraints\Date;
|
||||
|
||||
class Logger
|
||||
{
|
||||
public static function addLog($type = 'default', $what = "")
|
||||
|
@ -28,14 +26,14 @@ class Logger
|
|||
*/
|
||||
public static function logCommandErrors(array $errors)
|
||||
{
|
||||
// log connection errors to the web service
|
||||
// log connection errors
|
||||
ob_start();
|
||||
foreach ($errors as $key => $value) {
|
||||
echo "\n\n$key : \n";
|
||||
print_r($value);
|
||||
}
|
||||
$write_string = ob_get_clean();
|
||||
file_put_contents(dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . "logs" . DIRECTORY_SEPARATOR . "errors_command.log", $write_string);
|
||||
file_put_contents(OUTPUT_PATH . DIRECTORY_SEPARATOR . "logs" . DIRECTORY_SEPARATOR . "errors_command.log", $write_string);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,12 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Package MVC\Classe
|
||||
* @author Emmanuel ROY
|
||||
* @license MIT-licence (open source)
|
||||
* @version 3.5
|
||||
*/
|
||||
|
||||
namespace MVC\Classe;
|
||||
|
||||
class Modele
|
||||
|
@ -30,11 +37,21 @@ class Modele
|
|||
$this->page[$matches[1]] = $matches[2];
|
||||
}
|
||||
}
|
||||
$this->page['url_params'] = $base_param['params'];
|
||||
|
||||
$this->page['all_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'];
|
||||
$this->page['all_params'] = $base_param['params'];
|
||||
//export nom a nom les variable dans la superglobale $_GET
|
||||
foreach($base_param['params'] as $key => $value){
|
||||
$_GET[$key] = $value;
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,8 @@ class Modular
|
|||
break;
|
||||
case "symfony":
|
||||
break;
|
||||
case "laravel":
|
||||
break;
|
||||
case "wordpress":
|
||||
if (isset($options[0])) {
|
||||
switch ($options[0]) {
|
||||
|
@ -92,35 +94,69 @@ class Modular
|
|||
|
||||
public function load($type = "symfony")
|
||||
{
|
||||
ob_start();
|
||||
|
||||
global $buffer_sand;
|
||||
switch ($type) {
|
||||
case "gitlist":
|
||||
ob_start(array('\\MVC\\Classe\\Modular', 'rappel'),0,PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_FLUSHABLE);
|
||||
$level = ob_get_level();
|
||||
require MODULES_PATH . DIRECTORY_SEPARATOR . $this->getAppName() . DIRECTORY_SEPARATOR . "index.php";
|
||||
break;
|
||||
case "symfony":
|
||||
ob_start(array('\\MVC\\Classe\\Modular', 'rappel'),0,PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_FLUSHABLE);
|
||||
$level = ob_get_level();
|
||||
$path = MODULES_PATH . DIRECTORY_SEPARATOR . $this->getAppName() . DIRECTORY_SEPARATOR . "public" . DIRECTORY_SEPARATOR . "index.php";
|
||||
return require MODULES_PATH . DIRECTORY_SEPARATOR . $this->getAppName() . DIRECTORY_SEPARATOR . "public" . DIRECTORY_SEPARATOR . "index.php";
|
||||
break;
|
||||
case "laravel":
|
||||
ob_start(array('\\MVC\\Classe\\Modular', 'rappel'),0,PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_FLUSHABLE);
|
||||
$level = ob_get_level();
|
||||
require MODULES_PATH . DIRECTORY_SEPARATOR . $this->getAppName() . DIRECTORY_SEPARATOR . "public" . DIRECTORY_SEPARATOR . "index.php";
|
||||
break;
|
||||
case "wordpress":
|
||||
ob_start(array('\\MVC\\Classe\\Modular', 'rappel'),0,PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_FLUSHABLE);
|
||||
$level = ob_get_level();
|
||||
require MODULES_PATH . DIRECTORY_SEPARATOR . $this->getAppName() . $this->subapp_dir . DIRECTORY_SEPARATOR . $this->subfile;
|
||||
break;
|
||||
case "prestashop":
|
||||
ob_start(array('\\MVC\\Classe\\Modular', 'rappel'),0,PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_FLUSHABLE);
|
||||
$level = ob_get_level();
|
||||
require MODULES_PATH . DIRECTORY_SEPARATOR . $this->getAppName() . $this->subapp_dir . DIRECTORY_SEPARATOR . "index.php";
|
||||
break;
|
||||
case "phplist":
|
||||
ob_start(array('\\MVC\\Classe\\Modular', 'rappel'),0,PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_FLUSHABLE);
|
||||
$level = ob_get_level();
|
||||
require MODULES_PATH . DIRECTORY_SEPARATOR . $this->getAppName() . $this->subapp_dir . DIRECTORY_SEPARATOR . "index.php";
|
||||
break;
|
||||
case "wanewsletter":
|
||||
ob_start(array('\\MVC\\Classe\\Modular', 'rappel'),0,PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_FLUSHABLE);
|
||||
$level = ob_get_level();
|
||||
require MODULES_PATH . DIRECTORY_SEPARATOR . $this->getAppName() . $this->subapp_dir . DIRECTORY_SEPARATOR . $this->subfile;
|
||||
break;
|
||||
case "phpmynewsletter":
|
||||
ob_start(array('\\MVC\\Classe\\Modular', 'rappel'),0,PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_FLUSHABLE);
|
||||
$level = ob_get_level();
|
||||
require MODULES_PATH . DIRECTORY_SEPARATOR . $this->getAppName() . $this->subapp_dir . DIRECTORY_SEPARATOR . $this->subfile;
|
||||
break;
|
||||
}
|
||||
|
||||
$data = ob_get_contents();
|
||||
$buffer_sand = "";
|
||||
if (ob_get_level() == $level) {
|
||||
if (ob_get_level() > 1) {
|
||||
$buffer_sand = ob_get_contents();
|
||||
ob_end_clean();
|
||||
|
||||
return $data;
|
||||
} else {
|
||||
$buffer_sand = "BUFFER CLOSURE BY FRAMEWORK !<br/>".$buffer_sand;
|
||||
}
|
||||
}else{
|
||||
$final_level = ob_get_level();
|
||||
$buffer_sand = "BUFFER LEVEL $level CLOSURE $final_level BY FRAMEWORK !<br/>".$buffer_sand;
|
||||
}
|
||||
return $buffer_sand;
|
||||
}
|
||||
public static function rappel($buffer)
|
||||
{
|
||||
global $buffer_sand;
|
||||
$buffer_sand = $buffer;
|
||||
// remplace toutes les pommes par des carottes
|
||||
return $buffer;
|
||||
}
|
||||
}
|
||||
|
|
84
application/class/TwigControlleurAction.php
Normal file
84
application/class/TwigControlleurAction.php
Normal file
|
@ -0,0 +1,84 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace MVC\Classe;
|
||||
|
||||
|
||||
/**
|
||||
* Class MyActionTwigExtension
|
||||
* with call {{ static_call("AppBundle\Entity\YourEntity", "GetSomething", ["var1", "var2"]) }}
|
||||
* other {{ action("AppBundle\Entity\YourEntity", "GetSomething", ["var1", "var2"]) }}
|
||||
*
|
||||
* @package MVC\Classe
|
||||
*/
|
||||
|
||||
class TwigControlleurAction extends \Twig\Extension\AbstractExtension
|
||||
{
|
||||
/**
|
||||
* Returns a list of functions to add to the existing list.
|
||||
*
|
||||
* @return \Twig\TwigFunction[]
|
||||
*/
|
||||
public function getFunctions() {
|
||||
return array(
|
||||
new \Twig\TwigFunction("action", array($this, "inserer")),
|
||||
new \Twig\TwigFunction("call", array($this, "getClassMethodStatic")),
|
||||
new \Twig\TwigFunction("session", array($this, "afficheSession")),
|
||||
new \Twig\TwigFunction("server", array($this, "afficheServer"))
|
||||
);
|
||||
}
|
||||
|
||||
public function afficheServer($key_var = ''){
|
||||
if($key_var !== ""){
|
||||
if(isset($_SERVER[$key_var])) {
|
||||
return $_SERVER[$key_var];
|
||||
}else{
|
||||
return null;
|
||||
}
|
||||
}else {
|
||||
return $_SERVER;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public function afficheSession($key_var = ''){
|
||||
if($key_var !== ""){
|
||||
if(isset($_SESSION[$key_var])) {
|
||||
return $_SESSION[$key_var];
|
||||
}else{
|
||||
return null;
|
||||
}
|
||||
}else {
|
||||
return $_SESSION;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function inserer($action, $data = array())
|
||||
{
|
||||
//on extrait la classe d'appel de l'action
|
||||
$action = explode('.', $action);
|
||||
$class = ucfirst($action[0]) . "Action";
|
||||
//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);
|
||||
}
|
||||
} else {
|
||||
/*HandleError*/
|
||||
}
|
||||
}
|
||||
public static function getClassMethodStatic($class, $method, $args = array())
|
||||
{
|
||||
return $class::$method(...$args);
|
||||
}
|
||||
}
|
|
@ -1,8 +1,13 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Classe;
|
||||
/**
|
||||
* Package MVC\Classe
|
||||
* @author Emmanuel ROY
|
||||
* @license MIT-licence (open source)
|
||||
* @version 3.5
|
||||
*/
|
||||
|
||||
//require_once dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR."config".DIRECTORY_SEPARATOR."define-constantes.php";
|
||||
namespace MVC\Classe;
|
||||
|
||||
class Url
|
||||
{
|
||||
|
@ -37,32 +42,47 @@ class Url
|
|||
}
|
||||
}
|
||||
|
||||
//print_r($urlParts);
|
||||
if (isset($urlParts[0])) {
|
||||
//Récupération du nom de la page
|
||||
($urlParts[0] == 'index' || $urlParts[0] == '') ? $page['name'] = 'index' : $page['name'] = $urlParts[0];
|
||||
if (isset($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];
|
||||
unset($urlParts[1]);
|
||||
}
|
||||
|
||||
//Mise en place du statut de l'application
|
||||
switch(APP_STATE){
|
||||
case "CLOSED":
|
||||
$page['name'] = "error-application-closed";
|
||||
break;
|
||||
case "MAINTAINED":
|
||||
$page['name'] = "error-application-maintained";
|
||||
break;
|
||||
case "OPEN":
|
||||
if(\MVC\Classe\Application::is_under_update()) {
|
||||
$page['name'] = "error-application-maintained";
|
||||
break;
|
||||
}
|
||||
default:
|
||||
}
|
||||
|
||||
//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
|
||||
//si un module symfony n'est pas reférencé avec le nom de la page, on renvoi une erreur
|
||||
if (!in_array($page['name'], $this->registre->getIndex())) {
|
||||
$page['name'] = 'error';
|
||||
$page['params'] = array();
|
||||
|
@ -71,8 +91,9 @@ class Url
|
|||
} else {
|
||||
foreach ($urlParts as $key => $value) {
|
||||
$values[] = $value;
|
||||
$keys[] = $key;
|
||||
//$keys[] = $key;
|
||||
}
|
||||
//$page['params'] = array_combine($keys, $values);
|
||||
$page['params'] = $values;
|
||||
}
|
||||
|
||||
|
@ -81,14 +102,26 @@ 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) {
|
||||
if ($key % 2 == 0) {
|
||||
$values[] = $value;
|
||||
$keys[] = $key;
|
||||
} else {
|
||||
$keys[] = $value;
|
||||
}
|
||||
$page['params'] = $values;
|
||||
}
|
||||
$page['params'] = array_combine($keys, $values);
|
||||
// sinon c'est une page normal du framework
|
||||
} else {
|
||||
$values = array();
|
||||
$keys = array();
|
||||
if($page['control']){
|
||||
foreach ($urlParts as $key => $value) {
|
||||
if ($key % 2 == 1) {
|
||||
$values[] = $value;
|
||||
} else {
|
||||
$keys[] = $value;
|
||||
}
|
||||
}
|
||||
}else {
|
||||
foreach ($urlParts as $key => $value) {
|
||||
if ($key % 2 == 0) {
|
||||
$values[] = $value;
|
||||
|
@ -96,11 +129,8 @@ 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,29 +142,60 @@ 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'] . 'RestReponse.php';
|
||||
if (!file_exists($pageFile)) {
|
||||
$pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'HttpReponse.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'] . 'RestReponse.php';
|
||||
if (!file_exists($pageFile)) {
|
||||
$pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'HttpReponse.php';
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'PUT':
|
||||
case 'DELETE':
|
||||
$page['name'] = ucfirst($page['name']);
|
||||
$pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'RestReponse.php';
|
||||
}
|
||||
}
|
||||
|
||||
//Test sur l'existence de la page actuelle et renvoi sur le controlleur 404 d'erreur si besoin
|
||||
if (!file_exists($pageFile)) {
|
||||
if ($appRequest) {
|
||||
$page['name'] = 'Error';
|
||||
$pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'RestReponse.php';
|
||||
if (!file_exists($pageFile)) {
|
||||
$pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'HttpReponse.php';
|
||||
}
|
||||
} else {
|
||||
$page['name'] = 'error';
|
||||
$pageFile = CONTROLLERS_PATH . DIRECTORY_SEPARATOR . $page['name'] . '.php';
|
||||
if (!file_exists($pageFile)) {
|
||||
$page['name'] = ucfirst($page['name']);
|
||||
$pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'RestReponse.php';
|
||||
if (!file_exists($pageFile)) {
|
||||
$pageFile = CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'HttpReponse.php';
|
||||
if (!file_exists($pageFile)) {
|
||||
//FrameWork : expose undefined controlleur error
|
||||
// TODO: Send SANDerror
|
||||
die("le controlleur 404 d'erreur n'existe pas : \n"
|
||||
. CONTROLLERS_PATH . DIRECTORY_SEPARATOR . $page['name'] . '.php' . "\n"
|
||||
. "ou l'un des controlleurs 404 (REST ou HTTP) n'existe pas : \n"
|
||||
. CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'RestReponse.php \n'
|
||||
. " ou \n"
|
||||
. CONTROLLER_PATH . DIRECTORY_SEPARATOR . $page['name'] . 'HttpReponse.php');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->page = $page;
|
||||
|
@ -155,15 +216,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 = '';
|
||||
|
@ -191,11 +243,16 @@ class Url
|
|||
} else {
|
||||
$scheme = 'http';
|
||||
}
|
||||
$base_url = $scheme . "://" . $url;
|
||||
$url = $base_url;
|
||||
$scheme_tab = explode("://",PATH_URL);
|
||||
if( $scheme !== $scheme_tab[0]){
|
||||
$scheme = $scheme_tab[0];
|
||||
}
|
||||
$url = $scheme . "://" . $url;
|
||||
}else{
|
||||
$base_url = PATH_URL;
|
||||
$url = $base_url . BASE_SERVER_DIRECTORY;
|
||||
$url = PATH_URL;
|
||||
}
|
||||
if( substr($url , -1) == "/"){
|
||||
$url = substr($url, 0, -1);
|
||||
}
|
||||
if ($isControlPatern) {
|
||||
$uri = self::controlLink_rewrite($page, $params);
|
||||
|
@ -210,4 +267,81 @@ 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';
|
||||
}
|
||||
$scheme_tab = explode("://",PATH_URL);
|
||||
if( $scheme !== $scheme_tab[0]){
|
||||
$scheme = $scheme_tab[0];
|
||||
}
|
||||
$url = $scheme . "://" . $url;
|
||||
}else{
|
||||
$url = PATH_URL;
|
||||
}
|
||||
if( substr($url , -1) == "/"){
|
||||
$url = substr($url, 0, -1);
|
||||
}
|
||||
if( substr($url . "/" . BASE_SERVER_DIRECTORY, -1) == "/"){
|
||||
return substr($url . "/" . BASE_SERVER_DIRECTORY, 0, -1);
|
||||
}else {
|
||||
return $url . "/" . BASE_SERVER_DIRECTORY;
|
||||
}
|
||||
}
|
||||
|
||||
public static function getPageName(){
|
||||
|
||||
$url = parse_url($_SERVER['REQUEST_URI']);
|
||||
$urlTrim = trim($url['path'], '/');
|
||||
$urlParts = explode('/', $urlTrim);
|
||||
|
||||
//suppression des sous repertoires du BASE_SERVER_DIRECTORY
|
||||
$basePath = explode( '/', BASE_SERVER_DIRECTORY);
|
||||
foreach($basePath as $subDir) {
|
||||
if ($urlParts[0] == $subDir) {
|
||||
array_shift($urlParts);
|
||||
}
|
||||
}
|
||||
|
||||
//Récupération du nom de la page
|
||||
if (isset($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';
|
||||
}
|
||||
|
||||
$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];
|
||||
unset($urlParts[1]);
|
||||
}
|
||||
return $page;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiens le fragment depuis une variable serveur,
|
||||
* ce qui est selon moi possible avec une bonne configuration serveur
|
||||
* sauf si le fragment est bloqué au niveau du navigateur (rétention d'informations)
|
||||
*
|
||||
* Selon QASTACK
|
||||
* => https://qastack.fr/programming/2317508/get-fragment-value-after-hash-from-a-url-in-php
|
||||
* ce n'est pas possible avec HTTP "standard" car cette valeur n'est jamais envoyée au serveur
|
||||
* (par conséquent, elle ne sera pas disponible dans $_SERVER["REQUEST_URI"]ou similaire variables prédéfinies)
|
||||
*/
|
||||
public static function getFragment(){
|
||||
$fragment = parse_url($_SERVER['REQUEST_URI'],PHP_URL_FRAGMENT);
|
||||
return $fragment;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,12 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Package MVC\Classe
|
||||
* @author Emmanuel ROY
|
||||
* @license MIT-licence (open source)
|
||||
* @version 3.5
|
||||
*/
|
||||
|
||||
namespace MVC\Classe;
|
||||
|
||||
class Vue
|
||||
|
@ -7,31 +14,53 @@ class Vue
|
|||
public $ecran;
|
||||
public $block_body;
|
||||
|
||||
public function __construct($application)
|
||||
public function __construct($page_params)
|
||||
{
|
||||
$templateData = array();
|
||||
extract($application->modele->page);
|
||||
//$templateData = array();
|
||||
$url_params = array();
|
||||
$templateData = $page_params;
|
||||
|
||||
extract($page_params);
|
||||
//de base on ajoute les parametres du .model et ceux provenant de l'url
|
||||
foreach ($page_params['all_params'] as $key => $value) {
|
||||
//$templateData[$key] = $value;
|
||||
$_GET[$key] = $value;
|
||||
$url_params[$key] = $value;
|
||||
}
|
||||
|
||||
|
||||
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 (file_exists(VIEW_PATH.DIRECTORY_SEPARATOR."view".DIRECTORY_SEPARATOR.$name.".blade.php")) {
|
||||
|
||||
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);
|
||||
$renderer->addExtension(new \MVC\Classe\TwigControlleurAction);
|
||||
$name .= '.html';
|
||||
break;
|
||||
case 'blade':
|
||||
|
@ -39,15 +68,16 @@ class Vue
|
|||
$renderer = new \Windwalker\Renderer\BladeRenderer($paths, array('cache_path' => VIEW_PATH . DIRECTORY_SEPARATOR . "cache"));
|
||||
}
|
||||
|
||||
|
||||
//de base on ajoute les parametres du .model et ceux provenant de l'url
|
||||
foreach ($application->modele->page as $key => $value) {
|
||||
foreach ($page_params as $key => $value) {
|
||||
$templateData[$key] = $value;
|
||||
}
|
||||
|
||||
//WINWALKER TEMPLATING ENGINE RENDER
|
||||
echo $renderer->render($name, $templateData);
|
||||
} else {
|
||||
include CONTROLLER_PATH . DIRECTORY_SEPARATOR . $name . '.php';
|
||||
}
|
||||
$this->ecran = ob_get_clean();
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<?php
|
||||
|
||||
|
||||
// De base laisser vide,
|
||||
// sauf si l'application est hebergé sur de multiples sous-repertoire en ajoutant le slash_final
|
||||
// par exemple : "my-app/"
|
||||
|
@ -7,6 +8,16 @@
|
|||
define("BASE_SERVER_DIRECTORY", "");
|
||||
|
||||
// Optionnel! il n'est nécessaire que si vous l'utilisez dans les fichiers de traitement ou dans une commande console
|
||||
define('PATH_URL',"http://www.domain.org/");
|
||||
define('PATH_URL', $_SERVER['REQUEST_SCHEME'] . "://localhost.localdomain");
|
||||
|
||||
|
||||
//Possible values are DEV DEVEL PROD PREPROD TEST
|
||||
//only PROD send email to right user
|
||||
define('ENV', "DEV");
|
||||
|
||||
//Possible values are OPEN CLOSED MAINTAINED
|
||||
define('APP_STATE', "OPEN");
|
||||
|
||||
define('MAINTENANCE_DATE_DEBUT', '2021-07-30 12:00');
|
||||
define('MAINTENANCE_DATE_FIN', '2021-07-30 14:00');
|
||||
define('MAINTENANCE_MESSAGE', "Mise à jour de la base de données");
|
3
application/config/console-parameters.php.skel
Normal file
3
application/config/console-parameters.php.skel
Normal file
|
@ -0,0 +1,3 @@
|
|||
<?php
|
||||
|
||||
define("LINE_FEED", "\n");
|
|
@ -13,5 +13,5 @@ define("CONTROLLER_PATH", APPLICATION_PATH . DIRECTORY_SEPARATOR . "include" . D
|
|||
define("TRAITEMENT_PATH", APPLICATION_PATH . DIRECTORY_SEPARATOR . "traitements");
|
||||
define("PUBLIC_PATH", dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "public");
|
||||
define("CONSOLE_PATH", dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "console");
|
||||
define("OUTPUT_PATH", dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "output");
|
||||
define("DATA_PATH", dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "data");
|
||||
|
6
application/config/ldap-parameters.php
Normal file
6
application/config/ldap-parameters.php
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?php
|
||||
|
||||
define('LDAP_USER','cn=name, ou=group, dc=domain, dc=tld');
|
||||
define('LDAP_PASSWORD','password');
|
||||
define('LDAP_URL',"ldap://ldap.domain.tld");
|
||||
define('LDAP_PORT',"389");
|
|
@ -1,51 +1,86 @@
|
|||
<?php
|
||||
|
||||
use MVC\Classe\Dumper;
|
||||
use MVC\Classe\HttpMethodRequete;
|
||||
use MVC\Classe\Implement\Action;
|
||||
use MVC\Classe\Url;
|
||||
use MVC\Classe\Response;
|
||||
|
||||
class DefaultAction extends Action
|
||||
class DefaultAction extends \MVC\Classe\Implement\Action
|
||||
{
|
||||
public function default($data)
|
||||
public function default()
|
||||
{
|
||||
/**your action algorythm**/
|
||||
if (isset($data[0])) {
|
||||
$var1 = $data[0];
|
||||
if (isset($data1)) {
|
||||
$var1 = $data1;
|
||||
} else {
|
||||
$var1 = 1;
|
||||
}
|
||||
if (isset($data[1])) {
|
||||
$var2 = $data[1];
|
||||
if (isset($data2)) {
|
||||
$var2 = $data2;
|
||||
} else {
|
||||
$var2 = 2;
|
||||
}
|
||||
if (isset($data[2])) {
|
||||
$var3 = $data[2];
|
||||
if (isset($data3)) {
|
||||
$var3 = $data3;
|
||||
} else {
|
||||
$var3 = 3;
|
||||
}
|
||||
|
||||
return $this->render('action', array('var1' => $var1, 'var2' => $var2, 'var3' => $var3));
|
||||
}
|
||||
|
||||
public function variableSlug($data)
|
||||
public function defaultBlade($data1,$data2,$data3)
|
||||
{
|
||||
|
||||
/**your action algorythm**/
|
||||
if (isset($data[0])) {
|
||||
$var1 = $data[0];
|
||||
if (isset($data1)) {
|
||||
$var1 = $data1;
|
||||
} else {
|
||||
$var1 = 1;
|
||||
}
|
||||
if (isset($data[1])) {
|
||||
$var2 = $data[1];
|
||||
if (isset($data2)) {
|
||||
$var2 = $data2;
|
||||
} else {
|
||||
$var2 = 2;
|
||||
}
|
||||
if (isset($data[2])) {
|
||||
$var3 = $data[2];
|
||||
if (isset($data3)) {
|
||||
$var3 = $data3;
|
||||
} else {
|
||||
$var3 = 3;
|
||||
}
|
||||
|
||||
return $this->render('action', array('var1' => $var1, 'var2' => $var2, 'var3' => $var3),'blade');
|
||||
}
|
||||
public function defaultTwig($data1,$data2,$data3)
|
||||
{
|
||||
/**your action algorythm**/
|
||||
if (isset($data1)) {
|
||||
$var1 = $data1;
|
||||
} else {
|
||||
$var1 = 1;
|
||||
}
|
||||
if (isset($data2)) {
|
||||
$var2 = $data2;
|
||||
} else {
|
||||
$var2 = 2;
|
||||
}
|
||||
if (isset($data3)) {
|
||||
$var3 = $data3;
|
||||
} else {
|
||||
$var3 = 3;
|
||||
}
|
||||
|
||||
return $this->render('action', array('var1' => $var1, 'var2' => $var2, 'var3' => $var3),'twig');
|
||||
}
|
||||
|
||||
public function variableSlug($data1,$data2,$data3)
|
||||
{
|
||||
/**your action algorythm**/
|
||||
if (isset($data1)) {
|
||||
$var1 = $data1;
|
||||
} else {
|
||||
$var1 = 1;
|
||||
}
|
||||
if (isset($data2)) {
|
||||
$var2 = $data2;
|
||||
} else {
|
||||
$var2 = 2;
|
||||
}
|
||||
if (isset($data3)) {
|
||||
$var3 = $data3;
|
||||
} else {
|
||||
$var3 = 3;
|
||||
}
|
||||
|
@ -58,10 +93,10 @@ class DefaultAction extends Action
|
|||
$data = array('myval' => 25);
|
||||
//Dumper::dump($data);
|
||||
\MVC\Classe\Logger::addLog('action', 'http11 make request');
|
||||
$request = new HttpMethodRequete();
|
||||
$request->setUrl(Url::absolute_link_rewrite(false, 'accueil', ['var10'=>'val10']))->get($data);
|
||||
$request->setUrl(Url::absolute_link_rewrite(false, 'accueil', ['var10'=>'val10']))->post($data);
|
||||
$request->setUrl(Url::absolute_link_rewrite(false, 'accueil', ['var10'=>'val10']))->put($data);
|
||||
$request->setUrl(Url::absolute_link_rewrite(false, 'accueil', ['var10'=>'val10']))->delete($data);
|
||||
$request = new \MVC\Classe\HttpMethodRequete();
|
||||
$request->setUrl(\MVC\Classe\Url::absolute_link_rewrite(false, 'accueil', ['var10'=>'val10']))->get($data);
|
||||
$request->setUrl(\MVC\Classe\Url::absolute_link_rewrite(false, 'accueil', ['var10'=>'val10']))->post($data);
|
||||
$request->setUrl(\MVC\Classe\Url::absolute_link_rewrite(false, 'accueil', ['var10'=>'val10']))->put($data);
|
||||
$request->setUrl(\MVC\Classe\Url::absolute_link_rewrite(false, 'accueil', ['var10'=>'val10']))->delete($data);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ use MVC\Classe\Response;
|
|||
|
||||
class MenudocsAction extends Action
|
||||
{
|
||||
public function default($data)
|
||||
public function default()
|
||||
{
|
||||
|
||||
|
||||
|
|
|
@ -26,8 +26,8 @@ class DocConduit extends Conduit
|
|||
|
||||
asort($files);
|
||||
|
||||
$this->templateData['page_title'] = 'Foo';
|
||||
$this->templateData['description'] = 'DocConduit';
|
||||
$this->templateData['page_title'] = 'Sommaire de la documentation du Framework';
|
||||
$this->templateData['description'] = 'Sommaire, Documentation, SAND, Framework';
|
||||
$this->templateData['files'] = $files;
|
||||
|
||||
return $this->render('docs', $this->templateData);
|
||||
|
@ -37,13 +37,39 @@ class DocConduit extends Conduit
|
|||
public function readfile()
|
||||
{
|
||||
\MVC\Object\Session::createAndTestSession();
|
||||
|
||||
$files = array();
|
||||
|
||||
if ($handle = opendir(DATA_PATH . '/docs')) {
|
||||
|
||||
while (false !== ($entry = readdir($handle))) {
|
||||
|
||||
if ($entry != "." && $entry != "..") {
|
||||
|
||||
$files[] = $entry;
|
||||
}
|
||||
}
|
||||
|
||||
closedir($handle);
|
||||
}
|
||||
|
||||
asort($files);
|
||||
|
||||
$key_file = array_search($this->file,$files);
|
||||
|
||||
$markdown = file_get_contents(DATA_PATH . '/docs/' . $this->file);
|
||||
|
||||
$my_html = MarkdownExtra::defaultTransform($markdown);
|
||||
|
||||
$this->templateData['page_title'] = 'Foo';
|
||||
$this->templateData['description'] = 'DocConduit';
|
||||
$this->templateData['page_title'] = 'Documentation du Framework';
|
||||
$this->templateData['description'] = 'Documentation, SAND, Framework';
|
||||
$this->templateData['data'] = $my_html;
|
||||
if(isset($files[$key_file - 1])) {
|
||||
$this->templateData['previous'] = $files[$key_file - 1];
|
||||
}
|
||||
if(isset($files[$key_file + 1])) {
|
||||
$this->templateData['next'] = $files[$key_file + 1];
|
||||
}
|
||||
|
||||
return $this->render('docs', $this->templateData);
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Controlleur permettant d'afficher la page d'erreur lors d'une fermeture de l'application
|
||||
*/
|
|
@ -0,0 +1,5 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Controlleur permettant d'afficher la page d'erreur lors d'une maintenance de l'application
|
||||
*/
|
|
@ -1 +1,6 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Controlleur permettant d'afficher la page d'erreur 404 page inexistante
|
||||
*/
|
||||
|
||||
|
|
5
application/include/controlleurs/feedback.php
Normal file
5
application/include/controlleurs/feedback.php
Normal file
|
@ -0,0 +1,5 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Controlleur permettant d'afficher le recevoir un feedback
|
||||
*/
|
6
application/include/controlleurs/get-params.php
Normal file
6
application/include/controlleurs/get-params.php
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?php
|
||||
|
||||
\MVC\Classe\Dumper::dump($_GET);
|
||||
\MVC\Classe\Dumper::dump($url_params);
|
||||
\MVC\Classe\Dumper::dump($templateData);
|
||||
\MVC\Classe\Dumper::dump($GLOBALS);
|
|
@ -8,5 +8,7 @@ use MVC\Classe\Logger;
|
|||
|
||||
\MVC\Classe\ControlleurAction::inserer('default.makeHttp11', []);
|
||||
|
||||
$templateData = array("templating_a"=>'blade',"templating_b"=>'twig',"templating_c"=>'edge');
|
||||
$templateData["templating_a"] ='blade';
|
||||
$templateData["templating_b"] ='twig';
|
||||
$templateData["templating_c"] ='edge';
|
||||
Logger::addLog('ok', 'Hello world');
|
||||
|
|
7
application/include/controlleurs/react.php
Normal file
7
application/include/controlleurs/react.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
|
||||
use MVC\Classe\Logger;
|
||||
|
||||
$templateData = array("templating_a"=>'blade',"templating_b"=>'twig',"templating_c"=>'edge');
|
||||
Logger::addLog('ok', 'Hello world');
|
7
application/include/controlleurs/vuejs.php
Normal file
7
application/include/controlleurs/vuejs.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
|
||||
use MVC\Classe\Logger;
|
||||
|
||||
$templateData = array("templating_a"=>'blade',"templating_b"=>'twig',"templating_c"=>'edge');
|
||||
Logger::addLog('ok', 'Hello world');
|
|
@ -0,0 +1,6 @@
|
|||
name : error-application-closed
|
||||
page_title : Page de fermeture de l'application
|
||||
description : UFC - Page de fermeture de l'application
|
||||
engine : blade
|
||||
authentification : no
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
name : error-application-maintained
|
||||
page_title : Page de maintenance de l'application
|
||||
description : UFC - Page de maintenance de l'application
|
||||
engine : blade
|
||||
authentification : no
|
||||
|
8
application/include/modeles/feedback.model
Normal file
8
application/include/modeles/feedback.model
Normal file
|
@ -0,0 +1,8 @@
|
|||
name : feedback
|
||||
page_title : Page de retour d'expérience utilisateur de l'application
|
||||
description : UFC - Page de retour d'expérience utilisateur de l'application
|
||||
engine : blade
|
||||
authentification : no
|
||||
ariane : {acceuil, retour d'expérience utilisateur}
|
||||
arianelink : {index, feedback}
|
||||
|
|
@ -2,7 +2,7 @@ name : index
|
|||
page_title : Accueil de l'application
|
||||
description : zatou stra bracadabla
|
||||
|
||||
engine : blade
|
||||
engine : twig
|
||||
authentification : yes
|
||||
|
||||
ariane : {acceuil}
|
||||
|
|
8
application/include/modeles/react.model
Normal file
8
application/include/modeles/react.model
Normal file
|
@ -0,0 +1,8 @@
|
|||
name : react
|
||||
page_title : module_title
|
||||
description : module_description
|
||||
engine : blade
|
||||
authentification : yes
|
||||
ariane : {acceuil, react}
|
||||
arianelink : {index, react}
|
||||
|
8
application/include/modeles/vuejs.model
Normal file
8
application/include/modeles/vuejs.model
Normal file
|
@ -0,0 +1,8 @@
|
|||
name : vuejs
|
||||
page_title : module_title
|
||||
description : module_description
|
||||
engine : blade
|
||||
authentification : yes
|
||||
ariane : {acceuil, vuejs}
|
||||
arianelink : {index, vuejs}
|
||||
|
|
@ -8,11 +8,13 @@
|
|||
style="background: rgba(0, 0, 0, 0.59);">
|
||||
<div class="container">
|
||||
<ul class="top-menu">
|
||||
{{\MVC\Object\Environment::getTextEnvironment()}}
|
||||
<li @if($name == 'docs_route' || $name == 'docs_name_route') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'docs', []) }}">Documentation</a></li>
|
||||
<li @if($name == 'depots') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'gitlist/SAND-FrameWork', []) }}">Dépot</a></li>
|
||||
<li @if($name == 'donate') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Donate', []) }}">Donate</a></li>
|
||||
<li @if($name == 'cgu') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'CGU', []) }}"> CGU Terms</a></li>
|
||||
<li @if($name == 'policy') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Policy', []) }}">Policy</a></li>
|
||||
<li @if($name == 'feedback') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Feedback', []) }}">Feedback</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -51,12 +53,14 @@
|
|||
</header>
|
||||
<!-- end: Header -->
|
||||
<!-- Subbar -->
|
||||
@if(isset($authentification) && $authentification == 'yes')
|
||||
<div id="subbar" class="fullwidth">
|
||||
<div class="container">
|
||||
<span style="float:left;">Vous êtes connecté en tant que {{$_SESSION['user_login']}}</span>
|
||||
<span style="float:right;"><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Logout', []) }}">Se Deconnecter</a></span>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
<!-- end: Subbar -->
|
||||
|
||||
<!-- Breadcrumbs -->
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
{% extends "system.html.twig" %}
|
||||
|
||||
{% block body %}
|
||||
<!-- Body Inner -->
|
||||
|
@ -7,11 +8,12 @@
|
|||
style="background: rgba(0, 0, 0, 0.59);">
|
||||
<div class="container">
|
||||
<ul class="top-menu">
|
||||
<li {% if name == 'docs_route' || name == 'docs_name_route' %} class="actual" {% endif %} ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'docs', []) }}">Documentation</a></li>
|
||||
<li {% if name == 'depots' %} class="actual" {% endif %} ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'gitlist/SAND-FrameWork', []) }}">Dépot</a></li>
|
||||
<li {% if name == 'donate' %} class="actual" {% endif %} ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Donate', []) }}">Donate</a></li>
|
||||
<li {% if name == 'cgu' %} class="actual" {% endif %} ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'CGU', []) }}"> CGU Terms</a></li>
|
||||
<li {% if name == 'policy' %} class="actual" {% endif %} ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Policy', []) }}">Policy</a></li>
|
||||
{{call('\\MVC\\Object\\Environment','getTextEnvironment',[]) | raw}}
|
||||
<li {% if name == 'docs_route' or name == 'docs_name_route' %} class="actual" {% endif %} ><a href="{{ call("\\MVC\\Classe\\Url","link_rewrite",[ false, 'docs', []]) }}">Documentation</a></li>
|
||||
<li {% if name == 'depots' %} class="actual" {% endif %} ><a href="{{ call("\\MVC\\Classe\\Url","link_rewrite",[ false, 'gitlist/SAND-FrameWork', []]) }}">Dépot</a></li>
|
||||
<li {% if name == 'donate' %} class="actual" {% endif %} ><a href="{{ call("\\MVC\\Classe\\Url","link_rewrite",[ false, 'Donate', []]) }}">Donate</a></li>
|
||||
<li {% if name == 'cgu' %} class="actual" {% endif %} ><a href="{{ call("\\MVC\\Classe\\Url","link_rewrite",[ false, 'CGU', []]) }}"> CGU Terms</a></li>
|
||||
<li {% if name == 'policy' %} class="actual" {% endif %} ><a href="{{ call("\\MVC\\Classe\\Url","link_rewrite",[ false, 'Policy', []]) }}">Policy</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -38,8 +40,8 @@
|
|||
<!--end: logo-->
|
||||
<nav>
|
||||
<ul>
|
||||
<li {% if name == 'index' %} class="actual" {% endif %} ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Index', []) }}">Index</a></li>
|
||||
<li {% if name == 'admin' %} class="actual" {% endif %} ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Admin', []) }}">Admin</a></li>
|
||||
<li {% if name == 'index' %} class="actual" {% endif %} ><a href="{{ call("\\MVC\\Classe\\Url","link_rewrite",[false, 'Index', []]) }}">Index</a></li>
|
||||
<li {% if name == 'admin' %} class="actual" {% endif %} ><a href="{{ call("\\MVC\\Classe\\Url","link_rewrite",[false, 'Admin', []]) }}">Admin</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
|
@ -52,24 +54,43 @@
|
|||
<!-- Subbar -->
|
||||
<div id="subbar" class="fullwidth">
|
||||
<div class="container">
|
||||
<span style="float:left;">Vous êtes connecté en tant que {{$_SESSION['user_login']}}</span>
|
||||
<span style="float:right;"><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Logout', []) }}">Se Deconnecter</a></span>
|
||||
<span style="float:left;">Vous êtes connecté en tant que {{session('user_login')}}</span>
|
||||
<span style="float:right;"><a href="{{ call("\\MVC\\Classe\\Url","link_rewrite",[ false, 'Logout', []]) }}">Se Deconnecter</a></span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end: Subbar -->
|
||||
<!-- Breadcrumbs -->
|
||||
{%if ariane is defined %}
|
||||
<div id="breadcrumbs" class="fullwidth">
|
||||
<div class="container">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
{% for value in ariane %}
|
||||
{% if value == ariane|last %}
|
||||
<li class="breadcrumb-item active" aria-current="page">{{value}}</li>
|
||||
{% else %}
|
||||
<li class="breadcrumb-item"><a href="{{call("\\MVC\\Classe\\Url","link_rewrite",[false,arianelink[value.index],[] ])}}">{{value}}</a></li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<section id="page-content">
|
||||
<div class="container">
|
||||
|
||||
<!--Alerts-->
|
||||
{% if $_SESSION['alerts'] is defined %}
|
||||
{% foreach $_SESSION['alerts'] as alert %}
|
||||
{% if not session('alerts') == null %}
|
||||
{% for alert in session('alerts') %}
|
||||
<div class="alert alert-{{alert.type}} alert-dismissible fade show" role="alert">
|
||||
<strong>{{alert.title}}</strong> {{alert.message}}.
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
</div>
|
||||
{% endforeach %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<!--end: Alerts-->
|
||||
|
||||
{% block content %}{% endblock %}
|
||||
|
||||
</div>
|
||||
|
@ -84,7 +105,7 @@
|
|||
<div class="widget">
|
||||
<div class="widget-title"></div>
|
||||
<p class="mb-5">
|
||||
<img src="{{ \MVC\Classe\Url::asset_rewrite('assets/img/1007698-ffeb3b.svg') }}" width="150">
|
||||
<img src="{{ call("\\MVC\\Classe\\Url","asset_rewrite",['assets/img/1007698-ffeb3b.svg']) }}" width="150">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -116,4 +137,4 @@
|
|||
|
||||
</div>
|
||||
<!-- end: Body Inner -->
|
||||
{% endblock %}}
|
||||
{% endblock %}
|
||||
|
|
|
@ -30,6 +30,10 @@
|
|||
@section('top-css')
|
||||
<link rel="stylesheet" href="{{ \MVC\Classe\Url::asset_rewrite('assets/bootstrap-5.0.0-beta1-dist/css/bootstrap.min.css')}}">
|
||||
<link rel="stylesheet" href="{{ \MVC\Classe\Url::asset_rewrite('assets/css/custom.css')}}">
|
||||
@if(\MVC\Classe\Browser::get() == 'Internet Explorer')
|
||||
<link rel="stylesheet" href="{{\MVC\Classe\Url::asset_rewrite('assets/html5-simple-date-input-polyfill-master/html5-simple-date-input-polyfill.css')}}">
|
||||
<!--<link rel="stylesheet" href="{{\MVC\Classe\Url::asset_rewrite('assets/hyperform-0.12.0/css/hyperform.css')}}">-->
|
||||
@endif
|
||||
@show
|
||||
|
||||
</head>
|
||||
|
@ -37,6 +41,15 @@
|
|||
<body>
|
||||
|
||||
@section('top-javascript')
|
||||
@if(\MVC\Classe\Browser::get() == 'Internet Explorer')
|
||||
<!-- Polyfill.io will load polyfills your browser needs -->
|
||||
<script src="https://polyfill.io/v3/polyfill.min.js?features=default%2CNumber.parseInt%2CNumber.parseFloat%2CArray.prototype.find%2CArray.prototype.includes"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.12.1/polyfill.min.js" integrity="sha512-uzOpZ74myvXTYZ+mXUsPhDF+/iL/n32GDxdryI2SJronkEyKC8FBFRLiBQ7l7U/PTYebDbgTtbqTa6/vGtU23A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js"></script>
|
||||
<script src="{{\MVC\Classe\Url::asset_rewrite('assets/html5-simple-date-input-polyfill-master/html5-simple-date-input-polyfill.js')}}"></script>
|
||||
<script src="{{\MVC\Classe\Url::asset_rewrite('assets/hyperform-0.12.0/dist/hyperform.js')}}"></script>
|
||||
<script>hyperform(window);</script>
|
||||
@endif
|
||||
@show
|
||||
|
||||
@yield('body')
|
||||
|
@ -45,6 +58,7 @@
|
|||
<script src="{{ \MVC\Classe\Url::asset_rewrite('assets/bootstrap-5.0.0-beta1-dist/js/bootstrap.min.js')}}"></script>
|
||||
<script src="{{ \MVC\Classe\Url::asset_rewrite('assets/js/custom.js')}}"></script>
|
||||
|
||||
@if(\MVC\Classe\Browser::get() !== 'Internet Explorer')
|
||||
<script>
|
||||
|
||||
/*
|
||||
|
@ -71,6 +85,7 @@
|
|||
}
|
||||
}
|
||||
</script>
|
||||
@endif
|
||||
@show
|
||||
|
||||
</body>
|
||||
|
|
|
@ -27,29 +27,29 @@
|
|||
<meta name="msapplication-TileColor" content="#ffffff">
|
||||
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
{% block top-css %}
|
||||
<link rel="stylesheet" href="{{ \MVC\Classe\Url::asset_rewrite('assets/bootstrap-5.0.0-beta1-dist/css/bootstrap.min.css')}}">
|
||||
<link rel="stylesheet" href="{{ \MVC\Classe\Url::asset_rewrite('assets/css/custom.css')}}">
|
||||
{% block topCss %}
|
||||
<link rel="stylesheet" href="{{ call("\\MVC\\Classe\\Url","asset_rewrite",['assets/bootstrap-5.0.0-beta1-dist/css/bootstrap.min.css'])}}">
|
||||
<link rel="stylesheet" href="{{ call("\\MVC\\Classe\\Url","asset_rewrite",['assets/css/custom.css'])}}">
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
|
||||
{% block top-javascript %}{% endblock %}
|
||||
{% block topJavascript %}{% endblock %}
|
||||
|
||||
{% block body %}{% endblock %}
|
||||
|
||||
{% block bottom-javascript %}
|
||||
<script src="{{ \MVC\Classe\Url::asset_rewrite('assets/bootstrap-5.0.0-beta1-dist/js/bootstrap.min.js')}}"></script>
|
||||
<script src="{{ \MVC\Classe\Url::asset_rewrite('assets/js/custom.js')}}"></script>
|
||||
{% block bottomJavascript %}
|
||||
<script src="{{ call("\\MVC\\Classe\\Url","asset_rewrite",['assets/bootstrap-5.0.0-beta1-dist/js/bootstrap.min.js'])}}"></script>
|
||||
<script src="{{ call("\\MVC\\Classe\\Url","asset_rewrite",['assets/js/custom.js'])}}"></script>
|
||||
|
||||
/*
|
||||
{#
|
||||
SCRIPT JS permettant de ne valider qu'une seule fois un formulaire
|
||||
ATTENTION tous les formulaires sont affecté
|
||||
Lors d'une validation bootstrap personnalisé veuillez utilisé
|
||||
la class do-resubmit sur le formulaire afin de permettre
|
||||
l'activation supplémentaire du bouton.
|
||||
*/
|
||||
#}
|
||||
<script>
|
||||
window.onload = function() {
|
||||
let PreventAllforms = document.querySelectorAll("form");
|
1
application/include/vues/view/action.html.twig
Normal file
1
application/include/vues/view/action.html.twig
Normal file
|
@ -0,0 +1 @@
|
|||
{{var1}}::{{var2}}::{{var3}}
|
|
@ -6,14 +6,22 @@
|
|||
|
||||
@section('content')
|
||||
@if (isset($files))
|
||||
|
||||
<h1>Sommaire:</h1>
|
||||
|
||||
@foreach( $files as $file)
|
||||
<a href="{{ \MVC\Classe\Url::link_rewrite( false, 'docs', ['file'=>$file]) }}">{{ $file }}</a> <br/>
|
||||
@endforeach
|
||||
@endif
|
||||
@if (isset($data))
|
||||
<div style="display:block;position:relative;width:450px;margin:auto;">
|
||||
@if (isset($previous))<a href="{{ \MVC\Classe\Url::link_rewrite( false, 'docs', ['file'=>$previous]) }}" class="btn btn-outline-info"> « Précedent</a>@endif
|
||||
<a href="{{ \MVC\Classe\Url::link_rewrite( false, 'docs', []) }}" class="btn btn-info">Sommaire</a>
|
||||
@if (isset($next))<a href="{{ \MVC\Classe\Url::link_rewrite( false, 'docs', ['file'=>$next]) }}" class="btn btn-outline-info">Suivant » </a>@endif
|
||||
</div>
|
||||
{{$data}}
|
||||
<div style="display:block;position:relative;width:450px;margin:auto;">
|
||||
@if (isset($previous))<a href="{{ \MVC\Classe\Url::link_rewrite( false, 'docs', ['file'=>$previous]) }}" class="btn btn-outline-info"> « Précedent</a>@endif
|
||||
<a href="{{ \MVC\Classe\Url::link_rewrite( false, 'docs', []) }}" class="btn btn-info">Sommaire</a>
|
||||
@if (isset($next))<a href="{{ \MVC\Classe\Url::link_rewrite( false, 'docs', ['file'=>$next]) }}" class="btn btn-outline-info">Suivant » </a>@endif
|
||||
</div>
|
||||
@endif
|
||||
@endsection
|
165
application/include/vues/view/error-application-closed.blade.php
Normal file
165
application/include/vues/view/error-application-closed.blade.php
Normal file
|
@ -0,0 +1,165 @@
|
|||
{{-- Vue Blade de la page d'erreur lors d'une fermeture de l'application--}}
|
||||
@extends('body-nomenu')
|
||||
|
||||
@section('content')
|
||||
<div id="access-denied">
|
||||
<div class="container">
|
||||
<h1>:) Oops!</h1>
|
||||
<h2>Temporairement fermée</h2>
|
||||
<h3>L'application est de retour bientôt!</h3>
|
||||
<p>
|
||||
Désolé pour cette gêne mais il se trouve que l'application est fermée à ce moment !
|
||||
<br/>
|
||||
— Le service
|
||||
<br/>
|
||||
<a href="mailto:application@localhost.fr">application@localhost.fr</a>
|
||||
</p>
|
||||
<br /><br />
|
||||
<br /><br />
|
||||
<div id="gears">
|
||||
<svg version="1.1" id="svg-animation-example" class="svg-line-drawing rtl-magazine-animation" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="720" height="310" viewBox="0 0 720 310" xml:space="preserve" aria-hidden="true" >
|
||||
<defs>
|
||||
<clipPath id="mask-page">
|
||||
<path class="stroke-alt stroke-width linecap" d="m240,275 l240,0 0,-217 -240,0z" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<!-- content page -->
|
||||
<g clip-path="url(#mask-page)">
|
||||
<g class="ani-move-page is-animated">
|
||||
<!-- section one -->
|
||||
<path class="stroke stroke-width linecap" d="m0,275 m254,-203 l212,0 0,112 -212,0z" fill="none" />
|
||||
<path class="stroke-alt stroke-width linecap" d="m0,275 m272,-172 a13 13 180 0 1 26,0 a13 13 180 0 1 -26,0" fill="none" />
|
||||
<path class="stroke stroke-width linecap" d="m0,275 m254,-203 m22,112 l34,-44 a9 9 180 0 1 13,-1 l15,16 38,-48 a5 5 180 0 1 8.4,0 l60,77" fill="none" />
|
||||
<path class="stroke stroke-width linecap" d="m0,275 m254,-67 l212,0 m-212,10 l54,0 m25,0 l54,0 m25,0 l54,0 m-212,10 l54,0 m25,0 l54,0 m25,0 l54,0" fill="none" />
|
||||
<!-- button section one -->
|
||||
<path class="stroke stroke-width linecap" d="m350,250 a10 10 180 0 1 20,0 a10 10 180 0 1 -20,0 m6.8,-1.7 l3.2,3.2 3.2,-3.2" fill="none" />
|
||||
<path class="stroke stroke-width linecap" d="m318,290 l0,430" fill="none" />
|
||||
<path class="stroke stroke-width linecap" d="m333,306 l54,0 m-54,10 l54,0 m-54,10 l133,0 m-133,10 l133,0" fill="none" />
|
||||
<path class="stroke stroke-width linecap" d="m333,356 l133,0 0,78 -133,0 0,-78 m0,90 l54,0 m-54,10 l54,0 m-54,20 133,0 0,78 -133,0 0,-78 m0,90 l54,0 m-54,10 l54,0 m-54,20 133,0 0,78 -133,0 0,-78 m0,90 l54,0 m-54,10 l54,0 m-54,20" fill="none" />
|
||||
<!-- section two -->
|
||||
<path class="stroke stroke-width linecap" d="m0,680 m0,275 m254,-203 l212,0 0,112 -212,0z" fill="none" />
|
||||
<path class="stroke-alt stroke-width linecap" d="m0,680 m0,275 m272,-172 a13 13 180 0 1 26,0 a13 13 180 0 1 -26,0" fill="none" />
|
||||
<path class="stroke stroke-width linecap" d="m0,680 m0,275 m254,-203 m22,112 l34,-44 a9 9 180 0 1 13,-1 l15,16 38,-48 a5 5 180 0 1 8.4,0 l60,77" fill="none" />
|
||||
<path class="stroke stroke-width linecap" d="m0,680 m0,275 m254,-67 l212,0 m-212,10 l54,0 m25,0 l54,0 m25,0 l54,0 m-212,10 l54,0 m25,0 l54,0 m25,0 l54,0" fill="none" />
|
||||
<!-- button section two -->
|
||||
<path class="stroke stroke-width linecap" d="m0,680 m350,250 a10 10 180 0 1 20,0 a10 10 180 0 1 -20,0 m6.8,-1.7 l3.2,3.2 3.2,-3.2" fill="none" />
|
||||
</g>
|
||||
<g class="ani-move-menu is-animated">
|
||||
<g>
|
||||
<path class="stroke stroke-width linecap" d="m254,306 l54,0 m-54,10 l54,0 m-54,10 l54,0 m-54,10 l54,0" fill="none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<!-- fade button -->
|
||||
<g class="ani-fade-button is-animated" opacity="0" >
|
||||
<path class="stroke-background stroke-overlay linecap" d="m350,250 a10 10 180 0 1 20,0 a10 10 180 0 1 -20,0 m6.8,-1.7 l3.2,3.2 3.2,-3.2" fill="none" />
|
||||
<path class="stroke-alt stroke-width linecap" d="m350,250 a10 10 180 0 1 20,0 a10 10 180 0 1 -20,0 m6.8,-1.7 l3.2,3.2 3.2,-3.2" fill="none" />
|
||||
</g>
|
||||
<!-- baseline -->
|
||||
<path class="stroke stroke-width linecap" d="m0,275 l240,0 0,-230 a5 5 90 0 1 5,-5 l230,0 a5 5 90 0 1 5,5 l0,230 240,0" fill="none" />
|
||||
<path class="stroke stroke-width linecap" d="m0,275 m240,-217 l240,0" fill="none" />
|
||||
<path class="stroke stroke-width linecap" d="m0,275 m240,-226 m10,0 a4 4 180 0 1 8,0 a4 4 180 0 1 -8,0 m14,0 a4 4 180 0 1 8,0 a4 4 180 0 1 -8,0 m14,0 a4 4 180 0 1 8,0 a4 4 180 0 1 -8,0" fill="none" />
|
||||
<defs>
|
||||
<style>
|
||||
|
||||
.svg-line-drawing {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.svg-line-drawing .stroke-background {
|
||||
stroke: #eddd3e;
|
||||
}
|
||||
|
||||
.svg-line-drawing .stroke {
|
||||
stroke: #12353C;
|
||||
}
|
||||
|
||||
.svg-line-drawing .stroke-alt {
|
||||
stroke: #ffffff;
|
||||
}
|
||||
|
||||
.svg-line-drawing .stroke-width {
|
||||
stroke-width: 2;
|
||||
}
|
||||
|
||||
.svg-line-drawing .stroke-overlay {
|
||||
stroke-width: 3;
|
||||
}
|
||||
|
||||
.svg-line-drawing .linecap {
|
||||
stroke-linecap: round;
|
||||
stroke-linejoin: round;
|
||||
}
|
||||
|
||||
.rtl-magazine-animation .ani-fade-button,
|
||||
.rtl-magazine-animation .ani-move-page,
|
||||
.rtl-magazine-animation .ani-move-menu {
|
||||
-webkit-animation-duration: 5500ms;
|
||||
animation-duration: 5500ms;
|
||||
-webkit-animation-timing-function: ease;
|
||||
animation-timing-function: ease;
|
||||
-webkit-animation-delay: 100ms;
|
||||
animation-delay: 100ms;
|
||||
-webkit-animation-iteration-count: infinite;
|
||||
animation-iteration-count: infinite;
|
||||
}
|
||||
|
||||
.rtl-magazine-animation .ani-fade-button {
|
||||
-webkit-animation-name: fade-button;
|
||||
animation-name: fade-button;
|
||||
}
|
||||
|
||||
.rtl-magazine-animation .ani-move-page {
|
||||
-webkit-animation-name: move-page;
|
||||
animation-name: move-page;
|
||||
}
|
||||
|
||||
.rtl-magazine-animation .ani-move-menu {
|
||||
-webkit-animation-name: move-menu;
|
||||
animation-name: move-menu;
|
||||
}
|
||||
|
||||
@-webkit-keyframes fade-button {
|
||||
0%, 12%, 100% { opacity: 0; }
|
||||
9%, 11% { opacity: 1; }
|
||||
}
|
||||
|
||||
@keyframes fade-button {
|
||||
0%, 12%, 100% { opacity: 0; }
|
||||
9%, 11% { opacity: 1; }
|
||||
}
|
||||
|
||||
@-webkit-keyframes move-page {
|
||||
0%, 14%, 100% { -webkit-transform: translateY(0px); -webkit-animation-timing-function: ease-in; }
|
||||
28% { -webkit-transform: translateY(-220px); -webkit-animation-timing-function: linear; }
|
||||
80%, 99.9999% { -webkit-transform: translateY(-680px); -webkit-animation-timing-function: linear; }
|
||||
}
|
||||
|
||||
@keyframes move-page {
|
||||
0%, 14%, 100% { transform: translateY(0px); animation-timing-function: ease-in; }
|
||||
28% { transform: translateY(-220px); animation-timing-function: linear; }
|
||||
80%, 99.9999% { transform: translateY(-680px); animation-timing-function: linear; }
|
||||
}
|
||||
|
||||
@-webkit-keyframes move-menu {
|
||||
0%, 14%, 100% { -webkit-transform: translateY(0px); -webkit-animation-timing-function: ease-in; }
|
||||
28%, 68.6957% { -webkit-transform: translateY(-220px); -webkit-animation-timing-function: linear; }
|
||||
80% { -webkit-transform: translateY(-320px); -webkit-animation-timing-function: linear; }
|
||||
99.9999% { -webkit-transform: translateY(-680px); -webkit-animation-timing-function: linear; }
|
||||
}
|
||||
|
||||
@keyframes move-menu {
|
||||
0%, 14%, 100% { transform: translateY(0px); animation-timing-function: ease-in; }
|
||||
28%, 68.6957% { transform: translateY(-220px); animation-timing-function: linear; }
|
||||
80% { transform: translateY(-320px); animation-timing-function: linear; }
|
||||
99.9999% { transform: translateY(-680px); animation-timing-function: linear; }
|
||||
}
|
||||
|
||||
</style>
|
||||
</defs>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@endsection
|
|
@ -0,0 +1,612 @@
|
|||
{{-- Vue Blade de la page d'erreur lors d'une maintenance de l'application--}}
|
||||
@extends('body-nomenu')
|
||||
|
||||
@section('top-css')
|
||||
@parent
|
||||
<style>
|
||||
.crane__list,
|
||||
.skyscrappers__list,
|
||||
.tree__container {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.advice {
|
||||
display: flex;
|
||||
height: 50vh;
|
||||
width: 100vw;
|
||||
flex-flow: column nowrap;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.advice__title {
|
||||
font-size: 3rem;
|
||||
text-align: center;
|
||||
}
|
||||
.advice__description {
|
||||
margin-top: 1rem;
|
||||
font-size: 2rem;
|
||||
text-align: center;
|
||||
}
|
||||
.advice__description span:first-child {
|
||||
margin-right: -0.7rem;
|
||||
}
|
||||
.advice__description span:last-child {
|
||||
margin-left: -0.7rem;
|
||||
}
|
||||
|
||||
.city-stuff {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
bottom: 0;
|
||||
overflow: hidden;
|
||||
box-shadow: inset 0 -60px 0 -30px #969696;
|
||||
left: 0px;
|
||||
}
|
||||
|
||||
.skyscrappers__list {
|
||||
width: 100%;
|
||||
height: 86.6666666667px;
|
||||
left: 0;
|
||||
}
|
||||
.skyscrappers__list .skyscrapper__item {
|
||||
position: absolute;
|
||||
height: inherit;
|
||||
bottom: 15%;
|
||||
width: 43.3333333333px;
|
||||
background: linear-gradient(115deg, #969696 73%, #7d7d7d 73%, #7d7d7d 100%);
|
||||
}
|
||||
.skyscrappers__list .skyscrapper__item::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
width: 80%;
|
||||
height: 80%;
|
||||
left: 10%;
|
||||
bottom: 10%;
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAFElEQVQImWP4////fwYYIJKDEwAAfPsP8eFXG40AAAAASUVORK5CYII=") space;
|
||||
}
|
||||
.skyscrappers__list .skyscrapper__item:last-child:not(:only-child) {
|
||||
background: #969696;
|
||||
}
|
||||
.skyscrappers__list .skyscrapper-1 {
|
||||
width: 121.3333333333px;
|
||||
height: 138.6666666667px;
|
||||
right: 25%;
|
||||
bottom: 0;
|
||||
z-index: 10;
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
@media screen and (max-width: 450px) {
|
||||
.skyscrappers__list .skyscrapper-1 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.skyscrappers__list .skyscrapper-2 {
|
||||
width: 60.6666666667px;
|
||||
height: 69.3333333333px;
|
||||
right: 35%;
|
||||
bottom: 0;
|
||||
z-index: 10;
|
||||
transform: rotate(180deg);
|
||||
bottom: 10%;
|
||||
}
|
||||
@media screen and (max-width: 900px) {
|
||||
.skyscrappers__list .skyscrapper-2 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 450px) {
|
||||
.skyscrappers__list .skyscrapper-1 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.skyscrappers__list .skyscrapper-3 {
|
||||
width: 40.4444444444px;
|
||||
height: 46.2222222222px;
|
||||
right: 45%;
|
||||
bottom: 0;
|
||||
z-index: 10;
|
||||
transform: rotate(180deg);
|
||||
height: 115.5555555556px;
|
||||
}
|
||||
@media screen and (max-width: 900px) {
|
||||
.skyscrappers__list .skyscrapper-3 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 450px) {
|
||||
.skyscrappers__list .skyscrapper-1 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.skyscrappers__list .skyscrapper-4 {
|
||||
width: 30.3333333333px;
|
||||
height: 34.6666666667px;
|
||||
right: 55%;
|
||||
bottom: 0;
|
||||
z-index: 10;
|
||||
transform: rotate(180deg);
|
||||
height: 86.6666666667px;
|
||||
}
|
||||
.skyscrappers__list .skyscrapper-4::after {
|
||||
width: 20%;
|
||||
height: 60%;
|
||||
left: 25%;
|
||||
}
|
||||
@media screen and (max-width: 450px) {
|
||||
.skyscrappers__list .skyscrapper-1 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.skyscrappers__list .skyscrapper-5 {
|
||||
width: 24.2666666667px;
|
||||
height: 27.7333333333px;
|
||||
right: 65%;
|
||||
bottom: 0;
|
||||
z-index: 10;
|
||||
transform: rotate(180deg);
|
||||
width: 7%;
|
||||
right: 67%;
|
||||
height: 50%;
|
||||
z-index: 11;
|
||||
}
|
||||
.skyscrappers__list .skyscrapper-5::after {
|
||||
height: 0;
|
||||
}
|
||||
@media screen and (max-width: 450px) {
|
||||
.skyscrappers__list .skyscrapper-1 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.crane-cabin, .crane-arm, .crane-picker {
|
||||
transform-origin: 80% center;
|
||||
-webkit-animation: crane__movement 12s infinite alternate;
|
||||
animation: crane__movement 12s infinite alternate;
|
||||
}
|
||||
|
||||
.crane__list {
|
||||
width: 260px;
|
||||
height: 173.3333333333px;
|
||||
z-index: 0;
|
||||
perspective: 600px;
|
||||
}
|
||||
.crane__list .crane__item {
|
||||
position: absolute;
|
||||
border: solid 1px #969696;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.crane__list .crane-cable {
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
border: none;
|
||||
outline: 1px solid transparent;
|
||||
background: #969696;
|
||||
z-index: 0;
|
||||
}
|
||||
.crane__list .crane-cable-1 {
|
||||
width: 60%;
|
||||
top: 0;
|
||||
left: 11%;
|
||||
transform-origin: right 0;
|
||||
-webkit-animation: cable-1__movement 12s infinite alternate;
|
||||
animation: cable-1__movement 12s infinite alternate;
|
||||
}
|
||||
.crane__list .crane-cable-2 {
|
||||
width: 19%;
|
||||
top: 0;
|
||||
right: 8%;
|
||||
transform-origin: top left;
|
||||
-webkit-animation: cable-2__movement 12s infinite alternate;
|
||||
animation: cable-2__movement 12s infinite alternate;
|
||||
}
|
||||
.crane__list .crane-cable-3 {
|
||||
height: 30%;
|
||||
top: 22%;
|
||||
left: 9%;
|
||||
transform-origin: right center;
|
||||
-webkit-animation: cable-3__movement 12s ease-in-out infinite alternate;
|
||||
animation: cable-3__movement 12s ease-in-out infinite alternate;
|
||||
}
|
||||
.crane__list .crane-cable-3::after {
|
||||
content: "";
|
||||
display: block;
|
||||
position: absolute;
|
||||
height: 0.2em;
|
||||
width: 9000%;
|
||||
bottom: 0;
|
||||
left: -4500%;
|
||||
background: #c9c9c9;
|
||||
border: 1px solid #969696;
|
||||
}
|
||||
.crane__list .crane-stand {
|
||||
width: 5%;
|
||||
height: 100%;
|
||||
right: 25%;
|
||||
z-index: 1;
|
||||
background: linear-gradient(to top, #969696, #e3e3e3);
|
||||
}
|
||||
.crane__list .crane-weight {
|
||||
width: 8%;
|
||||
height: 20%;
|
||||
right: 4%;
|
||||
top: 12%;
|
||||
z-index: 2;
|
||||
background: #d6d6d6;
|
||||
transform-origin: 0 center;
|
||||
-webkit-animation: crane-weight__movement 12s infinite alternate;
|
||||
animation: crane-weight__movement 12s infinite alternate;
|
||||
}
|
||||
.crane__list .crane-cabin {
|
||||
width: 12%;
|
||||
height: 9%;
|
||||
right: 24%;
|
||||
top: 20%;
|
||||
z-index: 2;
|
||||
background: #d6d6d6;
|
||||
}
|
||||
.crane__list .crane-cabin::after {
|
||||
content: "";
|
||||
display: block;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 10%;
|
||||
top: 60%;
|
||||
left: 0;
|
||||
background: white;
|
||||
}
|
||||
.crane__list .crane-arm {
|
||||
width: 100%;
|
||||
height: 7%;
|
||||
top: 15%;
|
||||
border-top-left-radius: 10px;
|
||||
z-index: 3;
|
||||
background: #d6d6d6;
|
||||
}
|
||||
|
||||
.crane-1 {
|
||||
left: 20%;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.crane-2 {
|
||||
left: 30%;
|
||||
z-index: 10;
|
||||
bottom: -1rem;
|
||||
z-index: -1;
|
||||
transform: scale(0.75) scaleX(-1);
|
||||
}
|
||||
@media screen and (max-width: 900px) {
|
||||
.crane-2 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.crane-2 .crane-cable-3 {
|
||||
-webkit-animation-delay: 3s;
|
||||
animation-delay: 3s;
|
||||
}
|
||||
|
||||
.crane-3 {
|
||||
left: 40%;
|
||||
z-index: 10;
|
||||
bottom: -0.5rem;
|
||||
transform: scale(0.8);
|
||||
}
|
||||
@media screen and (max-width: 900px) {
|
||||
.crane-3 {
|
||||
z-index: -1;
|
||||
transform: scale(0.75) scaleX(-1);
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 900px) {
|
||||
.crane-3 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.crane-3 .crane-cable-3 {
|
||||
-webkit-animation-delay: 4.5s;
|
||||
animation-delay: 4.5s;
|
||||
}
|
||||
|
||||
.tree__container {
|
||||
width: 100%;
|
||||
height: 62.6666666667px;
|
||||
left: 0;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.tree__item {
|
||||
display: flex;
|
||||
flex-flow: column nowrap;
|
||||
position: absolute;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
left: 60%;
|
||||
}
|
||||
|
||||
.tree__trunk {
|
||||
order: 2;
|
||||
display: block;
|
||||
position: absolute;
|
||||
width: 4px;
|
||||
height: 8px;
|
||||
margin-top: 8px;
|
||||
border-radius: 2px;
|
||||
background: #57473d;
|
||||
}
|
||||
|
||||
.tree__leaves {
|
||||
order: 1;
|
||||
position: relative;
|
||||
border-top: 0 solid transparent;
|
||||
border-right: 4px solid transparent;
|
||||
border-bottom: 32px solid #969696;
|
||||
border-left: 4px solid transparent;
|
||||
}
|
||||
.tree__leaves::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
left: -4px;
|
||||
border-top: 0;
|
||||
border-right: 0;
|
||||
border-bottom: 32px solid #7d7d7d;
|
||||
border-left: 4px solid transparent;
|
||||
}
|
||||
|
||||
.tree-1 {
|
||||
left: 66%;
|
||||
}
|
||||
@media screen and (max-width: 768px) {
|
||||
.tree-1 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.tree-2 {
|
||||
left: 67%;
|
||||
}
|
||||
@media screen and (max-width: 768px) {
|
||||
.tree-2 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.tree-4 {
|
||||
left: 57%;
|
||||
}
|
||||
|
||||
.tree-5 {
|
||||
left: 58%;
|
||||
}
|
||||
|
||||
.tree-7 {
|
||||
left: 51%;
|
||||
}
|
||||
@media screen and (max-width: 450px) {
|
||||
.tree-7 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.tree-8 {
|
||||
left: 52%;
|
||||
}
|
||||
@media screen and (max-width: 450px) {
|
||||
.tree-8 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes cable-1__movement {
|
||||
0%, 20% {
|
||||
transform: rotateY(0) rotateZ(-10deg);
|
||||
}
|
||||
70%, 100% {
|
||||
transform: rotateY(45deg) rotateZ(-10deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes cable-1__movement {
|
||||
0%, 20% {
|
||||
transform: rotateY(0) rotateZ(-10deg);
|
||||
}
|
||||
70%, 100% {
|
||||
transform: rotateY(45deg) rotateZ(-10deg);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes cable-2__movement {
|
||||
0%, 20% {
|
||||
transform: rotateY(0) rotateZ(29deg);
|
||||
}
|
||||
70%, 100% {
|
||||
transform: rotateY(15deg) rotateZ(29deg);
|
||||
}
|
||||
}
|
||||
@keyframes cable-2__movement {
|
||||
0%, 20% {
|
||||
transform: rotateY(0) rotateZ(29deg);
|
||||
}
|
||||
70%, 100% {
|
||||
transform: rotateY(15deg) rotateZ(29deg);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes cable-3__movement {
|
||||
0% {
|
||||
transform: translate(0, 0);
|
||||
}
|
||||
20% {
|
||||
transform: translate(2500%, -18%);
|
||||
}
|
||||
60% {
|
||||
transform: translate(11000%, -25%);
|
||||
}
|
||||
70% {
|
||||
height: 30%;
|
||||
transform: translate(9100%, -25%);
|
||||
}
|
||||
90%, 100% {
|
||||
height: 80%;
|
||||
transform: translate(9100%, -15%);
|
||||
}
|
||||
}
|
||||
@keyframes cable-3__movement {
|
||||
0% {
|
||||
transform: translate(0, 0);
|
||||
}
|
||||
20% {
|
||||
transform: translate(2500%, -18%);
|
||||
}
|
||||
60% {
|
||||
transform: translate(11000%, -25%);
|
||||
}
|
||||
70% {
|
||||
height: 30%;
|
||||
transform: translate(9100%, -25%);
|
||||
}
|
||||
90%, 100% {
|
||||
height: 80%;
|
||||
transform: translate(9100%, -15%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes crane__movement {
|
||||
0%, 20% {
|
||||
transform: rotateY(0);
|
||||
}
|
||||
70%, 100% {
|
||||
transform: rotateY(45deg);
|
||||
}
|
||||
}
|
||||
@keyframes crane__movement {
|
||||
0%, 20% {
|
||||
transform: rotateY(0);
|
||||
}
|
||||
70%, 100% {
|
||||
transform: rotateY(45deg);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes crane-weight__movement {
|
||||
0%, 20% {
|
||||
transform: rotateY(0) translateX(0);
|
||||
}
|
||||
70%, 100% {
|
||||
transform: rotateY(45deg) translateX(-50%);
|
||||
}
|
||||
}
|
||||
@keyframes crane-weight__movement {
|
||||
0%, 20% {
|
||||
transform: rotateY(0) translateX(0);
|
||||
}
|
||||
70%, 100% {
|
||||
transform: rotateY(45deg) translateX(-50%);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<div id="access-denied" style="overflow: hidden;">
|
||||
<div class="container">
|
||||
<h1>:) Oops!</h1>
|
||||
<br /><br />
|
||||
<h2>Temporairement fermée pour maintenance</h2>
|
||||
@if(\MVC\Classe\Application::is_under_update())
|
||||
<pre>{{MAINTENANCE_MESSAGE}}</pre>
|
||||
@endif
|
||||
<br /><br />
|
||||
<h3>L'application est de retour bientôt!</h3>
|
||||
<p>
|
||||
Désolé pour cette gêne mais il se trouve que l'application est en maintenance à ce moment !
|
||||
<br/>
|
||||
— Le service
|
||||
<br/>
|
||||
<a href="mailto:application@localhost.fr">application@localhost.fr</a>
|
||||
</p>
|
||||
<br /><br />
|
||||
<br /><br />
|
||||
<br /><br />
|
||||
<br /><br />
|
||||
<br /><br />
|
||||
<br /><br />
|
||||
<div id="gears">
|
||||
<section class="city-stuff">
|
||||
<ul class="skyscrappers__list">
|
||||
<li class="skyscrapper__item skyscrapper-1"></li>
|
||||
<li class="skyscrapper__item skyscrapper-2"></li>
|
||||
<li class="skyscrapper__item skyscrapper-3"></li>
|
||||
<li class="skyscrapper__item skyscrapper-4"></li>
|
||||
<li class="skyscrapper__item skyscrapper-5"></li>
|
||||
</ul>
|
||||
<ul class="tree__container">
|
||||
<li class="tree__list">
|
||||
<ul class="tree__item tree-1">
|
||||
<li class="tree__trunk"></li>
|
||||
<li class="tree__leaves"></li>
|
||||
</ul>
|
||||
<ul class="tree__item tree-2">
|
||||
<li class="tree__trunk"></li>
|
||||
<li class="tree__leaves"></li>
|
||||
</ul>
|
||||
<ul class="tree__item tree-3">
|
||||
<li class="tree__trunk"></li>
|
||||
<li class="tree__leaves"></li>
|
||||
</ul>
|
||||
<ul class="tree__item tree-4">
|
||||
<li class="tree__trunk"></li>
|
||||
<li class="tree__leaves"></li>
|
||||
</ul>
|
||||
<ul class="tree__item tree-5">
|
||||
<li class="tree__trunk"></li>
|
||||
<li class="tree__leaves"></li>
|
||||
</ul>
|
||||
<ul class="tree__item tree-6">
|
||||
<li class="tree__trunk"></li>
|
||||
<li class="tree__leaves"></li>
|
||||
</ul>
|
||||
<ul class="tree__item tree-7">
|
||||
<li class="tree__trunk"></li>
|
||||
<li class="tree__leaves"></li>
|
||||
</ul>
|
||||
<ul class="tree__item tree-8">
|
||||
<li class="tree__trunk"></li>
|
||||
<li class="tree__leaves"></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="crane__list crane-1">
|
||||
<li class="crane__item crane-cable crane-cable-1"></li>
|
||||
<li class="crane__item crane-cable crane-cable-2"></li>
|
||||
<li class="crane__item crane-cable crane-cable-3"></li>
|
||||
<li class="crane__item crane-stand"></li>
|
||||
<li class="crane__item crane-weight"></li>
|
||||
<li class="crane__item crane-cabin"></li>
|
||||
<li class="crane__item crane-arm"></li>
|
||||
</ul>
|
||||
<ul class="crane__list crane-2">
|
||||
<li class="crane__item crane-cable crane-cable-1"></li>
|
||||
<li class="crane__item crane-cable crane-cable-2"></li>
|
||||
<li class="crane__item crane-cable crane-cable-3"></li>
|
||||
<li class="crane__item crane-stand"></li>
|
||||
<li class="crane__item crane-weight"></li>
|
||||
<li class="crane__item crane-cabin"></li>
|
||||
<li class="crane__item crane-arm"></li>
|
||||
</ul>
|
||||
<ul class="crane__list crane-3">
|
||||
<li class="crane__item crane-cable crane-cable-1"></li>
|
||||
<li class="crane__item crane-cable crane-cable-2"></li>
|
||||
<li class="crane__item crane-cable crane-cable-3"></li>
|
||||
<li class="crane__item crane-stand"></li>
|
||||
<li class="crane__item crane-weight"></li>
|
||||
<li class="crane__item crane-cabin"></li>
|
||||
<li class="crane__item crane-arm"></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@endsection
|
|
@ -39,6 +39,7 @@
|
|||
|
||||
@section('bottom-javascript')
|
||||
@parent
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
||||
<script src="https://cdn.3up.dk/in-view@0.6.1"></script>
|
||||
<script type="text/javascript">
|
||||
var formatThousandsNoRounding = function(n, dp){
|
||||
|
|
51
application/include/vues/view/feedback.blade.php
Normal file
51
application/include/vues/view/feedback.blade.php
Normal file
|
@ -0,0 +1,51 @@
|
|||
@extends('body')
|
||||
|
||||
|
||||
@section('content')
|
||||
<div class="flex-center-container">
|
||||
De 1 à 10, combien d'étoiles donneriez-vous pour le framework SAND?
|
||||
<br/><br/><br/>
|
||||
<div class="form-field box">
|
||||
<form method="POST" action="{{\MVC\Classe\Url::link_rewrite(true,"send-feedback")}}">
|
||||
<select name="glsr-custom-options" id="glsr-custom-options" class="star-rating" data-options='{"clearable":false, "tooltip":true}'>
|
||||
<option value="">Select a rating</option>
|
||||
<option value="10">10</option>
|
||||
<option value="9">9</option>
|
||||
<option value="8" selected>8</option>
|
||||
<option value="7">7</option>
|
||||
<option value="6">6</option>
|
||||
<option value="5">5</option>
|
||||
<option value="4">4</option>
|
||||
<option value="3">3</option>
|
||||
<option value="2">2</option>
|
||||
<option value="1">1</option>
|
||||
</select>
|
||||
<br/>
|
||||
<input type="submit" class="btn btn-outline-primary" value="Noter">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<center>
|
||||
<br/><br/>
|
||||
<br/><br/>
|
||||
<br/><br/>
|
||||
Un bug, une question ? envoyez-moi un courriel !
|
||||
</center>
|
||||
@endsection
|
||||
|
||||
@section('top-css')
|
||||
@parent
|
||||
<link rel="stylesheet" href="{{\MVC\Classe\Url::asset_rewrite('assets/star-rating.js-master/dist/star-rating.css')}}">
|
||||
@endsection
|
||||
|
||||
@section('top-javascript')
|
||||
@parent
|
||||
<script src="{{\MVC\Classe\Url::asset_rewrite('assets/star-rating.js-master/dist/star-rating.js')}}"></script>
|
||||
@endsection
|
||||
|
||||
@section('bottom-javascript')
|
||||
@parent
|
||||
<script>
|
||||
var stars = new StarRating('.star-rating');
|
||||
</script>
|
||||
@endsection
|
|
@ -14,7 +14,7 @@
|
|||
{{$templating_a}}::{{$templating_b}}::{{$templating_c}}
|
||||
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default',[])}}
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default.default',[4,5,6])}}
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default.defaultBlade',[4,5,6])}}
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default.variableSlug',['var1','var2','var3'])}}
|
||||
|
||||
@endsection
|
||||
|
|
|
@ -1 +1,10 @@
|
|||
INDEX
|
||||
{% extends "body.html.twig" %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Accueil de l'url</h1>
|
||||
<h2> {{server('SERVER_NAME')}}</h2>
|
||||
<br /><br /><br />
|
||||
<hr/>
|
||||
{{templating_a}}::{{templating_b}}::{{templating_c}}
|
||||
{{ action('default.defaultTwig',[4,5,6]) }}
|
||||
{% endblock %}
|
69
application/include/vues/view/react.blade.php
Normal file
69
application/include/vues/view/react.blade.php
Normal file
|
@ -0,0 +1,69 @@
|
|||
@extends('body')
|
||||
|
||||
@section('top-javascript')
|
||||
@parent
|
||||
<script src="https://unpkg.com/react@^16/umd/react.production.min.js"></script>
|
||||
<script src="https://unpkg.com/react-dom@16.13.0/umd/react-dom.production.min.js"></script>
|
||||
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<h1>%PAGE% - REACT.js Controlleur</h1>
|
||||
<br/><br/><br/>
|
||||
<div id="root"></div>
|
||||
@endsection
|
||||
|
||||
@section('bottom-javascript')
|
||||
@parent
|
||||
<script type="text/babel">
|
||||
class App extends React.Component {
|
||||
state = {
|
||||
data: [],
|
||||
}
|
||||
|
||||
// Code is invoked after the component is mounted/inserted into the DOM tree.
|
||||
componentDidMount() {
|
||||
const url =
|
||||
'https://ghibliapi.herokuapp.com/films'
|
||||
|
||||
fetch(url)
|
||||
.then((result) => result.json())
|
||||
.then((result) => {
|
||||
this.setState({
|
||||
data: result,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
render() {
|
||||
const {data} = this.state
|
||||
|
||||
const result = data.map(obj => {
|
||||
return (
|
||||
<a href="#" key="{obj.id}">
|
||||
<div>
|
||||
<div>
|
||||
<h2>
|
||||
{obj.title}
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
{obj.description.slice(0, 300) + "..." }
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<span>Year : {obj.release_date }</span>
|
||||
<span>Director : {obj.director }</span>
|
||||
<span>Producer : {obj.producer }</span>
|
||||
</div>
|
||||
</a>);
|
||||
})
|
||||
return <div>{result}</div>
|
||||
}
|
||||
}
|
||||
|
||||
ReactDOM.render(<App />, document.getElementById('root'))
|
||||
</script>
|
||||
@endsection
|
82
application/include/vues/view/vuejs.blade.php
Normal file
82
application/include/vues/view/vuejs.blade.php
Normal file
|
@ -0,0 +1,82 @@
|
|||
@extends('body')
|
||||
|
||||
@section('top-javascript')
|
||||
@parent
|
||||
<script src="https://unpkg.com/vue@2.6.12/dist/vue.js"></script>
|
||||
<script src="https://unpkg.com/axios@0.21.1/dist/axios.min.js"></script>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<h1>%PAGE% - VUE.js Controlleur</h1>
|
||||
<br/><br/><br/>
|
||||
<div id="app">
|
||||
<div>
|
||||
<input v-model="searchText" placeholder="Search...">
|
||||
</div>
|
||||
<div v-if="is_loading">
|
||||
<div class="lds-ellipsis"><div></div><div></div><div></div><div></div></div>
|
||||
</div>
|
||||
<div v-if="items" >
|
||||
<a href="#" v-for="item in itemsSearched" :key="item.id">
|
||||
<div>
|
||||
<div>
|
||||
<h2>
|
||||
@{{ item.title }}
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
@{{ item.description.slice(0, 300) + "..." }}
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<span>Year : @{{ item.release_date }}</span>
|
||||
<span>Director : @{{ item.director }}</span>
|
||||
<span>Producer : @{{ item.producer }}</span>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@section('bottom-javascript')
|
||||
@parent
|
||||
<script>
|
||||
const vue = new Vue({
|
||||
el: '#app',
|
||||
data: {
|
||||
items: [],
|
||||
searchText: '',
|
||||
is_loading: true,
|
||||
},
|
||||
mounted() {
|
||||
axios
|
||||
.get('https://ghibliapi.herokuapp.com/films')
|
||||
.then(response => {
|
||||
this.items = response.data;
|
||||
this.is_loading = false
|
||||
})
|
||||
.catch(error => console.log(error))
|
||||
},
|
||||
computed : {
|
||||
itemsSearched : function(){
|
||||
var self = this;
|
||||
if( this.searchText == ''){
|
||||
return this.items;
|
||||
}
|
||||
return this.items.filter(function(item){
|
||||
// https://www.reddit.com/r/vuejs/comments/62kfae/how_do_i_create_very_simple_instant_search_filter/
|
||||
// Must be of string type
|
||||
return item.title.toLowerCase().indexOf(self.searchText) >= 0 ||
|
||||
item.producer.toLowerCase().indexOf(self.searchText) >= 0 ||
|
||||
item.director.toLowerCase().indexOf(self.searchText) >= 0 ||
|
||||
item.release_date.toString().indexOf(self.searchText) >= 0;
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@endsection
|
41
application/objets/Environment.php
Normal file
41
application/objets/Environment.php
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Object;
|
||||
|
||||
class Environment
|
||||
{
|
||||
|
||||
public static function getColorMenuFromEnv()
|
||||
{
|
||||
switch(ENV){
|
||||
case 'TEST':
|
||||
return 'red';
|
||||
break;
|
||||
case 'PREPROD':
|
||||
return 'blue';
|
||||
break;
|
||||
case 'PROD':
|
||||
return 'black';
|
||||
break;
|
||||
default:
|
||||
return 'green';
|
||||
}
|
||||
}
|
||||
public static function getTextEnvironment()
|
||||
{
|
||||
switch(ENV){
|
||||
case 'TEST':
|
||||
return '<li style="background-color: '.self::getColorMenuFromEnv().'"><b>TESTING ENVIRONMENT</b><li>';
|
||||
break;
|
||||
case 'PREPROD':
|
||||
return '<li style="background-color: '.self::getColorMenuFromEnv().'"><b>PREPROD ENVIRONMENT</b><li>';
|
||||
break;
|
||||
case 'PROD':
|
||||
return '';
|
||||
break;
|
||||
default:
|
||||
return '<li style="background-color: '.self::getColorMenuFromEnv().'"><b>DEVEL ENVIRONMENT</b><li>';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -26,4 +26,12 @@ class XssToken
|
|||
return $prefix . substr(bin2hex($bytes), 0, $length);
|
||||
}
|
||||
|
||||
public static function generateFibonacciSequence($n)
|
||||
{
|
||||
$sequence = [0, 1];
|
||||
for ($i = 2; $i < $n; $i++) {
|
||||
$sequence[$i] = $sequence[$i-1] + $sequence[$i-2];
|
||||
}
|
||||
return $sequence;
|
||||
}
|
||||
}
|
8
application/traitements/add-alert-example.php
Normal file
8
application/traitements/add-alert-example.php
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?php
|
||||
|
||||
\MVC\Object\Session::createAndTestSession();
|
||||
|
||||
\MVC\Object\Alert::addAlert('OK','This is an alert !','info');
|
||||
|
||||
|
||||
header('location:'.\MVC\Classe\Url::link_rewrite(false, "index", []));
|
12
application/traitements/send-feedback.php
Normal file
12
application/traitements/send-feedback.php
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Controlleur de traitement permettant de créér un individu sa période d'hébergement associé
|
||||
*/
|
||||
|
||||
|
||||
\MVC\Object\Session::createAndTestSession();
|
||||
|
||||
$note = $_POST['glsr-custom-options'];
|
||||
|
||||
header('location:'.\MVC\Classe\Url::link_rewrite(false, "donate", []));
|
7
application/traitements/traitement-get.php
Normal file
7
application/traitements/traitement-get.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
\MVC\Object\Session::createAndTestSession();
|
||||
|
||||
\MVC\Classe\Dumper::dump($_GET);
|
||||
\MVC\Classe\Dumper::dump($url_params);
|
||||
\MVC\Classe\Dumper::dump($GLOBALS);
|
BIN
build/bin/phpDocumentor.phar
Normal file
BIN
build/bin/phpDocumentor.phar
Normal file
Binary file not shown.
BIN
build/bin/phpcpd-6.0.3.phar
Normal file
BIN
build/bin/phpcpd-6.0.3.phar
Normal file
Binary file not shown.
20310
build/bin/phpdcd-1.0.2.phar
Normal file
20310
build/bin/phpdcd-1.0.2.phar
Normal file
File diff suppressed because it is too large
Load diff
BIN
build/bin/phploc-7.0.2.phar
Normal file
BIN
build/bin/phploc-7.0.2.phar
Normal file
Binary file not shown.
BIN
build/bin/phpmd.phar
Normal file
BIN
build/bin/phpmd.phar
Normal file
Binary file not shown.
29
build/build.sh
Normal file
29
build/build.sh
Normal file
|
@ -0,0 +1,29 @@
|
|||
#!/bin/bash
|
||||
|
||||
# PHP METRICS
|
||||
./bin/phpmetrics --report-html=./data/phpmetrics ../ --exclude="vendor","build","tests","data","skel","modules","cache"
|
||||
|
||||
# PHP DOCUMENTOR
|
||||
php ./bin/phpDocumentor.phar -d ../application -d ../console -d ../domain --ignore "vendor/*,build/*,data/*,tests/*,console/skel/*,application/modules/*,application/inculde/vues/cache/*" -t ./data/api-docs/
|
||||
|
||||
# PHP MESS DETECTOR
|
||||
php ./bin/phpmd.phar ../ html codesize,naming,unusedcode --exclude '*vendor*' --exclude '*tests*' --exclude '*build*' --exclude '*data*' --exclude '*skel*' --exclude '*modules*' --exclude '*cache*' ./data/phpmd.html
|
||||
php ./bin/phpmd.phar ../ xml codesize,naming,unusedcode --exclude '*vendor*' --exclude '*tests*' --exclude '*build*' --exclude '*data*' --exclude '*skel*' --exclude '*modules*' --exclude '*cache*' ./logs/phpmd.xml
|
||||
|
||||
#CHECKSTYLE OF THE PROJECT
|
||||
./bin/phpcs -p --extensions=php --ignore=*/vendor/*,*/build/*,*/data/*,*/test/*,*/skel/*,*/modules/*,*/cache/*,*/public/* --report-xml=./logs/checkstyle.xml ../
|
||||
|
||||
# CHARTS OF PROJECTS
|
||||
./bin/pdepend --jdepend-chart=data/jdepend-chart.svg --overview-pyramid=data/jdepend-overview.svg --summary-xml=data/jdepend-summary.xml --ignore=vendor,tests,build,data,skel,modules,cache ../
|
||||
|
||||
# TEXT METRIC OF PROJECT
|
||||
php ./bin/phploc-7.0.2.phar ../ --exclude ../vendor --exclude ../build --exclude ../tests --exclude ../data --exclude ../console/skel --exclude ../application/modules --exclude ../application/include/vues/cache --log-xml logs/phploc.xml > data/phploc.txt
|
||||
|
||||
# DUPLICATED LINES OF PROJECT
|
||||
php ./bin/phpcpd-6.0.3.phar --exclude ../vendor --exclude ../build --exclude ../tests --exclude ../data --exclude ../console/skel --exclude ../application/modules --exclude ../application/include/vues/cache ../ > data/phpcpd.txt
|
||||
|
||||
# DEAD CODE DETECTOR
|
||||
php ./bin/phpdcd-1.0.2.phar --exclude="../vendor" --exclude="../build" --exclude="../tests" --exclude="../data" --exclude="../console/skel" --exclude="../application/modules" --exclude="../application/include/vues/cache" --recursive ../ > data/phpdcd.txt
|
||||
|
||||
# PHP DOX
|
||||
php ./bin/phpdox-0.12.0.phar
|
10
build/composer.json
Normal file
10
build/composer.json
Normal file
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"config": {
|
||||
"bin-dir": "bin/"
|
||||
},
|
||||
"require": {
|
||||
"pdepend/pdepend": "^2.9",
|
||||
"phpmetrics/phpmetrics": "^2.7",
|
||||
"squizlabs/php_codesniffer": "^3.6"
|
||||
}
|
||||
}
|
0
build/data/.gitignore
vendored
Normal file
0
build/data/.gitignore
vendored
Normal file
15
build/data/jdepend-output.php
Normal file
15
build/data/jdepend-output.php
Normal file
|
@ -0,0 +1,15 @@
|
|||
|
||||
<?php
|
||||
|
||||
// CHargement du source XML
|
||||
$xml = new DOMDocument;
|
||||
$xml->load(__DIR__ . DIRECTORY_SEPARATOR .'jdepend-summary.xml');
|
||||
|
||||
$xsl = new DOMDocument;
|
||||
$xsl->load(__DIR__ . DIRECTORY_SEPARATOR .'jdepend-summary.xsl');
|
||||
|
||||
// Configuration du transformateur
|
||||
$proc = new XSLTProcessor;
|
||||
$proc->importStyleSheet($xsl); // attachement des règles xsl
|
||||
|
||||
echo $proc->transformToXML($xml);
|
2
build/logs/.gitignore
vendored
Normal file
2
build/logs/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
*
|
||||
!.gitignore
|
129
build/phpdox.xml
Normal file
129
build/phpdox.xml
Normal file
|
@ -0,0 +1,129 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!-- This is a skeleton phpDox config file - Check http://phpDox.de for latest version and more info -->
|
||||
<phpdox xmlns="http://xml.phpdox.net/config" silent="false">
|
||||
<!-- @silent: true | false to enable or disable visual output of progress -->
|
||||
|
||||
<!-- Additional bootstrap files to load for additional parsers, enrichers and/or engines -->
|
||||
<!-- Place as many require nodes as you feel like in this container -->
|
||||
<!-- syntax: <require file="/path/to/file.php" /> -->
|
||||
<bootstrap/>
|
||||
|
||||
<!-- A phpDox project to process, you can have multiple projects in one config file -->
|
||||
<project name="SAND Framework" source="C:\Users\eroy5\PhpstormProjects\DOCKER-LAMP\www\SAND-framework-dev" workdir="${basedir}/.phpdox/xml">
|
||||
<!-- @name - The name of the project -->
|
||||
<!-- @source - The source directory of the application to process -->
|
||||
<!-- @workdir - The directory to store the xml data files in -->
|
||||
|
||||
<!-- A phpDox config file can define additional variables (properties) per project -->
|
||||
<!-- <property name="some.name" value="the.value" /> -->
|
||||
|
||||
<!-- Values can make use of previously defined properties -->
|
||||
<!-- The following are defined by default:
|
||||
|
||||
${basedir} Directory the loaded config file is in
|
||||
|
||||
${phpDox.home} Directory of the phpDox installation
|
||||
${phpDox.file} The current config file
|
||||
${phpDox.version} phpDox' version number
|
||||
|
||||
${phpDox.project.name} The value of project/@name if set, otherwise 'unnamed'
|
||||
${phpDox.project.source} The value of project/@source if set, otherwise '${basedir}/src'
|
||||
${phpDox.project.workdir} The value of project/@workdir if set, otherwise '${basedir}/build/phpdox/xml'
|
||||
|
||||
${phpDox.php.version} The PHP Version of the interpreter in use
|
||||
|
||||
-->
|
||||
|
||||
<!-- Additional configuration for the collecting process (parsing of php code, generation of xml data) -->
|
||||
<collector publiconly="false" backend="parser" encoding="auto">
|
||||
<!-- @publiconly - Flag to disable/enable processing of non public methods and members -->
|
||||
<!-- @backend - The collector backend to use, currently only shipping with 'parser' -->
|
||||
<!-- @encoding - Charset encoding of source files (overwrite default 'auto' if detection fails) -->
|
||||
|
||||
<!-- <include / exclude filter for filelist generator, mask must follow fnmatch() requirements -->
|
||||
<!-- Multiple elements can be added to define more than one mask per filter -->
|
||||
<include mask="*.php"/>
|
||||
<exclude mask="**tests**"/>
|
||||
<exclude mask="**vendor**"/>
|
||||
<exclude mask="**build**"/>
|
||||
<exclude mask="**docs**"/>
|
||||
<exclude mask="**data**"/>
|
||||
<exclude mask="**public**"/>
|
||||
<exclude mask="**skel**"/>
|
||||
<exclude mask="*.phar"/>
|
||||
|
||||
<!-- How to handle inheritance -->
|
||||
<inheritance resolve="true">
|
||||
<!-- @resolve - Flag to enable/disable resolving of inheritance -->
|
||||
|
||||
<!-- You can define multiple (external) dependencies to be included -->
|
||||
<!-- <dependency path="" -->
|
||||
<!-- @path - path to a directory containing an index.xml for a dependency project -->
|
||||
</inheritance>
|
||||
|
||||
</collector>
|
||||
|
||||
<!-- Configuration of generation process -->
|
||||
<generator output="${basedir}/data">
|
||||
<!-- @output - (Base-)Directory to store output data in -->
|
||||
|
||||
<!-- A generation process consists of one or more build tasks and of (optional) enrich sources -->
|
||||
|
||||
<enrich base="${basedir}/logs">
|
||||
<!-- @base - (Base-)Directory of datafiles used for enrich process -->
|
||||
|
||||
<!--<source type="...">-->
|
||||
<!-- @type - the handler for the enrichment -->
|
||||
<!-- known types by default are: build, checkstyle, git, phpcs, phploc, phpunit, pmd -->
|
||||
|
||||
<!-- every enrichment source can have additional configuration nodes, most probably need a logfile -->
|
||||
<!-- <file name="path/to/log.xml" /> -->
|
||||
<!--</source> -->
|
||||
|
||||
<!-- add phploc output -->
|
||||
<source type="phploc" />
|
||||
|
||||
<!-- git vcs information -->
|
||||
<source type="git">
|
||||
<git binary="git" />
|
||||
<history enabled="true" limit="15" cache="${phpDox.project.workdir}/gitlog.xml" />
|
||||
</source>
|
||||
-->
|
||||
|
||||
<!-- PHP Code Sniffer findings -->
|
||||
<source type="phpcs">
|
||||
<file name="checkstyle.xml" />
|
||||
</source>
|
||||
|
||||
|
||||
<!-- PHPMessDetector -->
|
||||
<source type="pmd">
|
||||
<file name="phpmd.xml" />
|
||||
</source>
|
||||
|
||||
|
||||
<!-- PHPUnit Coverage XML -->
|
||||
<source type="phpunit">
|
||||
<coverage path="" />
|
||||
<!-- @path - the directory where the xml code coverage report can be found -->
|
||||
</source>
|
||||
|
||||
</enrich>
|
||||
|
||||
<!-- <build engine="..." enabled="true" output="..." /> -->
|
||||
<!-- @engine - The name of the engine this build task uses, use ./phpDox - -engines to get a list of available engines -->
|
||||
<!-- @enabled - Flag to enable/disable this engine, default: enabled=true -->
|
||||
<!-- @output - (optional) Output directory; if relative (no / as first char) it is interpreted as relative to generator/@output -->
|
||||
|
||||
<!-- An engine and thus build node can have additional configuration child nodes, please check the documentation for the engine to find out more -->
|
||||
|
||||
<!-- default engine "html" -->
|
||||
<build engine="html" enabled="true" output="api-dox">
|
||||
<template dir="${phpDox.home}/templates/html"/>
|
||||
<file extension="xhtml"/>
|
||||
</build>
|
||||
|
||||
</generator>
|
||||
</project>
|
||||
|
||||
</phpdox>
|
24
command_usefull
Normal file
24
command_usefull
Normal file
|
@ -0,0 +1,24 @@
|
|||
# BEHAT Behavior Driven Developpement Initialisation
|
||||
#cd tests/behat
|
||||
#./bin/behat --init
|
||||
|
||||
# PHPUNIT Testing
|
||||
./tests/phpunit/bin/phpunit ./test/phpunit/tests/Tests.php
|
||||
|
||||
# GENERATION OF DOCUMENTATION BOOK
|
||||
php ./data/book sand print
|
||||
|
||||
# OBFUSCATION DU CODE (not working at all)
|
||||
#git clone https://github.com/pk-fr/yakpro-po.git
|
||||
#cd yakpro-po
|
||||
#git clone https://github.com/nikic/PHP-Parser.git
|
||||
#chmod a+x yakpro-po.php
|
||||
|
||||
php ./yakpro-po/yakpro-po.php --no-shuffle-statements --no-obfuscate-namespace-name --no-obfuscate-class-name --no-obfuscate-method-name --no-obfuscate-property-name --no-obfuscate-constant-name --no-obfuscate-string-literal --no-strip-indentation './MyAwesomeProjectDirectory' -o './MyAwesomeObfuscatedProjectDirectory'
|
||||
|
||||
#GIT USEFULL COMMAND
|
||||
##1
|
||||
git filter-branch --index-filter 'git rm --cached --ignore-unmatch **/????????MY_DIRECTORY??????/** '
|
||||
##2
|
||||
git fetch --all
|
||||
git reset --hard origin/master
|
|
@ -2,15 +2,17 @@
|
|||
|
||||
"autoload": {
|
||||
"files": [
|
||||
"./application/config/app-constantes.php",
|
||||
"./application/config/define-constantes.php",
|
||||
"./application/config/app-parameters.php",
|
||||
"./application/config/bdd-parameters.php"
|
||||
"./application/config/bdd-parameters.php",
|
||||
"./application/config/console-parameters.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"MVC\\Classe\\" : "./application/class",
|
||||
"MVC\\Object\\" : "./application/objets",
|
||||
"MVC\\Domain\\" : "./domain",
|
||||
"MVC\\Command\\": "./console/command"
|
||||
"MVC\\Command\\": "./console/command",
|
||||
"MVC\\Component\\" : "./console/component"
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
@ -1,27 +1,105 @@
|
|||
#!/usr/bin/php
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* Controlleur central du lancement des commandes
|
||||
* Package MVC\Command
|
||||
* @author Emmanuel ROY
|
||||
* @todo protect by chosen licence between an CC-licensed or MIT-licenced (open source)
|
||||
* @version 3.5
|
||||
* @uses \Command SAND Console-Script of commands
|
||||
*/
|
||||
global $argv;
|
||||
|
||||
require dirname(__DIR__) . DIRECTORY_SEPARATOR . "vendor" . DIRECTORY_SEPARATOR . "autoload.php";
|
||||
\MVC\Component\Debug::setPHPvalues();
|
||||
|
||||
function appel_cmd($class,$static_method,$argv){
|
||||
if(method_exists($class,$static_method)) {
|
||||
|
||||
//récupération des arguments de la commande pour passage en paramètre de la méthode
|
||||
$arguments = array();
|
||||
if (isset($argv[2])) {
|
||||
for ($i = 2; $i < count($argv); $i++) {
|
||||
$arguments[] = $argv[$i];
|
||||
}
|
||||
}
|
||||
//récupération des arguments maitres "--env=????????????? ou --debug-aff=TRUEor????????"
|
||||
$i = 0;
|
||||
foreach ($arguments as $master_arg) {
|
||||
/*if (preg_match("/--env=([A-Z]*)/", $master_arg, $matches)) {
|
||||
define("ENV", $matches[1]);
|
||||
unset($arguments[$i]);
|
||||
}*/
|
||||
$i++;
|
||||
}
|
||||
|
||||
//appel de la commande avec les paramètres spécifiés et récupération des erreurs
|
||||
$errors = $class::$static_method(...$arguments);
|
||||
|
||||
if ($errors !== null) {
|
||||
\MVC\Component\Error::logErrors($errors);
|
||||
}
|
||||
}else{
|
||||
$static_method = 'help';
|
||||
$class::$static_method();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
\MVC\Classe\Dumper::setPHPvalues();
|
||||
|
||||
//var_dump($argv);
|
||||
|
||||
if (isset($argv[1])) {
|
||||
$option = explode(':', $argv[1]);
|
||||
$command_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "command" . DIRECTORY_SEPARATOR . ucfirst($option[0]) . ".php";
|
||||
if (is_file($command_file)) {
|
||||
$class = "\MVC\Command\\" . ucfirst($option[0]);
|
||||
$static_method = $option[1];
|
||||
$errors = $class::$static_method();
|
||||
$class = "MVC\\Command\\" . ucfirst($option[0]);
|
||||
|
||||
if ($errors !== null) {
|
||||
\MVC\Classe\Logger::logCommandErrors($errors);
|
||||
if(isset($option[1]) && $option[1] !== '') {
|
||||
$static_method = $option[1];
|
||||
appel_cmd($class,$static_method,$argv);
|
||||
|
||||
}else{
|
||||
$static_method = 'help';
|
||||
$class::$static_method();
|
||||
}
|
||||
} else {
|
||||
print "Command not found !\n";
|
||||
$command_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "command" . DIRECTORY_SEPARATOR . "App" . DIRECTORY_SEPARATOR . ucfirst($option[0]) . ".php";
|
||||
if (is_file($command_file)) {
|
||||
$class = "MVC\\Command\\App\\" . ucfirst($option[0]);
|
||||
|
||||
if(isset($option[1]) && $option[1] !== '') {
|
||||
$static_method = $option[1];
|
||||
appel_cmd($class,$static_method,$argv);
|
||||
|
||||
}else{
|
||||
$static_method = 'help';
|
||||
$class::$static_method();
|
||||
}
|
||||
} else {
|
||||
$command_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "command" . DIRECTORY_SEPARATOR . "Sand" . DIRECTORY_SEPARATOR . ucfirst($option[0]) . ".php";
|
||||
if (is_file($command_file)) {
|
||||
$class = "MVC\\Command\\Sand\\" . ucfirst($option[0]);
|
||||
|
||||
if(isset($option[1]) && $option[1] !== '') {
|
||||
$static_method = $option[1];
|
||||
appel_cmd($class,$static_method,$argv);
|
||||
|
||||
}else{
|
||||
$static_method = 'help';
|
||||
$class::$static_method();
|
||||
}
|
||||
} else {
|
||||
print "SAND Command not found !\n";
|
||||
$class = "MVC\\Command\\Help";
|
||||
$static_method = 'help';
|
||||
$class::$static_method();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print "No command was specified !\n";
|
||||
$class = "MVC\\Command\\Help";
|
||||
$static_method = 'help';
|
||||
$class::$static_method();
|
||||
|
||||
}
|
38
console/command/App/Log.php
Normal file
38
console/command/App/Log.php
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Command\App;
|
||||
|
||||
/**
|
||||
* Class Log
|
||||
* Commande Console permettant de manipuler les logs de la base de donnée
|
||||
* @package MVC\Command\GPeX
|
||||
*/
|
||||
class Log
|
||||
{
|
||||
/**
|
||||
* Méthode permettant d'afficher l'aide de la commande
|
||||
*/
|
||||
public static function help()
|
||||
{
|
||||
print "help ?";
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de nettoyer les logs dont la date est iinférieur à aujourd'hui moins $nbMonth mois
|
||||
*
|
||||
* @param int $nbMonth
|
||||
*/
|
||||
public static function clearOlderThan($nbMonth = 1)
|
||||
{
|
||||
$ajh = new \DateTime('now');
|
||||
$olderThan = $ajh->modify('-1 month');
|
||||
$olderThan = $olderThan->format('Y-m-d');
|
||||
|
||||
//connection à la base de données
|
||||
/*$bdd = new \MVC\Classe\Bdd('bdd1');
|
||||
$sql = "DELETE FROM logs WHERE date_creation < {$olderThan};";
|
||||
$bdd->faireSQLRequete($sql);*/
|
||||
|
||||
print "Log older than $nbMonth month cleared ! \n\n";
|
||||
}
|
||||
}
|
36
console/command/Help.php
Normal file
36
console/command/Help.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Command;
|
||||
/**
|
||||
* Class Help
|
||||
* Commande d'aide principale du Framework
|
||||
* @package MVC\Command
|
||||
*/
|
||||
class Help
|
||||
{
|
||||
/**
|
||||
* Méthode permettant d'afficher l'aide de la commande
|
||||
*/
|
||||
public static function help()
|
||||
{
|
||||
print_r(<<<EOD
|
||||
Le système de commande du SAND Framework vous permet d'appeler :
|
||||
|
||||
\t action : permettant de créer et modifier les actions
|
||||
\t cache : permettant de gérer le cache du sytème
|
||||
\t conduit : permattant de créer et modifier les conduits
|
||||
\t page : permattant créer, dupliquer et modifier les pages
|
||||
\t symfony : permettant de gérer les modules symfony
|
||||
|
||||
Le système de commande de l'application vous permet d'appeler :
|
||||
|
||||
\t log : ou tout autre commande que vous auriez créé dans le dossier console/command/app
|
||||
|
||||
Vous pouvez obtenir l'aide des sous-commande en spéciant :
|
||||
|
||||
php bin.php macommande:help
|
||||
|
||||
EOD
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,10 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Command;
|
||||
namespace MVC\Command\Sand;
|
||||
/**
|
||||
* Class Action
|
||||
* Commande Système du Framework permettant de gérer les actions
|
||||
* @package MVC\Command
|
||||
* @package MVC\Command\Sand
|
||||
*/
|
||||
class Action
|
||||
{
|
|
@ -1,10 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Command;
|
||||
namespace MVC\Command\Sand;
|
||||
/**
|
||||
* Class Cache
|
||||
* Commande Système du Framework permettant de gérer le cache
|
||||
* @package MVC\Command
|
||||
* @package MVC\Command\Sand
|
||||
*/
|
||||
class Cache
|
||||
{
|
|
@ -1,10 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Command;
|
||||
namespace MVC\Command\Sand;
|
||||
/**
|
||||
* Class Conduit
|
||||
* Commande Système du Framework permettant de gérer les conduits
|
||||
* @package MVC\Command
|
||||
* @package MVC\Command\Sand
|
||||
*/
|
||||
class Conduit
|
||||
{
|
|
@ -1,10 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Command;
|
||||
namespace MVC\Command\Sand;
|
||||
/**
|
||||
* Class Module
|
||||
* Commande Système du Framework permettant de gérer les modules
|
||||
* @package MVC\Command
|
||||
* @package MVC\Command\Sand
|
||||
*/
|
||||
class Module
|
||||
{
|
||||
|
@ -22,16 +22,30 @@ class Module
|
|||
public static function add()
|
||||
{
|
||||
print "adding module...\n\n";
|
||||
print "Quel est le module a ajouter ?\n1.Symfony\n2.Wordpress\n3.Prestashop\n4.PhpList\n5.Wanewsletter\n6.PHPmyNewletter\n>";
|
||||
print "Quel est le module a ajouter ?\n0.Laravel\n1.Symfony\n2.Wordpress\n3.Prestashop\n4.PhpList\n5.Wanewsletter\n6.PHPmyNewletter\n>";
|
||||
$module = trim(fgets(STDIN));
|
||||
switch ($module) {
|
||||
case 0:
|
||||
print "Quel est le nom du module laravel à ajouter (default : laravel) ? ";
|
||||
$name = trim(fgets(STDIN));
|
||||
if ($name !== '' && preg_match('#(.)+#', $name)) {
|
||||
Module::addLaravel($name);
|
||||
} else {
|
||||
Module::addLaravel('symfony');
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
print "Quel est le nom du module symfony à ajouter (default : symfony) ? ";
|
||||
$name = trim(fgets(STDIN));
|
||||
print "Quel est la version de Symfony à ajouter (default : 4.4) ? ";
|
||||
$version = trim(fgets(STDIN));
|
||||
if ($version == '' && !preg_match('#(.)\.(.)\.(.)\.(.)#', $version)) {
|
||||
$version = "4.4";
|
||||
}
|
||||
if ($name !== '' && preg_match('#(.)+#', $name)) {
|
||||
Module::addSymfony($name);
|
||||
Module::addSymfony($name,$version);
|
||||
} else {
|
||||
Module::addSymfony('symfony');
|
||||
Module::addSymfony('symfony',$version);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
|
@ -117,33 +131,86 @@ class Module
|
|||
}
|
||||
}
|
||||
|
||||
private static function addSymfony($name = 'symfony')
|
||||
private static function addLaravel($name = 'laravel')
|
||||
{
|
||||
$git_clone = shell_exec('cd '.MODULES_PATH.' && composer create-project symfony/website-skeleton '.$name);
|
||||
$git_clone = shell_exec('cd '.MODULES_PATH.' && composer create-project laravel/laravel '.$name);
|
||||
print $git_clone;
|
||||
$git_chmod = shell_exec('sudo chmod 775 '.MODULES_PATH.'/'.$name.' -R');
|
||||
$git_chmod = shell_exec('chmod 775 '.MODULES_PATH.'/'.$name.' -R');
|
||||
print $git_chmod;
|
||||
$git_chown = shell_exec('sudo chown acksop:www-data '.MODULES_PATH.'/'.$name.' -R');
|
||||
$git_chown = shell_exec('chown acksop:www-data '.MODULES_PATH.'/'.$name.' -R');
|
||||
print $git_chown;
|
||||
$git_controlleur = shell_exec('cp '.CONSOLE_PATH.'/skel/module_symfony.php '.CONTROLLERS_PATH.'/'.$name.'.php');
|
||||
$git_controlleur = shell_exec('cp '.CONSOLE_PATH.'/skel/module.laravel.php '.CONTROLLERS_PATH.'/'.$name.'.php');
|
||||
$controlleur = file_get_contents(CONTROLLERS_PATH.'/'.$name.'.php');
|
||||
$controlleur = preg_replace('%MODULE%', $name, $controlleur);
|
||||
$controlleur = preg_replace('/%%MODULE_NAME%%/', $name, $controlleur);
|
||||
$controlleur = preg_replace('/%%MODULE%%/', 'laravel', $controlleur);
|
||||
file_put_contents(CONTROLLERS_PATH.'/'.$name.'.php', $controlleur);
|
||||
print $git_controlleur;
|
||||
$git_modele = shell_exec('cp '.CONSOLE_PATH.'/skel/module.model '.MODELS_PATH.'/'.$name.'.model');
|
||||
$git_modele = shell_exec('cp '.CONSOLE_PATH.'/skel/module.laravel.model '.MODELS_PATH.'/'.$name.'.model');
|
||||
$modele = file_get_contents(MODELS_PATH.'/'.$name.'.model');
|
||||
$modele = preg_replace('%MODULE%', $name, $modele);
|
||||
$modele = preg_replace('/%%MODULE_NAME%%/', $name, $modele);
|
||||
$modele = preg_replace('/%%MODULE%%/', 'laravel', $modele);
|
||||
file_put_contents(MODELS_PATH.'/'.$name.'.model', $modele);
|
||||
print $git_modele;
|
||||
$git_view = shell_exec('cp '.CONSOLE_PATH.'/skel/module.blade.php '.VIEW_PATH.'/view/'.$name.'.blade.php');
|
||||
$git_view = shell_exec('cp '.CONSOLE_PATH.'/skel/module.laravel.html.twig '.VIEW_PATH.'/view/'.$name.'.blade.php');
|
||||
$vue = file_get_contents(VIEW_PATH.'/view/'.$name.'.html.twig');
|
||||
$vue = preg_replace('/%%MODULE_NAME%%/', $name, $vue);
|
||||
$vue = preg_replace('/%%MODULE%%/', 'laravel', $vue);
|
||||
file_put_contents(VIEW_PATH.'/view/'.$name.'.html.twig', $vue);
|
||||
print $git_view;
|
||||
|
||||
//stabilize symfony application
|
||||
//print "stabilize symfony module...\n\n";
|
||||
//$symfony_module = shell_exec('cp '.CONSOLE_PATH.'/skel/symfony-app/* '.MODULES_PATH.'/'.$name.' -Rf');
|
||||
//$symfony_composer = shell_exec('cd '.MODULES_PATH.'/'.$name.' && composer update');
|
||||
|
||||
print "\n\nN'oubliez pas d'ajouter au fichier '/application/modules/setup/registre.model' :"
|
||||
."\n'.$name.' : Application permettant d'intégrer un module avec symfony"
|
||||
."\n "
|
||||
."\n et de créer la base de données!\n";
|
||||
}
|
||||
public static function removeLaravel($name = 'laravel')
|
||||
{
|
||||
$git_clone = system('rm -Rf '.MODULES_PATH.'/'.$name, $git_clone_retval);
|
||||
print $git_clone_retval;
|
||||
$git_controlleur = system('rm -f '.CONTROLLERS_PATH.'/'.$name.'.php', $git_controlleur_retval);
|
||||
print $git_controlleur_retval;
|
||||
$git_modele = system('rm -f '.MODELS_PATH.'/'.$name.'.model', $git_modele_retval);
|
||||
print $git_modele_retval;
|
||||
$git_view = system('rm -f '.VIEW_PATH.'/view/'.$name.'.html.twig', $git_view_retval);
|
||||
print $git_view_retval;
|
||||
}
|
||||
|
||||
private static function addSymfony($name = 'symfony',$version="4.4")
|
||||
{
|
||||
$git_clone = shell_exec('cd '.MODULES_PATH.' && composer create-project symfony/website-skeleton:"^'.$version.'" '.$name);
|
||||
print $git_clone;
|
||||
$git_chmod = shell_exec('chmod 775 '.MODULES_PATH.'/'.$name.' -R');
|
||||
print $git_chmod;
|
||||
$git_chown = shell_exec('chown acksop:www-data '.MODULES_PATH.'/'.$name.' -R');
|
||||
print $git_chown;
|
||||
$git_controlleur = shell_exec('cp '.CONSOLE_PATH.'/skel/module.symfony.php '.CONTROLLERS_PATH.'/'.$name.'.php');
|
||||
$controlleur = file_get_contents(CONTROLLERS_PATH.'/'.$name.'.php');
|
||||
$controlleur = preg_replace('/%%MODULE_NAME%%/', $name, $controlleur);
|
||||
$controlleur = preg_replace('/%%MODULE%%/', 'symfony', $controlleur);
|
||||
file_put_contents(CONTROLLERS_PATH.'/'.$name.'.php', $controlleur);
|
||||
print $git_controlleur;
|
||||
$git_modele = shell_exec('cp '.CONSOLE_PATH.'/skel/module.symfony.model '.MODELS_PATH.'/'.$name.'.model');
|
||||
$modele = file_get_contents(MODELS_PATH.'/'.$name.'.model');
|
||||
$modele = preg_replace('/%%MODULE_NAME%%/', $name, $modele);
|
||||
$modele = preg_replace('/%%MODULE%%/', 'symfony', $modele);
|
||||
file_put_contents(MODELS_PATH.'/'.$name.'.model', $modele);
|
||||
print $git_modele;
|
||||
$git_view = shell_exec('cp '.CONSOLE_PATH.'/skel/module.symfony.blade.php '.VIEW_PATH.'/view/'.$name.'.blade.php');
|
||||
$vue = file_get_contents(VIEW_PATH.'/view/'.$name.'.blade.php');
|
||||
$vue = preg_replace('%MODULE%', 'symfony', $vue);
|
||||
$vue = preg_replace('/%%MODULE_NAME%%/', $name, $vue);
|
||||
$vue = preg_replace('/%%MODULE%%/', 'symfony', $vue);
|
||||
file_put_contents(VIEW_PATH.'/view/'.$name.'.blade.php', $vue);
|
||||
print $git_view;
|
||||
|
||||
//stabilize symfony application
|
||||
include dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Symfony.php';
|
||||
$symfony_composer = shell_exec('cd '.MODULES_PATH.'/'.$name.' && composer update');
|
||||
//print "stabilize symfony module...\n\n";
|
||||
//$symfony_module = shell_exec('cp '.CONSOLE_PATH.'/skel/symfony-app/* '.MODULES_PATH.'/'.$name.' -Rf');
|
||||
//$symfony_composer = shell_exec('cd '.MODULES_PATH.'/'.$name.' && composer update');
|
||||
|
||||
print "\n\nN'oubliez pas d'ajouter au fichier '/application/modules/setup/registre.model' :"
|
||||
."\n'.$name.' : Application permettant d'intégrer un module avec symfony"
|
|
@ -1,10 +1,17 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Command;
|
||||
/**
|
||||
* Package MVC\Command\Sand
|
||||
* @author Emmanuel ROY
|
||||
* @license MIT-licence (open source)
|
||||
* @version 3.5
|
||||
*/
|
||||
|
||||
namespace MVC\Command\Sand;
|
||||
/**
|
||||
* Class Page
|
||||
* Commande Système du Framework permettant de gérer les pages
|
||||
* @package MVC\Command
|
||||
* @package MVC\Command\Sand
|
||||
*/
|
||||
class Page
|
||||
{
|
||||
|
@ -30,48 +37,60 @@ class Page
|
|||
print "Es-ce un template blade?(Y,N) Par defaut:Y ";
|
||||
$template = trim(fgets(STDIN));
|
||||
$vue = "";
|
||||
if ($template == '' || $template == 'Y') {
|
||||
$react = "";
|
||||
if ($template !== 'N') {
|
||||
$template = 'blade';
|
||||
|
||||
print "Es-ce une SPA vue.js? (Y,N) Par defaut:N ";
|
||||
$vue = trim(fgets(STDIN));
|
||||
if ($vue == '') {
|
||||
$vue = 'N';
|
||||
} else if ($vue !== 'Y') {
|
||||
if ($vue !== 'Y') {
|
||||
$vue = 'N';
|
||||
print "Es-ce une SPA react.js? (Y,N) Par defaut:N ";
|
||||
$react = trim(fgets(STDIN));
|
||||
if ($react !== 'Y') {
|
||||
$react = 'N';
|
||||
}else{
|
||||
$react = 'Y';
|
||||
}
|
||||
}else{
|
||||
$vue = 'Y';
|
||||
}
|
||||
|
||||
} else if ($template !== 'Y') {
|
||||
} else {
|
||||
$template = 'twig';
|
||||
}
|
||||
|
||||
|
||||
$shell_controlleur = shell_exec('cp ' . CONSOLE_PATH . '/skel/page.php ' . CONTROLLERS_PATH . '/' . $page . '.php');
|
||||
$controlleur = file_get_contents(CONTROLLERS_PATH . '/' . $page . '.php');
|
||||
$controlleur = preg_replace('%%PAGE%%', $page, $controlleur);
|
||||
$controlleur = preg_replace('/%%PAGE%%/', $page, $controlleur);
|
||||
file_put_contents(CONTROLLERS_PATH . '/' . $page . '.php', $controlleur);
|
||||
print $shell_controlleur;
|
||||
|
||||
$shell_modele = shell_exec('cp ' . CONSOLE_PATH . '/skel/page.model ' . MODELS_PATH . '/' . $page . '.model');
|
||||
$modele = file_get_contents(MODELS_PATH . '/' . $page . '.model');
|
||||
$modele = preg_replace('%%PAGE%%', $page, $modele);
|
||||
$modele = preg_replace('%%ENGINE%%', $template, $modele);
|
||||
$modele = preg_replace('/%%PAGE%%/', $page, $modele);
|
||||
$modele = preg_replace('/%%ENGINE%%/', $template, $modele);
|
||||
file_put_contents(MODELS_PATH . '/' . $page . '.model', $modele);
|
||||
print $shell_modele;
|
||||
|
||||
if ($template == 'blade'){
|
||||
if ($vue == 'N') {
|
||||
$shell_view = shell_exec('cp ' . CONSOLE_PATH . '/skel/page.blade.php ' . VIEW_PATH . '/view/' . $page . '.blade.php');
|
||||
if ($react == 'N') {
|
||||
$shell_view = shell_exec('cp ' . CONSOLE_PATH . '/skel/page-vuejs.blade.php ' . VIEW_PATH . '/view/' . $page . '.blade.php');
|
||||
} else {
|
||||
$shell_view = shell_exec('cp ' . CONSOLE_PATH . '/skel/page-reactjs.blade.php ' . VIEW_PATH . '/view/' . $page . '.blade.php');
|
||||
}
|
||||
} else {
|
||||
$shell_view = shell_exec('cp ' . CONSOLE_PATH . '/skel/page-vuejs.blade.php ' . VIEW_PATH . '/view/' . $page . '.blade.php');
|
||||
}
|
||||
$view = file_get_contents(VIEW_PATH . '/view/' . $page . '.blade.php');
|
||||
$view = preg_replace('%%PAGE%%', $page, $view);
|
||||
$view = preg_replace('/%%PAGE%%/', $page, $view);
|
||||
file_put_contents(VIEW_PATH.'/view/'.$page.'.blade.php', $view);
|
||||
}else{
|
||||
$shell_view = shell_exec('cp ' . CONSOLE_PATH . '/skel/page.html.twig ' . VIEW_PATH . '/view/' . $page . '.html.twig');
|
||||
$view = file_get_contents(VIEW_PATH . '/view/' . $page . '.html.twig');
|
||||
$view = preg_replace('%%PAGE%%', $page, $view);
|
||||
$view = preg_replace('/%%PAGE%%/', $page, $view);
|
||||
file_put_contents(VIEW_PATH.'/view/'.$page.'.html.twig', $view);
|
||||
}
|
||||
|
||||
|
@ -144,6 +163,13 @@ class Page
|
|||
print $shell_view;
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprimer en fonction du template contenu dans le model
|
||||
*/
|
||||
public static function delete()
|
||||
{
|
||||
self::remove();
|
||||
}
|
||||
/**
|
||||
* Supprimer en fonction du template contenu dans le model
|
||||
*/
|
|
@ -1,10 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Command;
|
||||
namespace MVC\Command\Sand;
|
||||
/**
|
||||
* Class Symfony
|
||||
* Commande Système du Framework permettant de gèrer les modules Symfony
|
||||
* @package MVC\Command
|
||||
* @package MVC\Command\Sand
|
||||
*/
|
||||
class Symfony
|
||||
{
|
29
console/component/Debug.php
Normal file
29
console/component/Debug.php
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Component;
|
||||
|
||||
/**
|
||||
* Composant permettant de debugger et d'initialiser certaines valeurs de php
|
||||
* @package Default
|
||||
*/
|
||||
class Debug
|
||||
{
|
||||
/**
|
||||
* Fonction Statique permettant d'initialiser les valeurs de php lors du script courant
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function setPHPvalues()
|
||||
{
|
||||
ini_set('display_errors', 1);
|
||||
ini_set('display_startup_errors', 1);
|
||||
ini_set('memory_limit', -1);
|
||||
ini_set('max_execution_time', 0);
|
||||
ini_set('default_socket_timeout', -1);
|
||||
date_default_timezone_set('Europe/Paris');
|
||||
|
||||
error_reporting(E_ALL);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
57
console/component/Error.php
Normal file
57
console/component/Error.php
Normal file
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Component;
|
||||
|
||||
/**
|
||||
* Composant permettant de logger les erreurs de la commande courante
|
||||
* @package Default
|
||||
*/
|
||||
class Error
|
||||
{
|
||||
/**
|
||||
* Fonction courante permettant de logger les erreurs obtenues dans un fichier
|
||||
*
|
||||
* @param array $errors
|
||||
* @return void
|
||||
*/
|
||||
public static function logErrors(array $errors)
|
||||
{
|
||||
$date = new \DateTime('now');
|
||||
// log connection errors to the web service
|
||||
ob_start();
|
||||
foreach ($errors as $key0 => $value0) {
|
||||
echo LINE_FEED.LINE_FEED."$key0 : ";
|
||||
if (is_array($value0)) {
|
||||
foreach ($value0 as $key1 => $value1) {
|
||||
echo LINE_FEED.LINE_FEED."--$key1 : ";
|
||||
if (is_array($value1)) {
|
||||
foreach ($value1 as $key2 => $value2) {
|
||||
echo LINE_FEED.LINE_FEED."----$key2 : ";
|
||||
if (is_array($value2)) {
|
||||
foreach ($value2 as $key3 => $value3) {
|
||||
echo LINE_FEED.LINE_FEED."------$key3 : ";
|
||||
if (is_array($value3)) {
|
||||
print_r("------>".$value3. " : array");
|
||||
} else {
|
||||
print_r("------>".$value3);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print_r("---->".$value2);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print_r("-->".$value1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print_r($value0);
|
||||
}
|
||||
}
|
||||
$write_string = ob_get_clean();
|
||||
file_put_contents(OUTPUT_PATH . DIRECTORY_SEPARATOR . "output" . DIRECTORY_SEPARATOR . ENV . DIRECTORY_SEPARATOR . "errors".$date->format("Y-m-d").".log", $write_string);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
37
console/component/Output.php
Normal file
37
console/component/Output.php
Normal file
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
namespace MVC\Component;
|
||||
|
||||
use Tests\Behat\Gherkin\Loader\DirectoryLoaderTest;
|
||||
|
||||
/**
|
||||
* Classe Output permettant de créér des fichiers de sortie de données
|
||||
*/
|
||||
class Output
|
||||
{
|
||||
/**
|
||||
* Fonction statique permettant d'écrire le fichier CSV de sortie
|
||||
* en lui donnant un nom particulier
|
||||
*
|
||||
* @param string $name
|
||||
* @param array $agents_tab
|
||||
* @param \DateTime $date_debut
|
||||
* @return void
|
||||
*/
|
||||
public static function createOutPutFile(string $name, array $agents_tab, \DateTime $date_debut)
|
||||
{
|
||||
$date_fin = new \DateTime('now');
|
||||
|
||||
ob_start();
|
||||
|
||||
echo "# ".$date_debut->format('d/m/Y H:i') . LINE_FEED;
|
||||
foreach ($agents_tab as $agent) {
|
||||
echo $agent . LINE_FEED;
|
||||
}
|
||||
echo "# FIN ".$date_fin->format('d/m/Y H:i') . LINE_FEED;
|
||||
|
||||
$csv_file = ob_get_clean();
|
||||
|
||||
file_put_contents(OUTPUT_PATH . DIRECTORY_SEPARATOR . $date_debut->format('Y-m-d-') . $name, $csv_file);
|
||||
}
|
||||
}
|
2
console/output/.gitignore
vendored
Normal file
2
console/output/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
*
|
||||
!.gitignore
|
1
console/skel/module.html.twig
Normal file
1
console/skel/module.html.twig
Normal file
|
@ -0,0 +1 @@
|
|||
{{ subcall( app, 'load', ['%%MODULE%%'] ) | raw }}
|
7
console/skel/module.laravel.html.twig
Normal file
7
console/skel/module.laravel.html.twig
Normal file
|
@ -0,0 +1,7 @@
|
|||
{% extends "body.html.twig" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ subcall( app, 'load', ['%%MODULE%%'] ) | raw }}
|
||||
|
||||
{% endblock %}
|
8
console/skel/module.laravel.model
Normal file
8
console/skel/module.laravel.model
Normal file
|
@ -0,0 +1,8 @@
|
|||
name : %%MODULE_NAME%%
|
||||
page_title : module_title
|
||||
description : module_description
|
||||
engine : twig
|
||||
authentification : no
|
||||
ariane : {%%MODULE%%}
|
||||
arianelink : {%%MODULE_NAME%%}
|
||||
|
3
console/skel/module.laravel.php
Normal file
3
console/skel/module.laravel.php
Normal file
|
@ -0,0 +1,3 @@
|
|||
<?php
|
||||
$app = new MVC\Classe\Modular($name, '%%MODULE%%', $url_params);
|
||||
$templateData = array('app' => $app);
|
|
@ -1,6 +1,6 @@
|
|||
name : %%MODULE%%
|
||||
name : %%MODULE_NAME%%
|
||||
page_title : module_title
|
||||
description : module_description
|
||||
ariane : {%%MODULE%%}
|
||||
arianelink : {%%MODULE%%}
|
||||
arianelink : {%%MODULE_NAME%%}
|
||||
|
||||
|
|
5
console/skel/module.symfony.blade.php
Normal file
5
console/skel/module.symfony.blade.php
Normal file
|
@ -0,0 +1,5 @@
|
|||
@extends('body')
|
||||
|
||||
@section('content')
|
||||
{{$app->load('%%MODULE%%')}}
|
||||
@endsection
|
8
console/skel/module.symfony.model
Normal file
8
console/skel/module.symfony.model
Normal file
|
@ -0,0 +1,8 @@
|
|||
name : %%MODULE_NAME%%
|
||||
page_title : module_title
|
||||
description : module_description
|
||||
engine : blade
|
||||
authentification : no
|
||||
ariane : {%%MODULE%%}
|
||||
arianelink : {%%MODULE_NAME%%}
|
||||
|
3
console/skel/module.symfony.php
Normal file
3
console/skel/module.symfony.php
Normal file
|
@ -0,0 +1,3 @@
|
|||
<?php
|
||||
$app = new MVC\Classe\Modular($name, '%%MODULE%%', $url_params);
|
||||
$templateData = array('app' => $app);
|
69
console/skel/page-reactjs.blade.php
Normal file
69
console/skel/page-reactjs.blade.php
Normal file
|
@ -0,0 +1,69 @@
|
|||
@extends('body')
|
||||
|
||||
@section('top-javascript')
|
||||
@parent
|
||||
<script src="https://unpkg.com/react@^16/umd/react.production.min.js"></script>
|
||||
<script src="https://unpkg.com/react-dom@16.13.0/umd/react-dom.production.min.js"></script>
|
||||
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<h1>%%PAGE%% - REACT.js Controlleur</h1>
|
||||
<br/><br/><br/>
|
||||
<div id="root"></div>
|
||||
@endsection
|
||||
|
||||
@section('bottom-javascript')
|
||||
@parent
|
||||
<script type="text/babel">
|
||||
class App extends React.Component {
|
||||
state = {
|
||||
data: [],
|
||||
}
|
||||
|
||||
// Code is invoked after the component is mounted/inserted into the DOM tree.
|
||||
componentDidMount() {
|
||||
const url =
|
||||
'https://ghibliapi.herokuapp.com/films'
|
||||
|
||||
fetch(url)
|
||||
.then((result) => result.json())
|
||||
.then((result) => {
|
||||
this.setState({
|
||||
data: result,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
render() {
|
||||
const {data} = this.state
|
||||
|
||||
const result = data.map(obj => {
|
||||
return (
|
||||
<a href="#" key="{obj.id}">
|
||||
<div>
|
||||
<div>
|
||||
<h2>
|
||||
{obj.title}
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
{obj.description.slice(0, 300) + "..." }
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<span>Year : {obj.release_date }</span>
|
||||
<span>Director : {obj.director }</span>
|
||||
<span>Producer : {obj.producer }</span>
|
||||
</div>
|
||||
</a>);
|
||||
})
|
||||
return <div>{result}</div>
|
||||
}
|
||||
}
|
||||
|
||||
ReactDOM.render(<App />, document.getElementById('root'))
|
||||
</script>
|
||||
@endsection
|
|
@ -7,12 +7,15 @@
|
|||
@endsection
|
||||
|
||||
@section('content')
|
||||
<h1>%PAGE% - VUE.js Controlleur</h1>
|
||||
<h1>ghibli - VUE.js Controlleur</h1>
|
||||
<br/><br/><br/>
|
||||
<div id="app">
|
||||
<div>
|
||||
<input v-model="searchText" placeholder="Search...">
|
||||
</div>
|
||||
<div v-if="is_loading" id="is-loading">
|
||||
<div class="lds-ellipsis"><div></div><div></div><div></div><div></div></div>
|
||||
</div>
|
||||
<div v-if="items" >
|
||||
<a href="#" v-for="item in itemsSearched" :key="item.id">
|
||||
<div>
|
||||
|
@ -41,17 +44,20 @@
|
|||
@section('bottom-javascript')
|
||||
@parent
|
||||
<script>
|
||||
@if(\MVC\Classe\Browser::get() !== 'Internet Explorer')
|
||||
const vue = new Vue({
|
||||
el: '#app',
|
||||
data: {
|
||||
items: [],
|
||||
searchText: ''
|
||||
searchText: '',
|
||||
is_loading: true,
|
||||
},
|
||||
mounted() {
|
||||
axios
|
||||
.get('https://ghibliapi.herokuapp.com/films')
|
||||
.then(response => {
|
||||
this.items = response.data;
|
||||
this.is_loading = false
|
||||
})
|
||||
.catch(error => console.log(error))
|
||||
},
|
||||
|
@ -73,5 +79,42 @@
|
|||
}
|
||||
}
|
||||
});
|
||||
@else
|
||||
const vue = new Vue({
|
||||
el: '#app',
|
||||
data: {
|
||||
items: [],
|
||||
searchText: '',
|
||||
is_loading: true,
|
||||
},
|
||||
mounted: function() {
|
||||
axios
|
||||
.get('https://ghibliapi.herokuapp.com/films')
|
||||
.then(function(response) {
|
||||
this.items = response.data;
|
||||
this.is_loading = false;
|
||||
document.getElementById('is-loading').style.display = 'none';
|
||||
})
|
||||
.catch(function(error) {console.log(error)})
|
||||
},
|
||||
computed: {
|
||||
itemsSearched : function(){
|
||||
var self = this;
|
||||
if( this.searchText == ''){
|
||||
return this.items;
|
||||
}
|
||||
return this.items.filter(function(item){
|
||||
// https://www.reddit.com/r/vuejs/comments/62kfae/how_do_i_create_very_simple_instant_search_filter/
|
||||
// Must be of string type
|
||||
return item.title.toLowerCase().indexOf(self.searchText) >= 0 ||
|
||||
item.producer.toLowerCase().indexOf(self.searchText) >= 0 ||
|
||||
item.director.toLowerCase().indexOf(self.searchText) >= 0 ||
|
||||
item.release_date.toString().indexOf(self.searchText) >= 0;
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
@endif
|
||||
</script>
|
||||
@endsection
|
|
@ -1,4 +1,4 @@
|
|||
{% extends "base.html" %}
|
||||
{% extends "body.html.twig" %}
|
||||
|
||||
{% block top-css %}
|
||||
{{ parent() }}
|
||||
|
|
15
data/doc-prince-book-generation/.gitignore
vendored
Normal file
15
data/doc-prince-book-generation/.gitignore
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
.tm_properties
|
||||
.idea
|
||||
.DS_Store
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
/vendor
|
||||
vendor
|
||||
vendor/
|
||||
vendor*
|
||||
composer.phar
|
||||
composer.lock
|
||||
Output
|
||||
*/Output
|
||||
build.sh
|
22
data/doc-prince-book-generation/LICENCE
Normal file
22
data/doc-prince-book-generation/LICENCE
Normal file
|
@ -0,0 +1,22 @@
|
|||
Copyright (c) 2013 Jean-François Lépine <http://blog.lepine.pro>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
31
data/doc-prince-book-generation/README.md
Normal file
31
data/doc-prince-book-generation/README.md
Normal file
|
@ -0,0 +1,31 @@
|
|||
# Livre sur le Développement piloté par le comportement
|
||||
|
||||
![](https://repository-images.githubusercontent.com/13304945/f5f26600-1e9b-11eb-84e7-fbbf90790e49)
|
||||
|
||||
## Télécharger les ebooks
|
||||
|
||||
+ 📗 **Tome 1 : à destination des personnes "métier"** ([pdf](https://github.com/Halleck45/livre-developpement-pilote-comportement/releases/download/1.0.0/developpement-pilote-par-le-comportement-tome1.pdf) | [epub](https://github.com/Halleck45/livre-developpement-pilote-comportement/releases/download/1.0.0/developpement-pilote-par-le-comportement-tome1.epub))
|
||||
+ 📙 **Tome 2 : pour les développeurs** ([pdf](https://github.com/Halleck45/livre-developpement-pilote-comportement/releases/download/1.0.0/developpement-pilote-par-le-comportement-tome2.pdf) | [epub](https://github.com/Halleck45/livre-developpement-pilote-comportement/releases/download/1.0.0/developpement-pilote-par-le-comportement-tome2.epub))
|
||||
|
||||
## Générer les livres locallement
|
||||
|
||||
```./book --dir=doc publish <tome> <edition>```
|
||||
|
||||
Par exemple:
|
||||
|
||||
```./book --dir=doc publish tome1 print```
|
||||
|
||||
## Copyright
|
||||
|
||||
Ce livre est publié avec EasyBook.
|
||||
|
||||
Copyright (c) 2013 Jean-François Lépine. See LICENSE for details.
|
||||
|
||||
|
||||
[![Licence Creative Commons](http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png)](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.fr)
|
||||
<span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Le Développement piloté par le comportement</span> de [Jean-François Lépine](http://communiquez.lepine.pro) est mis à disposition selon les termes de la [licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.fr).
|
||||
Fondé(e) sur une œuvre à [https://github.com/Halleck45/livre-developpement-pilote-comportement](https://github.com/Halleck45/livre-developpement-pilote-comportement).
|
||||
|
||||
## Contributeur
|
||||
|
||||
+ Auteur: Jean-François Lépine (Halleck45, http://blog.lepine.pro)
|
34
data/doc-prince-book-generation/book
Normal file
34
data/doc-prince-book-generation/book
Normal file
|
@ -0,0 +1,34 @@
|
|||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the easybook application.
|
||||
*
|
||||
* (c) Javier Eguiluz <javier.eguiluz@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
if (!file_exists(__DIR__.'/vendor/autoload.php')) {
|
||||
throw new \RuntimeException(
|
||||
"\n"
|
||||
."[ERROR] easybook depends on some external libraries and components.\n"
|
||||
."It seems that those dependencies aren't properly installed.\n\n"
|
||||
."Perhaps you forgot to execute 'php composer.phar install' before\n"
|
||||
."using easybook for the first time?\n\n"
|
||||
."This command requires that you have previously installed Composer.\n"
|
||||
."To do so, execute the following command:\n\n"
|
||||
." $ curl -s http://getcomposer.org/installer | php"
|
||||
."\n\n"
|
||||
);
|
||||
}
|
||||
|
||||
require __DIR__.'/vendor/autoload.php';
|
||||
|
||||
use Easybook\DependencyInjection\Application;
|
||||
use Easybook\Console\ConsoleApplication;
|
||||
|
||||
$app = new Application();
|
||||
$console = new ConsoleApplication($app);
|
||||
$console->run();
|
25
data/doc-prince-book-generation/composer.json
Normal file
25
data/doc-prince-book-generation/composer.json
Normal file
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"name": "halleck45/livre-bdd",
|
||||
"version": "1.0.0",
|
||||
|
||||
"repositories": {
|
||||
"geshi": {
|
||||
"type": "package",
|
||||
"package": {
|
||||
"name": "geshi/geshi",
|
||||
"version": "1.0.8.10",
|
||||
"dist": {
|
||||
"url": "http://sourceforge.net/projects/geshi/files/geshi/GeSHi%201.0.8.10/GeSHi-1.0.8.10.zip/download",
|
||||
"type": "zip"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
"require": {
|
||||
"easybook/easybook": "dev-master"
|
||||
},
|
||||
|
||||
"minimum-stability":"dev"
|
||||
}
|
|
@ -0,0 +1,227 @@
|
|||
# Comment installer le framework
|
||||
|
||||
## Préambule
|
||||
Tout d'abord avant de tenter quoi que soit au niveau de l'installation du framework, veuillez prendre en considération ces quatre(4) questions :
|
||||
|
||||
Avez-vous installé le logiciel de virtualisation docker ?
|
||||
|
||||
Avez-vous installé le logiciel de gestionnaire de version git ?
|
||||
|
||||
Avez-vous installé et utilisez-vous le language php au minimum dans sa version 7.4 ?
|
||||
|
||||
Avez-vous installé le logiciel de dépendances composer ?
|
||||
|
||||
Si la réponse est oui à ces quatre(4) questions alors vous êtes prêt à utiliser ce framework, même si vous ne connaissez pas les frameworks php tel que laravel ou symfony. Et dans ce cas ce sera peut-être pour vous une bonne introduction aux manipulations avancées qu'il est possible de faire avec ces imposants mastodontes.
|
||||
|
||||
Pour installer ces quatre(4) composantes nécessaires sous Windows je ne peut que vous donner les liens et vous inviter à consulter les quelques documentations disponible onTheWeb à ce sujet.
|
||||
|
||||
Le plus simple pour installer [docker](https://docs.docker.com/) est de se rendre sur [https://hub.docker.com/](https://hub.docker.com/) et de vous créer un compte, il sera obligatoire afin d'obtenir les images docker nécessaires lors de l'installation. Puis installer docker desktop disponible sous [https://hub.docker.com/editions/community/docker-ce-desktop-windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows)
|
||||
|
||||
Le plus simple pour installer [git](https://git-scm.com/doc) est de vous rendre sur [https://gitforwindows.org/](https://gitforwindows.org/) et de suivre la procédure d'installation.
|
||||
|
||||
Afin de vous aider à installer [php](https://www.php.net/docs.php) facilement vous pouvez utiliser le gestionnaire fournit avec windows : `Microsoft Web Platform installer` disponible à l'adresse [https://docs.microsoft.com/en-us/iis/install/web-platform-installer/web-platform-installer-direct-downloads](https://docs.microsoft.com/en-us/iis/install/web-platform-installer/web-platform-installer-direct-downloads) , une autre manière serait de récupérer [l'archive windows de la version de php](https://windows.php.net/download) qui vous intéresse et de la placer à la racine `C:` et d'ajouter le `PATH` de l'executable `php.exe` dans les variables d'environnement, ainsi dans la console `git-bash` fourni avec git-for-windows vous pourrez commencez à utiliser php en ligne de commande... et Sandyes (le petit nom du sablier de SAND) aime la ligne de commande :)
|
||||
|
||||
Enfin pour installer [composer](https://getcomposer.org/doc/) vous pouvez vous rendre sur [https://getcomposer.org/](https://getcomposer.org/)
|
||||
|
||||
Voilà vous avez tout [pour commencer à jouer avec le framework](https://sourcesup.renater.fr/wiki/mvc-sand-frame/installdokerlamp) :) Enfin presque...
|
||||
|
||||
Vous êtes un linuxien ? cela ne devrait pas vous poser de problèmes alors ? Si ? Dites les man-pages vous connaissez ? Si la réponse est non il vous faudra apprendre la base de tout ce qui existe du monde libre. Dans le cas contraire normalement le gestionnaire de dépendance de votre distribution doit vous permettre de faire le reste, il vous faudra alors lui demander à installer les paquets suivants :
|
||||
|
||||
`php8`-full (avec nécessairement les modules ldap, gd, mysql, pdo, zip, xml, et quelques autres que j'aurais oublié lors de cette écriture nocturne)
|
||||
|
||||
par exemple : ````apt install php8.0-common php8.0-mysql php8.0-ldap php8.0-xml php8.0-xmlrpc php8.0-curl php8.0-gd php8.0-imagick php8.0-cli php8.0-dev php8.0-imap php8.0-mbstring php8.0-opcache php8.0-soap php8.0-zip php8.0-intl -y````
|
||||
|
||||
`docker`
|
||||
`docker-compose`
|
||||
|
||||
par exemple : ````apt install docker docker-compose -y````
|
||||
|
||||
`git`
|
||||
|
||||
par exemple : ````apt install git -y````
|
||||
|
||||
`composer`
|
||||
|
||||
par exemple : ````apt install composer -y````
|
||||
|
||||
et gros un `apt-get install` ou un `apt install` ou un `yum install` ou un `pacman -S` ou encore `yahourt -S` vous suffira dans bien des cas. A moins que vous soyez sur une distribution spéciale que j'affectionne mais que je n'ai pas réussi à virtualiser par manque de temps [GUIX](https://guix.gnu.org/), à ce moment-là je vous laisse faire : cela ne devrai pas vous poser trop de problèmes...
|
||||
|
||||
## Voyons maintenant comment installer l'environnement ainsi que le framework SAND avant de développer et de comprendre ses mécanismes
|
||||
|
||||
Afin de pouvoir démarrer un projet SAND, vous devez mettre en place votre environnement de développement. Un bon IDE est déja la base nécessaire afin de programmer. Certains choisissent Eclipse, je vous conseillerais la version [PDT de Eclipse](https://www.eclipse.org/pdt/) qui est spécialisée PHP. D'autres vont vouloir programmer avec [VisualStudioCode](https://code.visualstudio.com/), qui est open source et permet grâce à ses nombreux modules de gérer à la fois `docker` et `git` tout en se concentrant sur ses lignes de programmation. Pour les plus passionnés : vous pouvez tester puis acheter une version annuelle de [PHPStorm](https://www.jetbrains.com/fr-fr/phpstorm/) ou [ZendStudio](https://www.zend.com/products/zend-studio) de puissants IDE provenant des plus grosses communautés de programmeurs PHP passionnées : ce sont les meilleurs sur le marché actuel. Aussi vous pouvez utiliser des éditeurs plus simples tels que [Sublime Text](https://www.sublimetext.com/) ou [Scite](https://www.scintilla.org/SciTE.html) ou encore [Notepad++](https://notepad-plus-plus.org/downloads/). C'est à vous de voir ce qui vous convient le mieux actuellement.
|
||||
|
||||
**Entrons maintenant dans le vif du sujet :**
|
||||
|
||||
Commençons par cloner le dépot docker nécessaire au framework par la commande `git clone` :
|
||||
|
||||
`git clone https://anonymous@git.renater.fr/authscm/eroy5/git/mvc-sand-frame/docker-lamp.git`
|
||||
|
||||
puis déplacez-vous dans le dossier www par la commande `cd` :
|
||||
|
||||
`cd docker-lamp/www`
|
||||
|
||||
et cloner le dépot du framework dans ce dossier sous le nom my-new-project-directory par la commande `git clone` :
|
||||
|
||||
`git clone https://anonymous@git.renater.fr/authscm/eroy5/git/mvc-sand-frame/mvc-sand-frame.git my-new-sand-projet-directory`
|
||||
|
||||
Voilà vous avez le nécessaire pour scruter le code du Framework et consulter les quelques documentations primales qui se trouvent dans le dossier `www/my-new-sand-projet-directory/data/docs`
|
||||
|
||||
|
||||
## Comment configurer l'environnement afin de commencer à consulter l'interface de base de SAND
|
||||
|
||||
|
||||
Voilà vous avez cloner les dépôts de base, mais il faut maintenant les configurer afin d'obtenir votre première page sur un navigateur. Pour cela nous allons mettre en place la configuration de docker-compose, puis faire le lien avec le dépôt du framework proprement dit.
|
||||
|
||||
tout d'abord, veuillez renommer le fichier `sample.env` en `.env` qui est nécessaire afin de définir les variables environnement de `docker-compose` :
|
||||
|
||||
`cd ../ mv sample.env .env`
|
||||
|
||||
De base, ce fichier comporte les bonnes variables d'environnement pour lancer l'image nécessaire sur windows et linux. En ouvrant le fichier `.env`, vous avez le loisir de modifier les ports de phpmyadmin et du serveur mysql. Plus d'informations sont disponible dans le fichier `README.md`
|
||||
|
||||
Je ne peut que vous conseiller d'ouvrir les fichiers `.env` et `docker-compose.yml` après avoir lu le README, et si vous êtes familier avec les lignes de commandes `bash` ce devrait être possible pour vous de comprendre la liaison intime entre ces deux fichiers. En effet, `docker-compose.yml` dépend des variables contenues dans le fichier `.env`
|
||||
|
||||
Parallèlement à cela vous devez configurer le fichier `config/vhosts/default.conf` afin de pointer le dossier `my-new-project-directory` à la bonne adresse locale:
|
||||
|
||||
ajouter/décommenter simplement les lignes suivantes dans ce fichier :
|
||||
|
||||
`nano config/vhosts/default.conf`
|
||||
````
|
||||
<VirtualHost *:80>
|
||||
ServerName my-new-sand-project.dev.local
|
||||
ServerAdmin webmaster@localhost
|
||||
DocumentRoot "/var/www/my-new-sand-project-directory/public"
|
||||
<Directory "/var/www/my-new-sand-project-directory/public/">
|
||||
AllowOverride all
|
||||
</Directory>
|
||||
</VirtualHost>
|
||||
````
|
||||
vous pouvez aussi utiliser la commande suivante :
|
||||
|
||||
```` echo '<VirtualHost *:80>
|
||||
ServerName my-new-sand-project.dev.local
|
||||
ServerAdmin webmaster@localhost
|
||||
DocumentRoot "/var/www/my-new-sand-project-directory/public"
|
||||
<Directory "/var/www/my-new-sand-project-directory/public/">
|
||||
AllowOverride all
|
||||
</Directory>
|
||||
</VirtualHost>' >> config/vhosts/default.conf
|
||||
````
|
||||
|
||||
Une fois ceci fait, ouvrez le fichier `docker-compose.yml`
|
||||
|
||||
`nano docker-compose.yml`
|
||||
|
||||
et ajouter/décommenter la ligne à la suite de la config des extra-hosts :
|
||||
|
||||
`#- “my-new-sand-project.dev.local:127.0.0.1”`
|
||||
|
||||
Voilà vous êtes presque prêt à utiliser un `[docker-lamp](https://github.com/sprintcube/docker-compose-lamp)`. J'espère néanmoins que vous avez un compte sur docker-hub connecté à votre docker-desktop si sous êtes windows... Avec Linux tout marche tout de bout en bout facilement.
|
||||
|
||||
Une petite astuce sous windows cependant : afin d'utiliser les commandes que je vous ai donné sur cette page, vous devez avoir installé et lancer `git bash`.
|
||||
|
||||
Une dernière chose avant de configurer les dépendances de SAND : afin que votre navigateur puisse accéder au vhost docker que nous avons configuré, il vous faut ajouter les lignes suivantes au fichier `hosts` de votre OS.
|
||||
````
|
||||
127.0.0.1 html.dev.local
|
||||
127.0.0.1 my-new-sand-project.dev.local
|
||||
````
|
||||
Sous windows celui-ci se trouve dans `c:\Windows\System32\drivers\etc` et sous Linux sous `/etc`
|
||||
|
||||
## Configurer SAND pour un premier lancement
|
||||
|
||||
|
||||
Allez ! Vous y êtes presque :
|
||||
|
||||
Afin de charger toutes les dépendances vous devez avoir `composer` d'installé. Alors déplacez-vous dans le dossier `www/my-new-project-directory`
|
||||
|
||||
`cd www/my-new-sand-project-directory`
|
||||
|
||||
et lancer la commande `composer update`
|
||||
|
||||
Bon et maintenant ?
|
||||
|
||||
Il vous faut mettre en place charger les dépendances composer dans trois autres dossiers, un pour faire du [Test Driven Development (TDD)](https://www.test-recette.fr/), un autre pour les [tests fonctionnel BeHat](https://github.com/Halleck45/livre-developpement-pilote-comportement), et enfin un dernier pour réaliser [des builds et des métriques](https://jenkins-le-guide-complet.github.io/) sur votre projet
|
||||
|
||||
Suivez et exécutez ces commandes :
|
||||
````
|
||||
cd tests
|
||||
cd phpunit
|
||||
composer update
|
||||
cd ../behat
|
||||
composer update
|
||||
cd ../../build
|
||||
composer update
|
||||
cd ../
|
||||
````
|
||||
Voilà tout est prêt, enfin presque : reste à lier les variables de configuration du framework, celles-ci sont toutes dans le dossier `application/config/` : Donc à partir de là :
|
||||
````
|
||||
cd application/config
|
||||
mv app-parameters.php.skel app-parameters.php
|
||||
mv bdd-parameters.php.skel bdd-parameters.php
|
||||
mv console-parameters.php.skel console-parameters.php
|
||||
````
|
||||
enfin pour finir mettons en place la configuration de l'URL locale et de la base de données Mysql propre au `docker-lamp`:
|
||||
|
||||
`nano app-parameters.php`
|
||||
|
||||
modifier la constante `PATH_URL` avec la valeur [http://my-new-sand-project.dev.local](http://my-new-sand-project.dev.local/)
|
||||
|
||||
sauvegardez, puis
|
||||
|
||||
`nano bdd-parameters.php`
|
||||
|
||||
modifiez les constantes par défaut de cette manière
|
||||
````
|
||||
define('DSN_BDD_DEFAULT', "mysql:host=database;dbname=docker");
|
||||
define('USER_BDD_DEFAULT', "docker");
|
||||
define('PASS_BDD_DEFAULT', "docker");
|
||||
````
|
||||
sauvegardez, puis...
|
||||
|
||||
Voilà, vous êtes prêt à lancer le daemon docker !
|
||||
|
||||
## Lancer docker et accéder à l'interface de base du framework SAND-for-Universities
|
||||
|
||||
|
||||
Bon normalement à partir de là, vous devriez être capable de mettre en place la base du framework à l'adresse : [http://my-new-sand-project.dev.local](http://my-new-sand-project.dev.local/) ou tout autre adresse que vous auriez précédemment préférée à celle-ci.
|
||||
|
||||
Juste ouvrez votre terminal favori puis lancer la commande suivante depuis la racine contenant le fichier `docker-compose.yml` :
|
||||
|
||||
`docker-compose up -d -----build`
|
||||
|
||||
si tout se passe bien, vous allez assister à un build parfait et à l'affichage des lignes suivantes ; celles-ci valident que tout s'est bien déroulé :
|
||||
````
|
||||
$ docker-compose up -d
|
||||
[...]
|
||||
Network docker-lamp_default Creating
|
||||
Network docker-lamp_default Created
|
||||
Container docker-lamp-database Creating
|
||||
Container docker-lamp-database Created
|
||||
Container docker-lamp-php80 Creating
|
||||
Container docker-lamp-phpmyadmin Creating
|
||||
Container docker-lamp-phpmyadmin Created
|
||||
Container docker-lamp-php80 Created
|
||||
Container docker-lamp-database Starting
|
||||
Container docker-lamp-database Started
|
||||
Container docker-lamp-php80 Starting
|
||||
Container docker-lamp-phpmyadmin Starting
|
||||
Container docker-lamp-phpmyadmin Started
|
||||
Container docker-lamp-php80 Started
|
||||
````
|
||||
Voilà ! l'installation est terminée. Rendez-vous sur [http://my-new-sand-project.dev.local](http://my-new-sand-project.dev.local/) pour admirer votre travail :)
|
||||
|
||||
Dans le cas ou le build ne fonctionne pas, tentez de regarder dans le dossier `bin/php80` le fichier `DockerFile` et commentez les lignes qui posent problème par un dièse(`#`) . Un peu d'huile de mimines et le tour est joué.
|
||||
|
||||
Voici maintenant quelques commandes-astuces avec `Docker` :
|
||||
|
||||
`docker ps` permet de voir les conteneurs lancés actuellement
|
||||
|
||||
`docker logs` permet de comprendre pourquoi un conteneur n'est pas stable en raison d'une mauvaise configuration
|
||||
|
||||
`docker exec` permet d'entrer dans le conteneur et de relancer certains services, à cependant utiliser avec précaution car dès que vous réalisez un rebuild du conteneur, les modifications réalisées à l'intérieur sont effacées.
|
||||
|
||||
pour `Docker-compose` maintenant :
|
||||
|
||||
vous pouvez utiliser `docker-compose down` et `docker-compose kill`.
|
||||
|
||||
A vous de jouer :) !
|
||||
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue