Bonjour à toutes et à tous,

Un collègue et moi avons adapté un Framework MVC maison utilisé dans une formation en Belgique.

Je suis persuadé que ce framework peut être très largement amélioré :

- Sécurité
- Template
- Hiérarchie des fichiers
- ...

J'aimerais avoir votre avis sur ce dernier et surtout vos conseils, vos remarques, vos améliorations... afin de l'améliorer :

Le contrôleur frontal :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
<?php
session_start();
 
require 'Controllers/router.php';
 
// Déclaration de la variabe globale racine
$GLOBALS['racine'] = "projects/monprojet";
 
$route = new router;
$route->router_requete();
Le fichier router inclus dans le contrôleur frontal :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
 
// A NE PAS MODIFIER - FRAMEWORK
 
require_once 'Autoloader.php';
 
class router
{
 
    public function router_requete()
    {
 
        // fusion du $_GET et du $_POST
        $get = array_merge($_GET, $_POST);
 
        // Appel de l'autoloader
        Autoloader::init();
 
        // Assignation du bon controleur
        $controller = isset($get['controller']) ? $get['controller'] : 'Accueil';
 
        // Assignation de la bonne action
        $action = isset($get['action']) ? $get['action'] : 'afficher_accueil';
 
        $fichier_controller = 'Controllers' . '\\' . $controller . '_controller';
 
        try
        {
            if ($controller != 'acces')
            {
 
                // file_exists vérifie si un fichier ou un dossier existe
                if (file_exists(str_replace('\\', '/', $fichier_controller) . '.php'))
                {
                    // Le fichier_controller n'existe pas => l'autoloader va être parsé
                    $controller_obj = new $fichier_controller();
 
                    $fichier_vue = "views/" . $controller . '/' . $action . '.tpl.php';
 
                    if (file_exists($fichier_vue))
                    {
                        $vue_action = $controller_obj->$action();
 
                        // Récupération des données avec clé du controller
                        extract($vue_action);
 
 
                        // Implémentation des infos par la vue
                        require_once $fichier_vue;
                    } else
                    {
                        self::redirect();
                    }
                } else
                {
                    self::redirect();
                }
            } else
            {
                $acces = new $fichier_controller();
                $acces->$action();
            }
        }//fin du try
        // Gestion des erreurs
        catch (Exception $e)
        {
            $error = new \Controllers\error_controller;
            extract($error->afficher_erreur($e->getMessage()));
            $message = $e;
            require_once ('Views/Error/afficher_erreur.tpl.php');
        }
    }
 
    private static function redirect()
    {
        echo '<p>Erreur dans la requête</p><br/><hr/>';
        $controller_obj = new \Controllers\Accueil_controller();
        $vue_action = $controller_obj->afficher_accueil();
        extract($vue_action);
        require_once 'Views/Accueil/afficher_accueil.tpl.php';
    }
 
}
J'appelle un contrôleur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
<?php
 
namespace Controllers;
 
use Models\Factory;
 
class formulaire_guide_controller
{
 
    public function afficher_formulaire_guide()
    {
 
        // Liste des guides
        $guide = new Factory\formulaire_guide_factory();
        $guides = $guide->getGuides();
 
        return array(
            'guides' => $guides
        );
    }
 
}
Je crée un factroy, en voici le code (je n'en comprends pas bien l'utilité...) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
namespace Models\Factory;
 
use Models\PDO;
 
class formulaire_guide_factory
{
 
    public function getGuides()
    {
        $guides = new PDO\formulaire_guide_pdo();
        $resultat = $guides->getGuides();
        return $resultat;
    }
}
Le factory appelle du code PHP (PDO) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
 
namespace Models\PDO;
 
use Models\Datas;
 
class formulaire_guide_pdo
{
 
    public function getGuides(){
 
        // Sélection des guides
        $sql_guide = "SELECT * FROM guides";
        $stmt_guide = Datas\ConnexionPDO::getConnexion()->query($sql_guide);
 
        // Sélection des langues
        $sql_langues = "SELECT id as id_langue, langue FROM langues ORDER BY langue";
        $stmt_langues = Datas\ConnexionPDO::getConnexion()->query($sql_langues);
 
 
 
        $retour = array(
            "guides"=>$stmt_guide->fetchAll(\PDO::FETCH_ASSOC),
            "langues"=>$stmt_langues->fetchAll(\PDO::FETCH_ASSOC)
        );
 
        return $retour;
    }
}
Je retourne le résultat au Factory qui lui-même retourne le résultat au contrôleur.

Le tout est passé à la vue qui grâce à la méthode Extract récupère les valeurs :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<!DOCTYPE HTML>
<html lang="en-US"> 
    <head>
        <meta charset="UTF-8">
        <title></title>
        <?php 
            echo '
            <script src="/'.$GLOBALS["racine"].'/Public/js/jquery-1.7.2.js"></script>
            <script src="/'.$GLOBALS["racine"].'/Public/js/jquery-ui.js"></script>
            <script src="/'.$GLOBALS["racine"].'/Public/js/formulaire_guides.js"></script>
            <script src="/'.$GLOBALS["racine"].'/Public/js/fonctions.js"></script>
            <link rel="stylesheet" href="/'.$GLOBALS["racine"].'/Public/css/ui-lightness/jquery_ui.css" />';
        ?>
        <script>
            $(function() {
                $( "#tabs" ).tabs();
            });
        </script>
    </head>
    <body>
        <?php
            echo 'Bienvenue '.$_SESSION['liste_prenom'].' '.$_SESSION['liste_nom'].', vous êtes connecté en tant que '.$_SESSION['liste_rang'].'.';
        ?>
 
        <br/>
        <div id="liens">
            <ul>
                <?php 
                    echo '
                    <li><a href="/'.$GLOBALS["racine"].'/formulaire_client/afficher_formulaire_client">Gestion des clients</a></li>
                    <li><a href="/'.$GLOBALS["racine"].'/formulaire_activite_fournisseur/afficher_formulaire_activite_fournisseur">Gestion des activités et fournisseurs</a></li>
                    <li><a href="/'.$GLOBALS["racine"].'/formulaire_commande/afficher_formulaire_commande">Gestion des commandes</a></li>';
                ?>
            </ul>
            </div>
            <br/>
            <select name="guides" id="guides">
            <?php
                $guides_existant = $guides['guides'];
                echo "<option value=0>--- Ajouter un nouveau guide ---</option>";
                foreach ($guides_existant as $guide)
                {
                    echo "<option value='".$guide['id']."'>".$guide['nom']." ".$guide['prenom']." - ".$guide['rue'].", ".$guide['numero']." - ".$guide['cp']." ".$guide['ville']."</option>";
                }
            ?>
            </select>
            <?php 
                echo '
                <img src="/'.$GLOBALS["racine"].'/Public/img/supprimer.png" id="supprimer_guide"/>';
            ?>
            <br /><br />
            <div id="tabs">
                <ul>
                    <li id="li_gestion_guides"><a href="#tab_gestion_guides">Gestion des guides (Ajout/modification/suppression)</a></li>
                </ul>
            <div id="tab_gestion_guides">
                <form id= "form_guide" method="post">
                    <span>Langue(s) du guide => </span>
                    <?php
                        $langues = $guides['langues'];
                        foreach ($langues as $langue)
                        {
                            echo $langue['langue'].'<input type="checkbox" name="langue_'.$langue['id_langue'].'" value="'.$langue['id_langue'].'">';
                        }
                    ?>
                    </select><br/>
                    Numéro nationals <input type="text" name="numero_national" id="numero_national" /><br/>
                    TVA <input type="text" name="tva" id="tva" /><br/>
                    Nom <input type="text" name="nom" id="nom" /><br/>
                    Prenom <input type="text" name="prenom" id="prenom" /><br/>
                    Adresse <input type="text" size="80" name="rue" id="rue" />
                    n° <input type="text" size="5" name="numero" id="numero" /> Boîte <input type="text" size="5" name="boite" id="boite" /><br/>
                    Code postal <input type="text" name="cp" id="cp" />
                    Ville <input type="text" name="ville" id="ville" /><br/>
                    TEL <input type="text" name="telephone" id="telephone" /><br/>
                    GSM <input type="text" name="gsm" id="gsm" /><br/>
                    FAX <input type="text" name="fax" id="fax" /><br/>
                    <br/>
                    <input type="button" id="insert_update" name="insert_update" value="Ajouter" />
                </form>
            </div>
        </div>  
    </body>
</html>
Je vous informe également que j'utilise AJAX et Jquery et que je ne passe jamais par le factory pour ces technologies :

Voici une partie du code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
$(document).ready(function()
{
 
    // Vider le formulaire au chargement de la page
    vider_form("form_guide");
    $("#guides").val(0);
 
    // Masquer la croix
    $("#supprimer_guide").hide();
 
    //Vider ou remplir le formulaire en fontion du choix dans la liste déroulante
    $("#guides").change(function()
    {
        //si on choisit la première valeur de la ld
        if ($(this).val() === "0")
        {
            // On masque la croix si ce n'est déjà fait
            $("#supprimer_guide").hide();
 
            vider_form("form_guide");
 
            //on modifie le nom du bouton
            $("#insert_update").val("Ajouter");
        }
        else
        {
            // On affiche la croix
            $("#supprimer_guide").show();
            // 1) Sélectionner toutes les informations du guide -> AJAJ :)
            guide_id = $(this).val();
            $.ajax(
            {
                url : "../Models/PDO/gestion_guides/onglet_guides.php",
                type : 'POST',
                data :
                {
                    "guide_id" : guide_id,
                    "action":'Remplir'
                },
                dataType : 'json',
                success : function (retour)
                {
                    console.log(retour);
                    // 2) On lance les fonctions définies plus bas
                    remplir_form(retour["guide"],"form_guide");
                    cocher_case(retour["langue"]);
                    // 3) On modifie la value du submit
                    $("#insert_update").val("Modifier");
                },
                error: function()
                {
                    alert ('Erreur dans la requête');
                }
            });
        }
    });
Il y a aussi l'utilisation de l'url rewriting avec ce code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
# PROJET A MODIFIER - FRAMEWORK
 
RewriteEngine on
# Le $1 correspond aux paramètres
RewriteRule ^([a-zA-Z_0-9]+)/([a-zA-Z_0-9]+)$ /projects/BB/index.php?controller=$1&action=$2
Voilà, je voudrais donc avoir votre avis sur cette façon de travailler, sur le MVC utilisé...

Merci d'avance et bon dimanche.

bee