Compare commits
16 commits
Author | SHA1 | Date | |
---|---|---|---|
Emmanuel ROY | cbcb0eb22f | ||
10bc015688 | |||
8277707a22 | |||
6d4e4f20f7 | |||
5d8dd0f702 | |||
61af7f0fcb | |||
d69e72165d | |||
666a13f719 | |||
73a505ce7b | |||
448f312b2e | |||
df0aeb1b80 | |||
e55358c819 | |||
f8bcc15874 | |||
108e5d7641 | |||
d8075c803b | |||
7a3cf99bea |
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.
|
||||
|
|
|
@ -26,8 +26,21 @@ class Application
|
|||
|
||||
$this->url = new Url($this->http->method, $this->browser->isAppRequest());
|
||||
|
||||
$dispacher = new Dispacher();
|
||||
$this->route = $dispacher->route;
|
||||
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()
|
||||
|
@ -40,4 +53,15 @@ class Application
|
|||
\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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -210,10 +210,22 @@ class Browser
|
|||
|
||||
public function isAppRequest()
|
||||
{
|
||||
if (preg_match('#App#', $this->user)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
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 {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -87,4 +87,41 @@ class Caracter
|
|||
$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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,16 +40,16 @@ 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);
|
||||
|
@ -58,6 +58,8 @@ class Controlleur
|
|||
//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();
|
||||
}
|
||||
$this->vue = new Vue($this->modele->page);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
ob_end_clean();
|
||||
|
||||
return $data;
|
||||
$buffer_sand = "";
|
||||
if (ob_get_level() == $level) {
|
||||
if (ob_get_level() > 1) {
|
||||
$buffer_sand = ob_get_contents();
|
||||
ob_end_clean();
|
||||
} 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);
|
||||
}
|
||||
}
|
|
@ -62,6 +62,22 @@ class Url
|
|||
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 ou tout autre module
|
||||
|
|
|
@ -60,6 +60,7 @@ class Vue
|
|||
switch ($engine){
|
||||
case 'twig':
|
||||
$renderer = new \Windwalker\Renderer\TwigRenderer($paths);
|
||||
$renderer->addExtension(new \MVC\Classe\TwigControlleurAction);
|
||||
$name .= '.html';
|
||||
break;
|
||||
case 'blade':
|
||||
|
|
|
@ -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");
|
||||
|
||||
define('ENV', "DEV", true);
|
||||
|
||||
//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");
|
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()
|
||||
{
|
||||
/**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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
@ -2,7 +2,7 @@ name : index
|
|||
page_title : Accueil de l'application
|
||||
description : zatou stra bracadabla
|
||||
|
||||
engine : blade
|
||||
engine : twig
|
||||
authentification : yes
|
||||
|
||||
ariane : {acceuil}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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
|
|
@ -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 %}
|
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", []));
|
|
@ -1,19 +1,23 @@
|
|||
#!/bin/bash
|
||||
|
||||
# PHP METRICS
|
||||
./bin/phpmetrics --report-html=./data/phpmetrics ../ --exclude="vendor","build","tests","data","console/skel","application/modules","application/include/vues/cache"
|
||||
./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,design,naming,unusedcode --exclude '*vendor*' --exclude '*tests*' --exclude '*build*' --exclude '*data*' --exclude '*skel*' --exclude '*modules*' --exclude '*cache*' > ./data/phpmd.html
|
||||
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,console/skel,application/modules,application/inculde/vues/cache ../
|
||||
./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 > data/phploc.txt
|
||||
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
|
||||
|
|
2
build/data/.gitignore
vendored
2
build/data/.gitignore
vendored
|
@ -1,2 +0,0 @@
|
|||
*
|
||||
!.gitignore
|
2
build/logs/.gitignore
vendored
Normal file
2
build/logs/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
*
|
||||
!.gitignore
|
|
@ -9,7 +9,7 @@
|
|||
<bootstrap/>
|
||||
|
||||
<!-- A phpDox project to process, you can have multiple projects in one config file -->
|
||||
<project name="SAND Framework Application" source="${basedir}/" workdir="${basedir}/.phpdox/xml">
|
||||
<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 -->
|
||||
|
@ -69,7 +69,7 @@
|
|||
|
||||
<!-- A generation process consists of one or more build tasks and of (optional) enrich sources -->
|
||||
|
||||
<enrich base="${basedir}/data">
|
||||
<enrich base="${basedir}/logs">
|
||||
<!-- @base - (Base-)Directory of datafiles used for enrich process -->
|
||||
|
||||
<!--<source type="...">-->
|
||||
|
@ -81,39 +81,32 @@
|
|||
<!--</source> -->
|
||||
|
||||
<!-- add phploc output -->
|
||||
<!--<source type="phploc" />-->
|
||||
<source type="phploc" />
|
||||
|
||||
<!-- git vcs information -->
|
||||
<!--<source type="git">
|
||||
<git binary="C:\Program Files\Git\cmd\git.exe" />
|
||||
<source type="git">
|
||||
<git binary="git" />
|
||||
<history enabled="true" limit="15" cache="${phpDox.project.workdir}/gitlog.xml" />
|
||||
</source>-->
|
||||
</source>
|
||||
-->
|
||||
|
||||
<!-- PHP Code Sniffer findings -->
|
||||
<!--
|
||||
<source type="phpcs">
|
||||
<file name="logs/phpcs.xml" />
|
||||
<file name="checkstyle.xml" />
|
||||
</source>
|
||||
-->
|
||||
|
||||
|
||||
<!-- PHPMessDetector -->
|
||||
<!--
|
||||
<source type="pmd">
|
||||
<file name="pmd.xml" />
|
||||
<file name="phpmd.xml" />
|
||||
</source>
|
||||
-->
|
||||
|
||||
|
||||
<!-- PHPUnit Coverage XML -->
|
||||
<!-- <source type="phpunit"> -->
|
||||
<!-- <coverage path="" /> -->
|
||||
<source type="phpunit">
|
||||
<coverage path="" />
|
||||
<!-- @path - the directory where the xml code coverage report can be found -->
|
||||
<!--</source>-->
|
||||
<!--
|
||||
<source type="phpunit">
|
||||
<filter directory="${phpDox.project.source}" />
|
||||
</source>
|
||||
-->
|
||||
|
||||
</enrich>
|
||||
|
||||
|
|
|
@ -1,27 +1,3 @@
|
|||
# PHP METRICS
|
||||
#composer global require 'phpmetrics/phpmetrics'
|
||||
phpmetrics --report-html=./data/phpmetrics ./ --exclude="vendor","build","tests","data","console/skel","application/modules","application/include/vues/cache"
|
||||
|
||||
# PHP DOCUMENTOR
|
||||
php ./build/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 ./build/bin/phpmd.phar ./ html codesize,design,naming,unusedcode --exclude '*vendor*' --exclude '*tests*' --exclude '*build*' --exclude '*data*' --exclude '*skel*' --exclude '*modules*' --exclude '*cache*' > data/phpmd.html
|
||||
|
||||
# CHARTS OF PROJECTS
|
||||
./build/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,console/skel,application/modules,application/inculde/vues/cache ./
|
||||
|
||||
# TEXT METRIC OF PROJECT
|
||||
php ./build/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 > data/phploc.txt
|
||||
|
||||
# DUPLICATED LINES OF PROJECT
|
||||
php ./build/bin/phpcpd-6.0.3.phar --exclude ./vendor --exclude ./build --exclude ./build --exclude ./data --exclude ./console/skel --exclude ./application/modules --exclude ./application/include/vues/cache ./ > data/phpcpd.txt
|
||||
|
||||
# DEAD CODE DETECTOR
|
||||
php ./build/bin/phpdcd-1.0.2.phar --exclude="./vendor" --exclude="./build" --exclude="./build" --exclude="./data" --exclude="./console/skel" --exclude="./application/modules" --exclude="./application/include/vues/cache" --recursive ./ > data/phpdcd.txt
|
||||
|
||||
|
||||
|
||||
# BEHAT Behavior Driven Developpement Initialisation
|
||||
#cd tests/behat
|
||||
#./bin/behat --init
|
||||
|
@ -29,14 +5,9 @@ php ./build/bin/phpdcd-1.0.2.phar --exclude="./vendor" --exclude="./build" --exc
|
|||
# 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
|
||||
|
@ -44,3 +15,10 @@ php ./data/book sand print
|
|||
#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
|
|
@ -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
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);
|
|
@ -1,4 +1,4 @@
|
|||
{% extends "base.html" %}
|
||||
{% extends "body.html.twig" %}
|
||||
|
||||
{% block top-css %}
|
||||
{{ parent() }}
|
||||
|
|
|
@ -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 :) !
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
|
||||
*SAND est nommé pour l'acronyme récursif (Simplement [AND et] un Autre Nouveau Dossier)*
|
||||
|
||||
Tout d'abord, avant même de vouloir ajouter de nouvelles pages, je vais vous présenter la structure, ainsi vous comprendrez où se trouvent les fichiers nécessaires afin d'ajouter une simple page `Hello_World`
|
||||
|
||||
## Comment est architecturé le framework SAND ?
|
||||
|
||||
La racine de SAND contient les dossiers suivant :
|
||||
|
||||
- `application` : dossier contenant différents fichiers, propre à l’application et au framework dont on détaillera le contenu plus bas.
|
||||
|
||||
1. `class` : dossier contenant les fichiers propres au framework. Ne doit pas être modifié.
|
||||
|
||||
2. `config` : dossier contenant les fichiers de configuration, normalement lors de la récupération du dépôt, les fichiers sont a renommer et a ancrer avec les bonnes valeurs
|
||||
|
||||
3. `include` : dossier de développement contient :
|
||||
|
||||
1. `actions` : dossier contenant les actions réutilisables dans les vues de l’application
|
||||
|
||||
2. `conduits` : dossier contenant le contrôleur qui est conduit par le routage symfony, ici utilisé exclusivement pour générer des réponses AJAX
|
||||
|
||||
3. `controlleurs` : dossier contenant les contrôleurs de l’applications, nous verrons plus tard le modèles MVC propre au framework, mais il faut savoir que les controlleurs contiennent les accès en bdd de la page correspondant à son nom
|
||||
|
||||
4. `modeles` :dossier contenant les modèles de l’application, il faut savoir que les modèles ont l’extension .model et contiennent les variable propres à la page, comme le title, la description ou plus récemment le fil d’ariane
|
||||
|
||||
5. `vues` : dossier contenant les fichiers blade ou twig utilisé dans les pages, les actions et les conduits dont voici le détail :
|
||||
|
||||
1. `cache` : dossier contenant les fichiers de cache généré par le moteur de rendu
|
||||
|
||||
2. `layout` : dossier contenant les différents layouts des pages
|
||||
|
||||
3. `system` : dossier contenant le/les layout(s) système(s)
|
||||
|
||||
4. `view` : dossier contenant toutes les vues de l’application, une convention de nommage peut être établie suivant le domaine de l’application, par exemple, toutes les vues des actions doivent commencer par action et toutes les vues des conduits doivent commencer par le nom du conduit duquel ils sont appelés
|
||||
|
||||
4. `logs` : dossier contenant les logs générer par l’application, une classe dédiée aux logs est contenue dans le framework
|
||||
|
||||
5. `modules` : dossier contenant les modules de l’application, il faut savoir que le framework peut contenir des applications modulaires, genre des applications symfony, wordpress, etc… toutes applications externe php peut avec un peu de doigté peut être intégré à une application, typiquement on peut intégrer un module de dépôt git genre gitlist à l’application que l’on est en train de développer.
|
||||
|
||||
6. `objets` : dossier contenant les objets de session du framework, ce dossier peut être modifié par l’utilisateur, il contient des classes qui sont utilisé dans le cadre de la gestion de session, par exemple l’authentification CAS
|
||||
|
||||
7. `traitements` : dossier contenant les traitements de formulaire selon le respect du pattern PRG (Post Redirect Get)
|
||||
|
||||
|
||||
- `console` : dossier contenant les commandes console propres au framework et à l’application*
|
||||
|
||||
1. `command` : dossier contenant les commandes console du framework et de l’application
|
||||
|
||||
2. `skel` : dossier contenant les squelettes utilisés lors des appels console
|
||||
|
||||
|
||||
- `data` : dossier contenant des données qui sont chargé par l’applications ou le framework
|
||||
|
||||
1. `docs` : dossier contenant la documentation de l’application
|
||||
|
||||
2. `domain` : dossier contenant les classes propres à la manipulation du domaine visé par l’application, ces classes peuvent être testées unitairement par PHPUnit
|
||||
|
||||
3. `output` : dossier contenant les sorties des commandes console de l’applications, ce peut être des logs ou des fichiers de traitement
|
||||
|
||||
|
||||
- `public` : dossier contenant la racine publique de l’application, le serveur apache doit pointer sur ce dossier pour que le reste ne soit pas accessible, il contient tous les assets (css, js) de l’application ainsi que le fichier index.php et .htaccess redirigant toutes les requêtes vers l’index.
|
||||
|
||||
- `tests` : dossier contenant les fichiers de tests unitaire ou fonctionnels
|
||||
|
||||
et :
|
||||
|
||||
- `vendor` : dossier créé par composer lors de la récupération des paquets nécessaire à l’application, contient aussi l’autoloader de l’application généré à la volée par composer
|
||||
|
||||
- `node_modules` : dossier créé par npm lors de la récupération des paquets pouvant être nécessaire à l’application
|
||||
|
||||
## Comment ajouter une nouvelle page nommé hello_world ?
|
||||
|
||||
Voilà vous êtes prêt, lancez donc la SANDcommande suivante depuis la racine
|
||||
|
||||
`php console/bin.php page:add`
|
||||
|
||||
puis répondez aux questions en donnant un nom tel que `hello_world`, et... trois(3) nouveaux fichiers sont apparus dans `application/include` : au sein de `controlleurs`, `modeles` et `vues/view`
|
||||
|
||||
Ouvrez les et regardez, votre nouvelle page est accessible sur [http://my-new-sand-project.dev.local/hello_world](http://my-new-sand-project.dev.local/hello_world)
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
** Comment ajouter une page hello_world ? **
|
||||
|
||||
|
||||
Lancez donc la SANDcommande suivante depuis la racine
|
||||
|
||||
''php console/bin.php page:add''
|
||||
|
||||
puis répondez aux questions en donnant un nom tel que ''hello_world'', et... trois(3) nouveaux fichiers sont apparus dans ''application/include'' : au sein de ''controlleurs'', ''modeles'' et ''vues/view''
|
||||
|
||||
Ouvrez les et regardez, votre nouvelle page est accessible sur http://my-new-sand-project.dev.local/hello_world
|
|
@ -0,0 +1,229 @@
|
|||
#Les vues Twig
|
||||
|
||||
Elles sont chargées dans cette ordre:
|
||||
|
||||
* application/include/vues/system
|
||||
* application/include/vues/layout
|
||||
* application/include/vues/view
|
||||
|
||||
ainsi la vue standard peut étendre de `application/include/vues/layout/body.html.twig`
|
||||
```php
|
||||
|
||||
{% extends "system.html.twig" %}
|
||||
|
||||
{% block body %}
|
||||
<!-- Body Inner -->
|
||||
<div class="body-inner">
|
||||
<!-- Topbar -->
|
||||
<div id="topbar" class="d-none d-xl-block d-lg-block topbar-transparent topbar-fullwidth dark"
|
||||
style="background: rgba(0, 0, 0, 0.59);">
|
||||
<div class="container">
|
||||
<ul class="top-menu">
|
||||
{{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>
|
||||
<!-- end: Topbar -->
|
||||
<!-- Header -->
|
||||
<header id="header" class="dark" data-transparent="true" data-fullwidth="true"
|
||||
style="background: rgba(0, 0, 0, 0.59);">
|
||||
<div class="header-inner">
|
||||
<div class="container">
|
||||
<!--Navigation Resposnive Trigger-->
|
||||
<div id="mainMenu-trigger">
|
||||
<a class="lines-button x"><span class="lines"></span></a>
|
||||
</div>
|
||||
<!--end: Navigation Resposnive Trigger-->
|
||||
<!--Navigation-->
|
||||
<div id="mainMenu">
|
||||
<div class="container">
|
||||
<!--Logo-->
|
||||
<div id="logo">
|
||||
<a href="#">
|
||||
SAND Framework
|
||||
</a>
|
||||
</div>
|
||||
<!--end: logo-->
|
||||
<nav>
|
||||
<ul>
|
||||
<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>
|
||||
<li {% if name == 'laravel' %} class="actual" {% endif %} ><a href="{{ call("\\MVC\\Classe\\Url","link_rewrite",[false, 'Laravel', []]) }}">Module Laravel</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
<!--end: Navigation-->
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<!-- end: Header -->
|
||||
<!-- 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="{{ 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 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>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<!--end: Alerts-->
|
||||
|
||||
{% block content %}{% endblock %}
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer id="footer">
|
||||
<div class="footer-content">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-3">
|
||||
<div class="widget">
|
||||
<div class="widget-title"></div>
|
||||
<p class="mb-5">
|
||||
<img src="{{ call("\\MVC\\Classe\\Url","asset_rewrite",['assets/img/1007698-ffeb3b.svg']) }}" width="150">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-9">
|
||||
<p>
|
||||
SAND FrameWork is an CC-licensed or MIT-licenced open source project and completely free to use.
|
||||
</p>
|
||||
<p>
|
||||
However, the amount of effort needed to maintain and develop new features for the project is not
|
||||
sustainable without proper financial backing.
|
||||
You can support its ongoing development by being a backer or a sponsor on
|
||||
<a href="https://www.patreon.com/">Patreon campaign</a>
|
||||
(recurring, with perks for different tiers), and get your company logo here.
|
||||
</p>
|
||||
<p>
|
||||
Also, you can make a <a href="https://www.paypal.me/">one time donation via PayPal</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="copyright-content">
|
||||
<div class="container">
|
||||
<div class="copyright-text text-center">© 2020-2021 Built with SAND Framework - Responsive SAND Template.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- end: Footer -->
|
||||
|
||||
</div>
|
||||
<!-- end: Body Inner -->
|
||||
{% endblock %}
|
||||
|
||||
```
|
||||
qui étends de `application/include/vues/system/system.html.twig`
|
||||
```php
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
{% block head %}
|
||||
<title>{{page_title}}</title>
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<meta name="author" content="" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="description" lang="fr" content="{{description}}"/>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<meta name="msapplication-TileColor" content="#ffffff">
|
||||
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
{% 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 topJavascript %}{% endblock %}
|
||||
|
||||
{% block body %}{% endblock %}
|
||||
|
||||
{% 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");
|
||||
Array.prototype.slice.call(PreventAllforms)
|
||||
.forEach(function (PreventForm) {
|
||||
PreventForm.onsubmit = submitted.bind(PreventForm);
|
||||
});
|
||||
}
|
||||
|
||||
function submitted(event) {
|
||||
if (event.target.classList.contains('do-resubmit')) {
|
||||
event.submitter.disabled = false;
|
||||
}else{
|
||||
event.submitter.disabled = true;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
```
|
|
@ -0,0 +1,257 @@
|
|||
#Les vues Blade
|
||||
|
||||
Elles sont chargées dans cette ordre:
|
||||
|
||||
* application/include/vues/system
|
||||
* application/include/vues/layout
|
||||
* application/include/vues/view
|
||||
|
||||
ainsi la vue standard peut étendre de `application/include/vues/layout/body.blade.php`
|
||||
```php
|
||||
@extends('system')
|
||||
|
||||
@section('body')
|
||||
<!-- Body Inner -->
|
||||
<div class="body-inner">
|
||||
<!-- Topbar -->
|
||||
<div id="topbar" class="d-none d-xl-block d-lg-block topbar-transparent topbar-fullwidth dark"
|
||||
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>
|
||||
<!-- end: Topbar -->
|
||||
<!-- Header -->
|
||||
<header id="header" class="dark" data-transparent="true" data-fullwidth="true"
|
||||
style="background: rgba(0, 0, 0, 0.59);">
|
||||
<div class="header-inner">
|
||||
<div class="container">
|
||||
<!--Navigation Resposnive Trigger-->
|
||||
<div id="mainMenu-trigger">
|
||||
<a class="lines-button x"><span class="lines"></span></a>
|
||||
</div>
|
||||
<!--end: Navigation Resposnive Trigger-->
|
||||
<!--Navigation-->
|
||||
<div id="mainMenu">
|
||||
<div class="container">
|
||||
<!--Logo-->
|
||||
<div id="logo">
|
||||
<a href="#">
|
||||
SAND Framework
|
||||
</a>
|
||||
</div>
|
||||
<!--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 == 'symfony4_4') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Symfony4_4', []) }}"> Module Symfony 4.4</a></li>
|
||||
<li @if($name == 'symfony5_1') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Symfony5_1', []) }}"> Module Symfony 5.1</a></li>
|
||||
<li @if($name == 'symfony5_2') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Symfony5_2', []) }}"> Module Symfony 5.2</a></li>
|
||||
<li @if($name == 'symfony5_3') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Symfony5_3', []) }}"> Module Symfony 5.3</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
<!--end: Navigation-->
|
||||
</div>
|
||||
</div>
|
||||
</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 -->
|
||||
@if (isset($ariane))
|
||||
<div id="breadcrumbs" class="fullwidth">
|
||||
<div class="container">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb-sand">
|
||||
@foreach($ariane as $value)
|
||||
@if($value == end($ariane))
|
||||
<li class="breadcrumb-item active" aria-current="page">{{$value}}</li>
|
||||
@else
|
||||
<li class="breadcrumb-item"><a href="{{\MVC\Classe\Url::link_rewrite(false,$arianelink[array_search($value,$ariane)])}}">{{$value}}</a></li>
|
||||
@endif
|
||||
@endforeach
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
<!-- end: BreadCrumbs -->
|
||||
|
||||
<section id="page-content">
|
||||
<div class="container">
|
||||
|
||||
<!--Alerts-->
|
||||
@if(isset($_SESSION['alerts']))
|
||||
@foreach($_SESSION['alerts'] as $alert)
|
||||
<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
|
||||
@endif
|
||||
<!--end: Alerts-->
|
||||
@yield('content')
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer id="footer">
|
||||
<div class="footer-content">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-3">
|
||||
<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">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-9">
|
||||
<p>
|
||||
SAND FrameWork is an CC-licensed or MIT-licenced open source project and completely free to use.
|
||||
</p>
|
||||
<p>
|
||||
However, the amount of effort needed to maintain and develop new features for the project is not
|
||||
sustainable without proper financial backing.
|
||||
You can support its ongoing development by being a backer or a sponsor on
|
||||
<a href="https://www.patreon.com/">Patreon campaign</a>
|
||||
(recurring, with perks for different tiers), and get your company logo here.
|
||||
</p>
|
||||
<p>
|
||||
Also, you can make a <a href="https://www.paypal.me/">one time donation via PayPal</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="copyright-content">
|
||||
<div class="container">
|
||||
<div class="copyright-text text-center">© 2020-2021 Built with SAND Framework - Responsive SAND Template.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- end: Footer -->
|
||||
|
||||
</div>
|
||||
<!-- end: Body Inner -->
|
||||
@endsection
|
||||
|
||||
```
|
||||
qui étends de `application/include/vues/system/system.blade.php`
|
||||
```php
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>{{$page_title}}</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<meta name="author" content="" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="description" lang="fr" content="{{$description}}"/>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<meta name="msapplication-TileColor" content="#ffffff">
|
||||
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
@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>
|
||||
|
||||
<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')
|
||||
|
||||
@section('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>
|
||||
|
||||
@if(\MVC\Classe\Browser::get() !== 'Internet Explorer')
|
||||
<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.
|
||||
*/
|
||||
|
||||
window.onload = function() {
|
||||
let PreventAllforms = document.querySelectorAll("form");
|
||||
Array.prototype.slice.call(PreventAllforms)
|
||||
.forEach(function (PreventForm) {
|
||||
PreventForm.onsubmit = submitted.bind(PreventForm);
|
||||
});
|
||||
}
|
||||
|
||||
function submitted(event) {
|
||||
if (event.target.classList.contains('do-resubmit')) {
|
||||
event.submitter.disabled = false;
|
||||
}else{
|
||||
event.submitter.disabled = true;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@endif
|
||||
@show
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
```
|
|
@ -53,14 +53,17 @@ class DefaultAction extends Action
|
|||
}
|
||||
```
|
||||
|
||||
avec cet accès dans la vue:
|
||||
avec cet accès dans une vue blade:
|
||||
```php
|
||||
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default',[])}}
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default.default',[4,5,6])}}
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default.variableSlug',['var1','var2'])}}
|
||||
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default.makeHttp11',[])}}
|
||||
```
|
||||
ou avec cet accès dans une vue twig:
|
||||
```php
|
||||
{{ action('default.defaultTwig',[4,5,6]) }}
|
||||
{{ action('default.makeHttp11',[]) }}
|
||||
```
|
||||
|
||||
|
||||
il faut absolument que l'action retourne du texte soit par la la méthode `render` soit par un `système de tampon`
|
|
@ -1,65 +0,0 @@
|
|||
#Les vues Twig
|
||||
|
||||
Elles sont chargées dans cette ordre:
|
||||
|
||||
* application/include/vues/system
|
||||
* application/include/vues/layout
|
||||
* application/include/vues/view
|
||||
|
||||
ainsi la vue standard peut étendre de `application/include/vues/layout/body.html.twig`
|
||||
```php
|
||||
|
||||
{% block body %}
|
||||
<!-- Body Inner -->
|
||||
<section id="page-content">
|
||||
<div class="container">
|
||||
|
||||
<!--Alerts-->
|
||||
{% if $_SESSION['alerts'] is defined %}
|
||||
{% foreach $_SESSION['alerts'] as alert %}
|
||||
<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 %}
|
||||
{% endif %}
|
||||
<!--end: Alerts-->
|
||||
{% block content %}{% endblock %}
|
||||
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}}
|
||||
|
||||
```
|
||||
qui étends de `application/include/vues/system/system.html.twig`
|
||||
```php
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
{% block head %}
|
||||
<title>{{page_title}}</title>
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<meta name="author" content="" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="description" lang="fr" content="{{description}}"/>
|
||||
{% 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')}}">
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
|
||||
{% block top-javascript %}{% 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>
|
||||
{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
```
|
|
@ -1,50 +0,0 @@
|
|||
#Les vues Blade
|
||||
|
||||
Elles sont chargées dans cette ordre:
|
||||
|
||||
* application/include/vues/system
|
||||
* application/include/vues/layout
|
||||
* application/include/vues/view
|
||||
|
||||
ainsi la vue standard peut étendre de `application/include/vues/layout/body.blade.php`
|
||||
```php
|
||||
@extends('system')
|
||||
|
||||
@section('body')
|
||||
|
||||
@section('sidebar')
|
||||
This is the master sidebar.
|
||||
@show
|
||||
|
||||
<div class="container">
|
||||
@yield('content')
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
```
|
||||
qui étends de `application/include/vues/system/system.blade.php`
|
||||
```php
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>{{$page_title}}</title>
|
||||
<meta name="description" lang="fr" content="{{$description}}"/>
|
||||
|
||||
@section('top-css')
|
||||
@endsection
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@section('top-javascript')
|
||||
@endsection
|
||||
|
||||
@yield('body')
|
||||
|
||||
@section('bottom-javascript')
|
||||
@endsection
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
```
|
|
@ -5,6 +5,8 @@ un controlleur similaire a Symfony qui est dénomé ici Conduit car il prend
|
|||
en paramètre une route défini dans le fichier routing.yml.
|
||||
|
||||
Cette fonctionnalité permet de choisir la route indépendamment du moteur.
|
||||
Elle est utlie aussi pour créer des appels Curl et Ajax.
|
||||
|
||||
il faut instancier le fichier `application/config/files/routing.yml`
|
||||
avec la route de base et les routes que vous voulez conduire, par exemple:
|
||||
```yml
|
|
@ -1,29 +1,37 @@
|
|||
#Comment Configurer un module Symfony ou tout autre application php
|
||||
#Comment Configurer un module ou tout autre application php
|
||||
|
||||
il vous faut instancier trois fichiers:
|
||||
|
||||
le modèle (.model) contenant le nom de la page qui porte le model
|
||||
ici : `application/include/modeles/syf51.model`
|
||||
ici : `application/include/modeles/my_module.model`
|
||||
```yaml
|
||||
name : syf51
|
||||
name : my_module
|
||||
page_title : Accueil de l'application modulaire
|
||||
description : zatou stra bracadabla
|
||||
params : params
|
||||
engine : blade
|
||||
ariane : {my_module_name}
|
||||
arianelink : {my_module}
|
||||
```
|
||||
le controlleur (.php) contenant ce code qui doit être automatisé
|
||||
ici: `application/include/controlleurs/syf51.php`
|
||||
le controlleur (.php) contenant ce code
|
||||
ici: `application/include/controlleurs/my_module.php`
|
||||
```php
|
||||
<?php
|
||||
\MVC\Classe\Session::start();
|
||||
$app = new MVC\Classe\Modular($name);
|
||||
$templateData = array('app' => $app);
|
||||
```
|
||||
et déclarer le module dans `\application\modules\setup\registre.model`
|
||||
le template (.blade.php) contenant ce code
|
||||
ici: `application/include/vues/view/my_module.php`
|
||||
```php
|
||||
{{$app->load('module_type')}}
|
||||
```
|
||||
aussi il vous faudra déclarer le module dans `\application\modules\setup\registre.model`
|
||||
par une ligne suplémentaire:
|
||||
```yaml
|
||||
syf51 : Application permettant de tester l'intégration d'un module avec symfony5.0.99
|
||||
my_module : Application permettant de tester l'intégration d'un module
|
||||
```
|
||||
|
||||
si besoin et que le module n'existe pas il vous faudras coder et modifier
|
||||
le fichier `/application/class/Modular.php` voir peut-être `/application/class/ModularRegister.php`
|
||||
ainsi que le dossier `\application\module\my_module`
|
||||
|
||||
si besoin et que le type du module n'existe pas il vous faudra ajouter le type du module en modifiant le fichier `/application/class/Modular.php` et les méthodes `__construct` et `load`
|
||||
|
||||
Good Luck !
|
|
@ -1 +1,10 @@
|
|||
#Comment bien utiliser les modules
|
||||
#Comment bien utiliser les modules
|
||||
|
||||
Simplement vous pouvez tester les intégrations prévues dans le FrameWork avec la commande `php bin.php module:add` ainsi vous aurez le choix d'intégrer en quelques modifications à la mimine un module Symfony ou Laravel. Pour cela choisissez les paramètres de base afin que l'installation se passe bien.
|
||||
|
||||
Il faut comprendre qu'un module Symfony ne peut fonctionner qu'avec un template `blade`, de même manière un module Laravel ne peut fonctionner qu'avec un template `twig`.
|
||||
Basiquement toute application utilisant le système de randu `twig` doit être intégré avec un template-sand `blade` et l'inverse.
|
||||
|
||||
Au niveau du sysème de routage, il faut absolument inclure le path du module, par exemple pour un module nommé 'SciFi', il faudra inclure dans les routes des controlleurs la chaine de caractères `\SciFi` devant toutes les routes de vos controlleurs.
|
||||
|
||||
Il en est de même pour les autres modules : Wordpress, GitList, PhpList, Pretashop, ... ainsi que pour tous les autres modules que vous voudriez intégrer par vous-même.
|
|
@ -0,0 +1 @@
|
|||
#Comment ajouter un module Symfony
|
|
@ -0,0 +1,27 @@
|
|||
__Le squelette de départ d'une application ExtJS__ : sisi c'est possible avec node.js mais l'intégration d'un tel outil n'as absolument pas été commencé lors de mon CDD à l'ufc ni même pendant ma période de convalescence du 15/07/2021 au 18/12/2021 car je me refuse encore actuellement de programmer, elle est un petit peu réfléchie et semble absolument possible avec de nombreuses application reliées mais je ne possède pas toutes les compréhensions techniques nécessaires pour le faire actuellement.
|
||||
|
||||
__Un moteur de wiki basé sur wikini__ : si les auteurs du wikini0.5 acceptent...
|
||||
|
||||
__Un moteur d'écriture en Markdown et Yaml dans de simples fichiers contenus dans /data__ : une portion de cela a été codé et est disponible sur le github du créateur du framework.
|
||||
|
||||
----
|
||||
|
||||
//
|
||||
Une dalle pdo plus performante (voir accueillant un système de choix de l'ORM ou un ORM spécifique)
|
||||
//
|
||||
|
||||
//
|
||||
Une réécriture complète du système de vue afin d'accueillir les nouvelles versions de Twig et Blade
|
||||
//
|
||||
|
||||
//
|
||||
Un systeme REST plus capable de faire ce qui doit être fait, imitant un peu Slim
|
||||
//
|
||||
|
||||
//
|
||||
Des améliorations au niveau de l'intégration de Bootstrap5.0 : par exemple le système de notification push
|
||||
//
|
||||
|
||||
//
|
||||
Ainsi que d'autres petites choses au niveau des objets de session et des composants de domaine (Composants de domaines qui ne seront accessible que sur RENATER, je garde précieusement ces fichiers...)
|
||||
//
|
227
data/docs/00. Comment installer l'environnement du framework.md
Normal file
227
data/docs/00. Comment installer l'environnement du framework.md
Normal file
|
@ -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 :) !
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
#Les étapes de configurations de SAND
|
||||
|
||||
il vous faut modifier quelques valeurs dans des fichiers de configuration
|
||||
- `application/config/app-parameters.php`
|
||||
- `application/config/bdd-parameters.php`
|
||||
|
||||
Les autres fichiers contenus dans config servent pour la branche dev
|
||||
|
||||
Dans le cas où vous voudriez utiliser les conduits vous devrez modifier le fichier `application/config/files/routing.yml`.
|
||||
|
|
@ -1 +0,0 @@
|
|||
#Comment bien utiliser les commandes dans le framework SAND
|
16
data/docs/01.a. Configuration de départ.md
Normal file
16
data/docs/01.a. Configuration de départ.md
Normal file
|
@ -0,0 +1,16 @@
|
|||
#Les étapes de configurations de SAND
|
||||
|
||||
il vous faut modifier quelques valeurs dans les fichiers de configuration suivant
|
||||
- `application/config/app-parameters.php.skel`
|
||||
- `application/config/bdd-parameters.php.skel`
|
||||
|
||||
et enlever l'extension `.skel` afin que l'autoload de composer puisse le prendre en compte
|
||||
|
||||
Vous pouvez tester une application de base simple en générant le dossier vendor en vous mettant à la racine de l'application et en lançant
|
||||
`composer update`. Si votre serveur est correctement configurer pour pointer dans le dossier public sur l'index, vous devriez obtenir une application de test avec les fonctionnalités de base. En triturant un peu les fichier contenus dans le dossier `application/include` vous devriez comprendre comment se contruit une application faites avec SAND.
|
||||
|
||||
Les autres fichiers contenus dans config servent pour la branche dev, mais peuvent aussi servir pour votre application.
|
||||
|
||||
Dans le cas où vous choissisez d'utiliser les conduits lors du développement de votre application,
|
||||
vous devrez modifier le fichier `application/config/files/routing.yml`.
|
||||
|
|
@ -12,6 +12,6 @@ où {page} est le nom :
|
|||
- Du modèle contenu dans `/application/include/modeles/{page}.model`
|
||||
- De la vue contenue dans `/application/include/vues/view/{page}.blade.php` ou `/application/include/vues/view/{page}.html.twig` suivant le moteur de rendu
|
||||
|
||||
...
|
||||
Vous pouvez ainsi récupérer les variables passées en GET dans le contrôlleur depuis `$url_params['varname1']`
|
||||
|
||||
D’autres types d’urls peuvent être mises en place par la configuration du routing symfony et des conduits, il faut alors renseigner les informations de routage dans le fichier `/application/config/files/routing.yml` et faire correspondre l’url d’accès au Conduit.
|
|
@ -0,0 +1,18 @@
|
|||
#Comment bien utiliser les commandes dans le framework SAND
|
||||
|
||||
Les commandes console du framework sont toutes documentée par l'appel de la méthode help
|
||||
|
||||
Par exemple pour voir les méthodes associés à la commande page vous pourvez lancer la commande suivante depuis le dossier console:
|
||||
|
||||
`php bin.php page:help`
|
||||
|
||||
et vous verrez les différentes méthodes qui y sont associées.
|
||||
|
||||
Typiquement sur un projet on peut soit ajouter les fichiers manuellement quand on a l'habitude, soit aussi profiter des commandes:
|
||||
`action`,`conduit`,`module` et `page`
|
||||
|
||||
Si vous avez a videz le cache des vues et des logs vous pouvez utiliser la commande
|
||||
`php bin.php cache:clear`
|
||||
quand a
|
||||
`php bin.php cache:stabilize`
|
||||
vous permet de vider le cache des vues blade et/ou twig
|
|
@ -0,0 +1,80 @@
|
|||
|
||||
*SAND est nommé pour l'acronyme récursif (Simplement [AND et] un Autre Nouveau Dossier)*
|
||||
|
||||
Tout d'abord, avant même de vouloir ajouter de nouvelles pages, je vais vous présenter la structure, ainsi vous comprendrez où se trouvent les fichiers nécessaires afin d'ajouter une simple page `Hello_World`
|
||||
|
||||
## Comment est architecturé le framework SAND ?
|
||||
|
||||
La racine de SAND contient les dossiers suivant :
|
||||
|
||||
- `application` : dossier contenant différents fichiers, propre à l’application et au framework dont on détaillera le contenu plus bas.
|
||||
|
||||
1. `class` : dossier contenant les fichiers propres au framework. Ne doit pas être modifié.
|
||||
|
||||
2. `config` : dossier contenant les fichiers de configuration, normalement lors de la récupération du dépôt, les fichiers sont a renommer et a ancrer avec les bonnes valeurs
|
||||
|
||||
3. `include` : dossier de développement contient :
|
||||
|
||||
1. `actions` : dossier contenant les actions réutilisables dans les vues de l’application
|
||||
|
||||
2. `conduits` : dossier contenant le contrôleur qui est conduit par le routage symfony, ici utilisé exclusivement pour générer des réponses AJAX
|
||||
|
||||
3. `controlleurs` : dossier contenant les contrôleurs de l’applications, nous verrons plus tard le modèles MVC propre au framework, mais il faut savoir que les controlleurs contiennent les accès en bdd de la page correspondant à son nom
|
||||
|
||||
4. `modeles` :dossier contenant les modèles de l’application, il faut savoir que les modèles ont l’extension .model et contiennent les variable propres à la page, comme le title, la description ou plus récemment le fil d’ariane
|
||||
|
||||
5. `vues` : dossier contenant les fichiers blade ou twig utilisé dans les pages, les actions et les conduits dont voici le détail :
|
||||
|
||||
1. `cache` : dossier contenant les fichiers de cache généré par le moteur de rendu
|
||||
|
||||
2. `layout` : dossier contenant les différents layouts des pages
|
||||
|
||||
3. `system` : dossier contenant le/les layout(s) système(s)
|
||||
|
||||
4. `view` : dossier contenant toutes les vues de l’application, une convention de nommage peut être établie suivant le domaine de l’application, par exemple, toutes les vues des actions doivent commencer par action et toutes les vues des conduits doivent commencer par le nom du conduit duquel ils sont appelés
|
||||
|
||||
4. `logs` : dossier contenant les logs générer par l’application, une classe dédiée aux logs est contenue dans le framework
|
||||
|
||||
5. `modules` : dossier contenant les modules de l’application, il faut savoir que le framework peut contenir des applications modulaires, genre des applications symfony, wordpress, etc… toutes applications externe php peut avec un peu de doigté peut être intégré à une application, typiquement on peut intégrer un module de dépôt git genre gitlist à l’application que l’on est en train de développer.
|
||||
|
||||
6. `objets` : dossier contenant les objets de session du framework, ce dossier peut être modifié par l’utilisateur, il contient des classes qui sont utilisé dans le cadre de la gestion de session, par exemple l’authentification CAS
|
||||
|
||||
7. `traitements` : dossier contenant les traitements de formulaire selon le respect du pattern PRG (Post Redirect Get)
|
||||
|
||||
|
||||
- `console` : dossier contenant les commandes console propres au framework et à l’application*
|
||||
|
||||
1. `command` : dossier contenant les commandes console du framework et de l’application
|
||||
|
||||
2. `skel` : dossier contenant les squelettes utilisés lors des appels console
|
||||
|
||||
|
||||
- `data` : dossier contenant des données qui sont chargé par l’applications ou le framework
|
||||
|
||||
1. `docs` : dossier contenant la documentation de l’application
|
||||
|
||||
2. `domain` : dossier contenant les classes propres à la manipulation du domaine visé par l’application, ces classes peuvent être testées unitairement par PHPUnit
|
||||
|
||||
3. `output` : dossier contenant les sorties des commandes console de l’applications, ce peut être des logs ou des fichiers de traitement
|
||||
|
||||
|
||||
- `public` : dossier contenant la racine publique de l’application, le serveur apache doit pointer sur ce dossier pour que le reste ne soit pas accessible, il contient tous les assets (css, js) de l’application ainsi que le fichier index.php et .htaccess redirigant toutes les requêtes vers l’index.
|
||||
|
||||
- `tests` : dossier contenant les fichiers de tests unitaire ou fonctionnels
|
||||
|
||||
et :
|
||||
|
||||
- `vendor` : dossier créé par composer lors de la récupération des paquets nécessaire à l’application, contient aussi l’autoloader de l’application généré à la volée par composer
|
||||
|
||||
- `node_modules` : dossier créé par npm lors de la récupération des paquets pouvant être nécessaire à l’application
|
||||
|
||||
## Comment ajouter une nouvelle page nommé hello_world ?
|
||||
|
||||
Voilà vous êtes prêt, lancez donc la SANDcommande suivante depuis la racine
|
||||
|
||||
`php console/bin.php page:add`
|
||||
|
||||
puis répondez aux questions en donnant un nom tel que `hello_world`, et... trois(3) nouveaux fichiers sont apparus dans `application/include` : au sein de `controlleurs`, `modeles` et `vues/view`
|
||||
|
||||
Ouvrez les et regardez, votre nouvelle page est accessible sur [http://my-new-sand-project.dev.local/hello_world](http://my-new-sand-project.dev.local/hello_world)
|
||||
|
10
data/docs/01.e.ii Comment ajouter une page proprement.md
Normal file
10
data/docs/01.e.ii Comment ajouter une page proprement.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
** Comment ajouter une page hello_world ? **
|
||||
|
||||
|
||||
Lancez donc la SANDcommande suivante depuis la racine
|
||||
|
||||
''php console/bin.php page:add''
|
||||
|
||||
puis répondez aux questions en donnant un nom tel que ''hello_world'', et... trois(3) nouveaux fichiers sont apparus dans ''application/include'' : au sein de ''controlleurs'', ''modeles'' et ''vues/view''
|
||||
|
||||
Ouvrez les et regardez, votre nouvelle page est accessible sur http://my-new-sand-project.dev.local/hello_world
|
|
@ -0,0 +1,14 @@
|
|||
# Comment fonctionnent les objets de sessions
|
||||
|
||||
le dossier `application/objets` contient les classes qui sont utilisés par les sessions, vous trouverez dans ce dossier les classes suivantes:
|
||||
|
||||
- `Session.php` qui contient les méthodes permettant de créer les sessions, dans une application moderne il est courant de définir des droits sur les pages par un système d'authentification, ici SAND ne déroge pas à la règle et dans les fichiers .model possèdent une variable `authentification` qui peut prendre les valeurs `yes` ou `no`, ainsi le framework appelera automatiquement la méthode `createAndTestSession()` dans les controlleurs, si cette variable est défini à `no`, alors seule la méthode `sessionStart()` sera appelée, ceci afin que les alertes et l'historique puissent fonctionner.
|
||||
Malheureusement les conduits et les traitements ne disposent pas d'un tel garde d'authentification, mais vous comprendrez qu'il est simple d'ajouter cette méthode au début d'un code de traitement ou de conduit.
|
||||
|
||||
- `Alert.php` contient quelques méthodes simples qui utilise la variable `$_SESSION`, elle est vidée a chaque génération de page sauf dans le cas des traitements, ainsi automatiquement une alerte peut être définie à afficher sur la page de redirection
|
||||
|
||||
- `History.php` permet d'obtenir à tout moment la page précédente de l'application, ainsi il est plus simple de rediriger les pages de traitement vers la page qui demande le traitement. Souvent dans les applications modernes vous avez un traitement qui doit être effectué depuis plusieurs pages cela permet de connaitre celle dont on provient sans passer par la variable serveur `$_SERVER["HTTP_REFERER"]` qui n'est pas toujours accessible.
|
||||
|
||||
- `XssToken.php` permet de définir un token dans la variable `$_SESSION` afin de protéger les formulaires de l'application contre la faille XSS.
|
||||
|
||||
Néanmoins il est possible que ce dossier contienne d'autres classes qui peuvent être utile, à vous de le fournir suivant les demandes de votre application.
|
|
@ -2,4 +2,6 @@
|
|||
|
||||
Tout d’abord, une fois l’application créé, toutes les ressources sont téléchargée par composer et le fichier composer.lock est garant de la stabilité des dépôts auxquels l’application fait appel. Donc normalement il ne sera pas nécessaire de faire évoluer ces ressources.
|
||||
|
||||
Néanmoins passer vers une nouvelle version de php par exemple de la 5.6 à la 8 nécessite des connaissances évolué des fonctions dépréciées entre les versions de PHP. SAND framework est php 8 ready, néanmoins certaines lib comme phpCAS ne fonctionne que sur php7.3, mais celles-ci une fois installée ne changent pas au cours du temps car elles sont directement accessibles depuis le dossier vendor.
|
||||
Néanmoins passer vers une nouvelle version de php par exemple de la 5.6 à la 8 nécessite des connaissances évolué des fonctions dépréciées entre les versions de PHP. SAND framework est php 8 ready, néanmoins certaines lib ne fonctionne que sur php7.3, mais celles-ci une fois installée ne changeront pas au cours du temps car elles sont directement accessibles depuis le dossier vendor.
|
||||
|
||||
Si vous utilisez les SPA vues.js, pensez à télécharger la version que vous utilisez afin de stabiliser votre application dans le temps, afin qu'elle ne consomme pas des ressources inutiles depuis le web.
|
|
@ -8,6 +8,9 @@ name : name
|
|||
page_title : Page de l'application
|
||||
description : Description de la page
|
||||
engine : blade
|
||||
authentification : no
|
||||
ariane : {acceuil, name}
|
||||
arianelink : {index, name}
|
||||
params1 : {val1,val2}
|
||||
params2 : val
|
||||
```
|
229
data/docs/03.a. Les vues Twig.md
Normal file
229
data/docs/03.a. Les vues Twig.md
Normal file
|
@ -0,0 +1,229 @@
|
|||
#Les vues Twig
|
||||
|
||||
Elles sont chargées dans cette ordre:
|
||||
|
||||
* application/include/vues/system
|
||||
* application/include/vues/layout
|
||||
* application/include/vues/view
|
||||
|
||||
ainsi la vue standard peut étendre de `application/include/vues/layout/body.html.twig`
|
||||
```php
|
||||
|
||||
{% extends "system.html.twig" %}
|
||||
|
||||
{% block body %}
|
||||
<!-- Body Inner -->
|
||||
<div class="body-inner">
|
||||
<!-- Topbar -->
|
||||
<div id="topbar" class="d-none d-xl-block d-lg-block topbar-transparent topbar-fullwidth dark"
|
||||
style="background: rgba(0, 0, 0, 0.59);">
|
||||
<div class="container">
|
||||
<ul class="top-menu">
|
||||
{{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>
|
||||
<!-- end: Topbar -->
|
||||
<!-- Header -->
|
||||
<header id="header" class="dark" data-transparent="true" data-fullwidth="true"
|
||||
style="background: rgba(0, 0, 0, 0.59);">
|
||||
<div class="header-inner">
|
||||
<div class="container">
|
||||
<!--Navigation Resposnive Trigger-->
|
||||
<div id="mainMenu-trigger">
|
||||
<a class="lines-button x"><span class="lines"></span></a>
|
||||
</div>
|
||||
<!--end: Navigation Resposnive Trigger-->
|
||||
<!--Navigation-->
|
||||
<div id="mainMenu">
|
||||
<div class="container">
|
||||
<!--Logo-->
|
||||
<div id="logo">
|
||||
<a href="#">
|
||||
SAND Framework
|
||||
</a>
|
||||
</div>
|
||||
<!--end: logo-->
|
||||
<nav>
|
||||
<ul>
|
||||
<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>
|
||||
<li {% if name == 'laravel' %} class="actual" {% endif %} ><a href="{{ call("\\MVC\\Classe\\Url","link_rewrite",[false, 'Laravel', []]) }}">Module Laravel</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
<!--end: Navigation-->
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<!-- end: Header -->
|
||||
<!-- 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="{{ 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 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>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<!--end: Alerts-->
|
||||
|
||||
{% block content %}{% endblock %}
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer id="footer">
|
||||
<div class="footer-content">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-3">
|
||||
<div class="widget">
|
||||
<div class="widget-title"></div>
|
||||
<p class="mb-5">
|
||||
<img src="{{ call("\\MVC\\Classe\\Url","asset_rewrite",['assets/img/1007698-ffeb3b.svg']) }}" width="150">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-9">
|
||||
<p>
|
||||
SAND FrameWork is an CC-licensed or MIT-licenced open source project and completely free to use.
|
||||
</p>
|
||||
<p>
|
||||
However, the amount of effort needed to maintain and develop new features for the project is not
|
||||
sustainable without proper financial backing.
|
||||
You can support its ongoing development by being a backer or a sponsor on
|
||||
<a href="https://www.patreon.com/">Patreon campaign</a>
|
||||
(recurring, with perks for different tiers), and get your company logo here.
|
||||
</p>
|
||||
<p>
|
||||
Also, you can make a <a href="https://www.paypal.me/">one time donation via PayPal</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="copyright-content">
|
||||
<div class="container">
|
||||
<div class="copyright-text text-center">© 2020-2021 Built with SAND Framework - Responsive SAND Template.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- end: Footer -->
|
||||
|
||||
</div>
|
||||
<!-- end: Body Inner -->
|
||||
{% endblock %}
|
||||
|
||||
```
|
||||
qui étends de `application/include/vues/system/system.html.twig`
|
||||
```php
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
{% block head %}
|
||||
<title>{{page_title}}</title>
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<meta name="author" content="" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="description" lang="fr" content="{{description}}"/>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<meta name="msapplication-TileColor" content="#ffffff">
|
||||
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
{% 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 topJavascript %}{% endblock %}
|
||||
|
||||
{% block body %}{% endblock %}
|
||||
|
||||
{% 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");
|
||||
Array.prototype.slice.call(PreventAllforms)
|
||||
.forEach(function (PreventForm) {
|
||||
PreventForm.onsubmit = submitted.bind(PreventForm);
|
||||
});
|
||||
}
|
||||
|
||||
function submitted(event) {
|
||||
if (event.target.classList.contains('do-resubmit')) {
|
||||
event.submitter.disabled = false;
|
||||
}else{
|
||||
event.submitter.disabled = true;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
```
|
257
data/docs/03.b. Les vues Blade.md
Normal file
257
data/docs/03.b. Les vues Blade.md
Normal file
|
@ -0,0 +1,257 @@
|
|||
#Les vues Blade
|
||||
|
||||
Elles sont chargées dans cette ordre:
|
||||
|
||||
* application/include/vues/system
|
||||
* application/include/vues/layout
|
||||
* application/include/vues/view
|
||||
|
||||
ainsi la vue standard peut étendre de `application/include/vues/layout/body.blade.php`
|
||||
```php
|
||||
@extends('system')
|
||||
|
||||
@section('body')
|
||||
<!-- Body Inner -->
|
||||
<div class="body-inner">
|
||||
<!-- Topbar -->
|
||||
<div id="topbar" class="d-none d-xl-block d-lg-block topbar-transparent topbar-fullwidth dark"
|
||||
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>
|
||||
<!-- end: Topbar -->
|
||||
<!-- Header -->
|
||||
<header id="header" class="dark" data-transparent="true" data-fullwidth="true"
|
||||
style="background: rgba(0, 0, 0, 0.59);">
|
||||
<div class="header-inner">
|
||||
<div class="container">
|
||||
<!--Navigation Resposnive Trigger-->
|
||||
<div id="mainMenu-trigger">
|
||||
<a class="lines-button x"><span class="lines"></span></a>
|
||||
</div>
|
||||
<!--end: Navigation Resposnive Trigger-->
|
||||
<!--Navigation-->
|
||||
<div id="mainMenu">
|
||||
<div class="container">
|
||||
<!--Logo-->
|
||||
<div id="logo">
|
||||
<a href="#">
|
||||
SAND Framework
|
||||
</a>
|
||||
</div>
|
||||
<!--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 == 'symfony4_4') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Symfony4_4', []) }}"> Module Symfony 4.4</a></li>
|
||||
<li @if($name == 'symfony5_1') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Symfony5_1', []) }}"> Module Symfony 5.1</a></li>
|
||||
<li @if($name == 'symfony5_2') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Symfony5_2', []) }}"> Module Symfony 5.2</a></li>
|
||||
<li @if($name == 'symfony5_3') class="actual" @endif ><a href="{{ \MVC\Classe\Url::link_rewrite( false, 'Symfony5_3', []) }}"> Module Symfony 5.3</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
<!--end: Navigation-->
|
||||
</div>
|
||||
</div>
|
||||
</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 -->
|
||||
@if (isset($ariane))
|
||||
<div id="breadcrumbs" class="fullwidth">
|
||||
<div class="container">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb-sand">
|
||||
@foreach($ariane as $value)
|
||||
@if($value == end($ariane))
|
||||
<li class="breadcrumb-item active" aria-current="page">{{$value}}</li>
|
||||
@else
|
||||
<li class="breadcrumb-item"><a href="{{\MVC\Classe\Url::link_rewrite(false,$arianelink[array_search($value,$ariane)])}}">{{$value}}</a></li>
|
||||
@endif
|
||||
@endforeach
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
<!-- end: BreadCrumbs -->
|
||||
|
||||
<section id="page-content">
|
||||
<div class="container">
|
||||
|
||||
<!--Alerts-->
|
||||
@if(isset($_SESSION['alerts']))
|
||||
@foreach($_SESSION['alerts'] as $alert)
|
||||
<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
|
||||
@endif
|
||||
<!--end: Alerts-->
|
||||
@yield('content')
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer id="footer">
|
||||
<div class="footer-content">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-3">
|
||||
<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">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-9">
|
||||
<p>
|
||||
SAND FrameWork is an CC-licensed or MIT-licenced open source project and completely free to use.
|
||||
</p>
|
||||
<p>
|
||||
However, the amount of effort needed to maintain and develop new features for the project is not
|
||||
sustainable without proper financial backing.
|
||||
You can support its ongoing development by being a backer or a sponsor on
|
||||
<a href="https://www.patreon.com/">Patreon campaign</a>
|
||||
(recurring, with perks for different tiers), and get your company logo here.
|
||||
</p>
|
||||
<p>
|
||||
Also, you can make a <a href="https://www.paypal.me/">one time donation via PayPal</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="copyright-content">
|
||||
<div class="container">
|
||||
<div class="copyright-text text-center">© 2020-2021 Built with SAND Framework - Responsive SAND Template.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- end: Footer -->
|
||||
|
||||
</div>
|
||||
<!-- end: Body Inner -->
|
||||
@endsection
|
||||
|
||||
```
|
||||
qui étends de `application/include/vues/system/system.blade.php`
|
||||
```php
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>{{$page_title}}</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<meta name="author" content="" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="description" lang="fr" content="{{$description}}"/>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<meta name="msapplication-TileColor" content="#ffffff">
|
||||
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
@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>
|
||||
|
||||
<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')
|
||||
|
||||
@section('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>
|
||||
|
||||
@if(\MVC\Classe\Browser::get() !== 'Internet Explorer')
|
||||
<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.
|
||||
*/
|
||||
|
||||
window.onload = function() {
|
||||
let PreventAllforms = document.querySelectorAll("form");
|
||||
Array.prototype.slice.call(PreventAllforms)
|
||||
.forEach(function (PreventForm) {
|
||||
PreventForm.onsubmit = submitted.bind(PreventForm);
|
||||
});
|
||||
}
|
||||
|
||||
function submitted(event) {
|
||||
if (event.target.classList.contains('do-resubmit')) {
|
||||
event.submitter.disabled = false;
|
||||
}else{
|
||||
event.submitter.disabled = true;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@endif
|
||||
@show
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
```
|
88
data/docs/03.c. Les vues Blade avec SPA(vuejs).md
Normal file
88
data/docs/03.c. Les vues Blade avec SPA(vuejs).md
Normal file
|
@ -0,0 +1,88 @@
|
|||
#Les vues Blade avec une SPA Vue.js
|
||||
|
||||
Elles sont chargées dans le même ordre que les vues Blade normale:
|
||||
|
||||
* application/include/vues/system
|
||||
* application/include/vues/layout
|
||||
* application/include/vues/view
|
||||
|
||||
Cependant il faut inclure les biblitohèques Vue.js dans la page et coder à la mimine la SPA
|
||||
par exemple:
|
||||
|
||||
```php
|
||||
@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="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: ''
|
||||
},
|
||||
mounted() {
|
||||
axios
|
||||
.get('https://ghibliapi.herokuapp.com/films')
|
||||
.then(response => {
|
||||
this.items = response.data;
|
||||
})
|
||||
.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
|
||||
```
|
|
@ -53,14 +53,17 @@ class DefaultAction extends Action
|
|||
}
|
||||
```
|
||||
|
||||
avec cet accès dans la vue:
|
||||
avec cet accès dans une vue blade:
|
||||
```php
|
||||
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default',[])}}
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default.default',[4,5,6])}}
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default.variableSlug',['var1','var2'])}}
|
||||
|
||||
{{\MVC\Classe\ControlleurAction::inserer('default.makeHttp11',[])}}
|
||||
```
|
||||
ou avec cet accès dans une vue twig:
|
||||
```php
|
||||
{{ action('default.defaultTwig',[4,5,6]) }}
|
||||
{{ action('default.makeHttp11',[]) }}
|
||||
```
|
||||
|
||||
|
||||
il faut absolument que l'action retourne du texte soit par la la méthode `render` soit par un `système de tampon`
|
|
@ -1,14 +0,0 @@
|
|||
#Les vues Twig
|
||||
|
||||
Elles sont chargées dans cette ordre:
|
||||
|
||||
* application/include/vues/system
|
||||
* application/include/vues/layout
|
||||
* application/include/vues/view
|
||||
|
||||
ainsi la vue standard peut étendre de `application/include/vues/layout/body.html.twig`
|
||||
```php
|
||||
```
|
||||
qui étends de `application/include/vues/system/system.html.twig`
|
||||
```php
|
||||
```
|
|
@ -1,50 +0,0 @@
|
|||
#Les vues Blade
|
||||
|
||||
Elles sont chargées dans cette ordre:
|
||||
|
||||
* application/include/vues/system
|
||||
* application/include/vues/layout
|
||||
* application/include/vues/view
|
||||
|
||||
ainsi la vue standard peut étendre de `application/include/vues/layout/body.blade.php`
|
||||
```php
|
||||
@extends('system')
|
||||
|
||||
@section('body')
|
||||
|
||||
@section('sidebar')
|
||||
This is the master sidebar.
|
||||
@show
|
||||
|
||||
<div class="container">
|
||||
@yield('content')
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
```
|
||||
qui étends de `application/include/vues/system/system.blade.php`
|
||||
```php
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>{{$page_title}}</title>
|
||||
<meta name="description" lang="fr" content="{{$description}}"/>
|
||||
|
||||
@section('top-css')
|
||||
@endsection
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@section('top-javascript')
|
||||
@endsection
|
||||
|
||||
@yield('body')
|
||||
|
||||
@section('bottom-javascript')
|
||||
@endsection
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
```
|
|
@ -1,9 +0,0 @@
|
|||
#Les vues Blade avec une SPA Vue.js
|
||||
|
||||
Elles sont chargées dans le même ordre que les vues Blade normale:
|
||||
|
||||
* application/include/vues/system
|
||||
* application/include/vues/layout
|
||||
* application/include/vues/view
|
||||
|
||||
Cependant il faut inclure les biblitohèques Vue.js dans la page et coder à la mimine la SPA
|
|
@ -5,6 +5,8 @@ un controlleur similaire a Symfony qui est dénomé ici Conduit car il prend
|
|||
en paramètre une route défini dans le fichier routing.yml.
|
||||
|
||||
Cette fonctionnalité permet de choisir la route indépendamment du moteur.
|
||||
Elle est utlie aussi pour créer des appels Curl et Ajax.
|
||||
|
||||
il faut instancier le fichier `application/config/files/routing.yml`
|
||||
avec la route de base et les routes que vous voulez conduire, par exemple:
|
||||
```yml
|
||||
|
@ -48,3 +50,4 @@ class FooConduit extends Conduit
|
|||
}
|
||||
}
|
||||
```
|
||||
Vous remarquerez que les variables passé en GET sont obtenu dans le conduit par `$this->varname`.
|
|
@ -1,29 +1,37 @@
|
|||
#Comment Configurer un module Symfony ou tout autre application php
|
||||
#Comment Configurer un module ou tout autre application php
|
||||
|
||||
il vous faut instancier trois fichiers:
|
||||
|
||||
le modèle (.model) contenant le nom de la page qui porte le model
|
||||
ici : `application/include/modeles/syf51.model`
|
||||
ici : `application/include/modeles/my_module.model`
|
||||
```yaml
|
||||
name : syf51
|
||||
name : my_module
|
||||
page_title : Accueil de l'application modulaire
|
||||
description : zatou stra bracadabla
|
||||
params : params
|
||||
engine : blade
|
||||
ariane : {my_module_name}
|
||||
arianelink : {my_module}
|
||||
```
|
||||
le controlleur (.php) contenant ce code qui doit être automatisé
|
||||
ici: `application/include/controlleurs/syf51.php`
|
||||
le controlleur (.php) contenant ce code
|
||||
ici: `application/include/controlleurs/my_module.php`
|
||||
```php
|
||||
<?php
|
||||
\MVC\Classe\Session::start();
|
||||
$app = new MVC\Classe\Modular($name);
|
||||
$templateData = array('app' => $app);
|
||||
```
|
||||
et déclarer le module dans `\application\modules\setup\registre.model`
|
||||
le template (.blade.php) contenant ce code
|
||||
ici: `application/include/vues/view/my_module.php`
|
||||
```php
|
||||
{{$app->load('module_type')}}
|
||||
```
|
||||
aussi il vous faudra déclarer le module dans `\application\modules\setup\registre.model`
|
||||
par une ligne suplémentaire:
|
||||
```yaml
|
||||
syf51 : Application permettant de tester l'intégration d'un module avec symfony5.0.99
|
||||
my_module : Application permettant de tester l'intégration d'un module
|
||||
```
|
||||
|
||||
si besoin et que le module n'existe pas il vous faudras coder et modifier
|
||||
le fichier `/application/class/Modular.php` voir peut-être `/application/class/ModularRegister.php`
|
||||
ainsi que le dossier `\application\module\my_module`
|
||||
|
||||
si besoin et que le type du module n'existe pas il vous faudra ajouter le type du module en modifiant le fichier `/application/class/Modular.php` et les méthodes `__construct` et `load`
|
||||
|
||||
Good Luck !
|
|
@ -1 +1,10 @@
|
|||
#Comment bien utiliser les modules
|
||||
#Comment bien utiliser les modules
|
||||
|
||||
Simplement vous pouvez tester les intégrations prévues dans le FrameWork avec la commande `php bin.php module:add` ainsi vous aurez le choix d'intégrer en quelques modifications à la mimine un module Symfony ou Laravel. Pour cela choisissez les paramètres de base afin que l'installation se passe bien.
|
||||
|
||||
Il faut comprendre qu'un module Symfony ne peut fonctionner qu'avec un template `blade`, de même manière un module Laravel ne peut fonctionner qu'avec un template `twig`.
|
||||
Basiquement toute application utilisant le système de randu `twig` doit être intégré avec un template-sand `blade` et l'inverse.
|
||||
|
||||
Au niveau du sysème de routage, il faut absolument inclure le path du module, par exemple pour un module nommé 'SciFi', il faudra inclure dans les routes des controlleurs la chaine de caractères `\SciFi` devant toutes les routes de vos controlleurs.
|
||||
|
||||
Il en est de même pour les autres modules : Wordpress, GitList, PhpList, Pretashop, ... ainsi que pour tous les autres modules que vous voudriez intégrer par vous-même.
|
1
data/docs/13. modules - Laravel.md
Normal file
1
data/docs/13. modules - Laravel.md
Normal file
|
@ -0,0 +1 @@
|
|||
#Comment ajouter un module Symfony
|
|
@ -0,0 +1,27 @@
|
|||
__Le squelette de départ d'une application ExtJS__ : sisi c'est possible avec node.js mais l'intégration d'un tel outil n'as absolument pas été commencé lors de mon CDD à l'ufc ni même pendant ma période de convalescence du 15/07/2021 au 18/12/2021 car je me refuse encore actuellement de programmer, elle est un petit peu réfléchie et semble absolument possible avec de nombreuses application reliées mais je ne possède pas toutes les compréhensions techniques nécessaires pour le faire actuellement.
|
||||
|
||||
__Un moteur de wiki basé sur wikini__ : si les auteurs du wikini0.5 acceptent...
|
||||
|
||||
__Un moteur d'écriture en Markdown et Yaml dans de simples fichiers contenus dans /data__ : une portion de cela a été codé et est disponible sur le github du créateur du framework.
|
||||
|
||||
----
|
||||
|
||||
//
|
||||
Une dalle pdo plus performante (voir accueillant un système de choix de l'ORM ou un ORM spécifique)
|
||||
//
|
||||
|
||||
//
|
||||
Une réécriture complète du système de vue afin d'accueillir les nouvelles versions de Twig et Blade
|
||||
//
|
||||
|
||||
//
|
||||
Un systeme REST plus capable de faire ce qui doit être fait, imitant un peu Slim
|
||||
//
|
||||
|
||||
//
|
||||
Des améliorations au niveau de l'intégration de Bootstrap5.0 : par exemple le système de notification push
|
||||
//
|
||||
|
||||
//
|
||||
Ainsi que d'autres petites choses au niveau des objets de session et des composants de domaine (Composants de domaines qui ne seront accessible que sur RENATER, je garde précieusement ces fichiers...)
|
||||
//
|
|
@ -1,99 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
<xsl:template match="/metrics">
|
||||
<html>
|
||||
<body>
|
||||
<style>
|
||||
body { font-family: consolas; }
|
||||
ul.methods { -webkit-column-count: 3; }
|
||||
sup { margin: 0 0.2em; font-weight: normal; padding: 0.4em 0.3em; background: gainsboro; color: gray; }
|
||||
.position-top-20 { color: red; }
|
||||
.position-top-10 { font-weight: bold; }
|
||||
.ccn-is-low { color: gray; font-size: 80%; }
|
||||
.ccn-is-low sup { display: none; }
|
||||
p { margin: 0; padding: 0; margin-bottom: 0.2em; }
|
||||
</style>
|
||||
<h1>
|
||||
Project
|
||||
|
||||
<sup title="Cyclomatic Complexity Number">
|
||||
cyclo: <xsl:value-of select="@ccn"/>
|
||||
</sup>
|
||||
<sup title="Number of Method or Function Calls">calls:
|
||||
<xsl:value-of select="@calls"/>
|
||||
</sup>
|
||||
<sup title="classes">abstract: <xsl:value-of select="@clsa"/></sup>
|
||||
<sup title="classes">concrete: <xsl:value-of select="@clsc"/></sup>
|
||||
<sup>interfaces: <xsl:value-of select="@noi"/></sup>
|
||||
<sup>methods: <xsl:value-of select="@nom"/></sup>
|
||||
|
||||
</h1>
|
||||
<xsl:for-each select="package">
|
||||
<h2>
|
||||
<xsl:value-of select="@name"/>
|
||||
<sup title="Google PageRank applied on Packages and Classes.
|
||||
Classes with a high value should be tested frequently.">code rank:
|
||||
<xsl:value-of select="@cr"/></sup>
|
||||
</h2>
|
||||
<ul class="classes">
|
||||
<xsl:apply-templates select="class">
|
||||
<xsl:sort
|
||||
select="@wmc"
|
||||
data-type="number"
|
||||
order="descending"
|
||||
/>
|
||||
</xsl:apply-templates>
|
||||
</ul>
|
||||
</xsl:for-each>
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
<xsl:template match="class">
|
||||
<h3>
|
||||
<xsl:attribute name="class">
|
||||
<xsl:if test="0.1 > position() div count(../class)">
|
||||
position-top-10
|
||||
</xsl:if>
|
||||
<xsl:if test="0.2 > position() div count(../class)">
|
||||
position-top-20
|
||||
</xsl:if>
|
||||
</xsl:attribute>
|
||||
<xsl:value-of select="@name"/>
|
||||
<sup title="Sum of the complexities of all declared
|
||||
methods and constructors of class.">weighted method count: <xsl:value-of select="@wmc"/>
|
||||
</sup>
|
||||
<sup title="Number of unique outgoing
|
||||
dependencies to other artifacts of the same type">outgoing coupling: <xsl:value-of select="@cbo"/>
|
||||
</sup>
|
||||
</h3>
|
||||
<ul class="methods">
|
||||
<xsl:apply-templates select="method">
|
||||
<xsl:sort
|
||||
select="@npath"
|
||||
data-type="number"
|
||||
order="descending"
|
||||
/>
|
||||
</xsl:apply-templates>
|
||||
</ul>
|
||||
</xsl:template>
|
||||
<xsl:template match="method">
|
||||
<p>
|
||||
<xsl:attribute name="class">
|
||||
<xsl:if test="0.1 > position() div count(../method)">
|
||||
position-top-10
|
||||
</xsl:if>
|
||||
<xsl:if test="0.2 > position() div count(../method)">
|
||||
position-top-20
|
||||
</xsl:if>
|
||||
<xsl:if test="1 >= @ccn">
|
||||
ccn-is-low
|
||||
</xsl:if>
|
||||
</xsl:attribute>
|
||||
<xsl:value-of select="@name"/>
|
||||
<sup title="Cyclomatic Complexity Number">cyclo: <xsl:value-of select="@ccn"/>
|
||||
</sup>
|
||||
<sup title="NPath Complexity">npath: <xsl:value-of select="@npath"/>
|
||||
</sup>
|
||||
</p>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
3
switch2LaravelModule.sh
Normal file
3
switch2LaravelModule.sh
Normal file
|
@ -0,0 +1,3 @@
|
|||
#!/usr/bin/env bash
|
||||
composer remove illuminate/view
|
||||
composer require twig/twig 1.*
|
3
switch2SymfonyModule.sh
Normal file
3
switch2SymfonyModule.sh
Normal file
|
@ -0,0 +1,3 @@
|
|||
#!/usr/bin/env bash
|
||||
composer require illuminate/view 4.*
|
||||
composer remove twig/twig
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue