IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

MVC ou pseudo MVC


Sujet :

Langage PHP

  1. #1
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut MVC ou pseudo MVC
    bonjour,
    je reprend le script d'un formulaire où j'avais tout en monocouche.

    J'ai fais un schéma pour essayer de décomposer mes besoins (je sais pas si c'est comme ça qu'on procède?):
    Nom : MVC.jpg
Affichages : 122
Taille : 87,4 Ko

    j'ai donc 2 fichiers qui me permettent de récupérer des infos.
    1 fichier qui regroupe les precédant via la fonction "include" (c'est le contrôle?)
    et un autre fichier "view".

    J'ai donc 2 questions:
    est-ce que je suis sur un schéma MVC ou pseudo MVC?
    lorsque la vue s'affiche, dans l'adresse du navigateur, c'est le nom du controle qui s'affiche.

    Est-ce que la ligne extract($view) a une utilité?

    Code du controle:
    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
    <?php
    header('Content-type: text/html; charset=UTF-8');
    if (!session_id()) session_start();
    //importation parametres de connection
    include("config.php");
     
     
    if (isset($_SESSION["fonction"])=="ouverture"){
     
    	//récupération des données utilisateur
    	include("donnees_RH.php");
    	include("date.php");
     
    	//affichage de la vue
    	extract($view); 
        include_once("view/ouverture.php");
    }
    ?>
    code donnees_RH:
    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
    <?php
     
    header('Content-type: text/html; charset=UTF-8');
     
    if (!session_id()) session_start();
     
    //données utilisateur
    $username= $_SESSION["username"];
    //echo $username;
    		if ((ctype_digit($username) and (strlen($username))==4)){
                $sql=("SELECT * FROM rh_users2 WHERE matricule=:username");
     			$sql_mdp= $mysql->prepare($sql);
    			$exec_sql_mdp=$sql_mdp->execute(array('username' => $username)) ;
    		    $result_sql_mdp=$sql_mdp->fetch ();
    			$nom=$result_sql_mdp['nom']; 
    			$prenom=$result_sql_mdp['prenom']; 
    			$centre1=$result_sql_mdp['centre1'];
    			$centre2=$result_sql_mdp['centre2'];
    			$admin1=$result_sql_mdp['admin1']; 
    			$admin2=$result_sql_mdp['admin2']; 
     
    			$view = array(
    				"nom" => $nom,
    				"prenom" =>$prenom ,
    				"centre1"=>$centre1 ,
    				"centre2" =>$centre2 ,
    				"admin1" =>$admin1 ,
    				"admin2" =>$admin2) ;
    				return $view;}
    		else{$_SESSION["cookie_test"]=0;
    			 header('Location: index.php');}
    ?>
    code date:
    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
    <?php
    header('Content-type: text/html; charset=UTF-8');
     
    if (!session_id()) session_start();
     
    // Recupération du matricule
    $username=$_SESSION["username"];
     
    // Recherche des dates où l'agent a déclaré de la disponibilité
    	$sql=("SELECT * FROM disponibilite WHERE matricule=:username");
     
     			$sql_date= $mysql->prepare($sql);
    			$exec_sql_date=$sql_date->execute(array('username' => $username)) ;
    		 /*  while( $result=$sql_mdp->fetch() ){
    			   $a=$result['date'];
    $d=substr( $a,8,2)."-".substr( $a,5,2)."-".substr( $a,0,4);
    
    			echo ''.$d.'<br/>';
    		   }*/
     
    ?>

    code de la vue:
    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>test ouverture</title>
    </head>
     
    <body>
    <h1>
    <table border="1">
    <tr><td>ressource humaine</td><td> date </td></tr>
    <tr>
    <td> Bonjour <?php echo $nom ?> ; <br/>   
    ;prenom: <?php echo $prenom ?>; <br/>   
    ;centre1: <?php echo $centre1 ?>;  <br/>  
    ;centre2: <?php echo $centre2 ?>;  <br/>  
    ;admin1: <?php echo $admin1 ?>;<br/>    
    ;admin2: <?php echo $admin2 ?></td>
     
    <td>
     <?php while( $result=$sql_date->fetch() ){
    			   $a=$result['date'];
    $d=substr( $a,8,2)."-".substr( $a,5,2)."-".substr( $a,0,4);
     
    			echo ''.$d.'<br/>';
    		   } ?></td></tr></table></h1>
    </body>
    </html>

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Salut,

    C'est encore bien trop artisanal pour être du MVC, mais il y a déjà un effort pour séparer l'aspect data de l'aspect présentation

    Quant à extract($view), j'aurais bien du mal à te dire si ça sert ou pas vu que je ne vois pas comment il est construit. Mais dans l'idée, j'utilise la même syntaxe pour importer des variables dans mes vues.

    C'est d'ailleurs un peu bête de poser la question, si c'est toi qui à fait le script tu devrais comprendre l'utilité de chaque ligne non ?

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    La fonction extract crée une variable par élément du tableau, donc attention à ne pas écraser par erreur une variable existante avec un élément du tableau.

    En l'occurrence tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $nom=$result_sql_mdp['nom']; 
    $prenom=$result_sql_mdp['prenom']; 
    $centre1=$result_sql_mdp['centre1'];
    $centre2=$result_sql_mdp['centre2'];
    $admin1=$result_sql_mdp['admin1']; 
    $admin2=$result_sql_mdp['admin2']; 
     
    $view = array(
    	"nom" => $nom,
    	"prenom" =>$prenom ,
    	"centre1"=>$centre1 ,
    	"centre2" =>$centre2 ,
    	"admin1" =>$admin1 ,
    	"admin2" =>$admin2) ;
    et ensuite extract($view);, ce qui équivaut à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $nom = $view["nom"];
    $prenom = $view["nom"];
    ...
    Bref, tu crées une variable que tu mets dans un tableau, pour ensuite extraire le tableau dans la même variable.
    Donc dans ce cas particulier, je ne vois pas trop l'intérêt
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    pour être franc, j'ai essayé de reproduire un tuto pour la partie controle notament la ligne extract($view).

    Concernant la pattern MVC, j'ai lu sur le site que celle-ci n'était pas une finalité en soi et que l'on pouvais developper des sites sans ce servir de la pattern.

    Pour etre plus précis dans ma question, est-ce que la façon dont je découpe le code, l'utilisation des include, le contrôle des données augmente la sécurité de mon site face à des attaques de pirates (tout en sachant qu'on ne peut se prémunir de toutes les attaques).

    Sinon, pourrais tu me conseiller des axes d'améliorations.
    Merci

  5. #5
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    j'ai essayé de reproduire un tuto pour la partie controle notament la ligne extract($view).
    On ne réécrit pas ce qu'on ne comprends pas ! extract c'est du danger brut quand on ne saisit pas exactement ce qu'il fait et à quoi il sert. Pour bien savoir à quoi ça sert, je te conseille de lire le manuel et de comprendre dans les grandes lignes comment fonctionne la table des symboles de PHP.

    Pour etre plus précis dans ma question, est-ce que la façon dont je découpe le code, l'utilisation des include, le contrôle des données augmente la sécurité de mon site face à des attaques de pirates (tout en sachant qu'on ne peut se prémunir de toutes les attaques).
    Non, non et définitivement non. MVC est un patron d'architecture applicative, il ne garantis en rien le respects des règles de sécurité mais favorise leur mise en place en mettant en valeur la répartition des responsabilités entre plusieurs entités (composants).

    Exemple d'un MVC avec une faille d'injection SQL:
    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
     
    <?php
     
    // un contrôleur qui fait sont job
     
    class MonControlleur extends BaseController {
     
        public function auth () {
            $login = $_POST['login'];
            $password = $_POST['password'];
     
            if (User::valid($login, $password))
                $_SESSION['user'] = $user;
     
            return new View('main.php', array('user' => $user));
        }
    }
     
    // pendant ce temps, dans la classe User...
     
    class User {
     
        public static function valid ($login, $password) {
            // aouch la bonne grosse faille bien grasse !
            $query = "SELECT * FROM users WHERE login='$login' AND password='$password'";
     
            // en plus on utilise des fonction obsolètes
            // le développeur qu'a pondu ça mérite d'être
            // lynché, sérieux !
            return mysql_num_rows(mysql_query($query)) >= 1;
        }
    }
    Et là, je te mets dans POST password=' OR 1 et boom.

    Bref, même avec un bon design applicatif, si tu codes avec les pieds ce sera pas plus sécurisé.

    On a des caisses de tuto sur la sécurité: les injections SQL, les XSS, les fixations et de session etc. Comme je vais pas me lancer dans une explication étendue de toutes les failles de sécurité (que j'ai tous les jours devant les yeux sur le forum) je te dirais seulement ceci:

    L'utilisateur, c'est le mal ! Il faut toujours, TOUJOURS valider, nettoyer, contrôler ce qu'il nous envoie, que ce soit dans GET, POST, COOKIES, et même SERVER ! Et dans un système d'information, la base de données représente l'utilisateur donc, par transitivité, la base de données c'est le mal aussi. Il faut donc nettoyer les données aussi bien en entrée qu'en sortie.

  6. #6
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    ok merci pour la réponse, je m'en doutais un peu.

    je vais donc fermer ce post

  7. #7
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    que ce soit dans GET, POST, COOKIES, et même SERVER !
    Je rajouterais aussi SESSION à ta liste...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  8. #8
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    $_SESSION est quand même moins risqué dans la mesure où normalement tu dois contrôler en amont ce que tu y mets dedans. En conséquence, tu devrais avoir la certitude de ce que tu récupères en sortie, enfin normalement...

  9. #9
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    Re, finalement j'ai retiré le "résolu"

    j'ai lu quelques articles concernant MVC et je me suis notament attaché aux fonctions, afin de faire un contrôleur qui ressemble à quelque chose.

    J'ai donc fais un petit test:

    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
     
    <?php
     
    $X="rouge"
     
    function bleu()
    {
    echo 'BLEU';
    }
     
    function rouge()
    {
    echo 'ROUGE';
    }
     
    $X();
    ?>
    en fonction de la valeur $X, j'ai bien l'écho qui correspond.

    Donc pour appeler une fonction à partir d'un bouton, je dois faire passer le nom de la fonction via une variale style : $_SESSION['fonction']='rouge' ???

    de plus, j'ai cru comprendre qu'il était préférable de créer une bibliothèque de toutes les actions possibles puis de contrôler si $_SESSION['fonction']= fonction_de_la_bibliothèque.

    Ce qui donnerait:

    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
     
    <?php
     
    // importation de la bibliothèque des actions
    include(biblio_action.php);        //$B_action = array('ouverture', 'fermeture' );
     
    //Nettoyage de $_SESSION['fonction']
    //on récupére
    $action='ouverture';      //valeur pour le test
     
    //on test si $action existe dans biblio_action
    function Isset_action ()              // j'ai essayé en mettant $action et $B_action dans la parenthèse et ça beug, pourquoi????
    {
     global $action;
     global $B_action;
     
    // test si l'action existe
     
          if (in_array($action,$B_action))
    	{
     	return (1);
    	}
    	else
    	{
    	return (0);
    	}  
     
    }
     
    // Execution de la fonction
    Isset_action();
     
    // on récupère la valeur du test
    $Test_action=Isset_action();
     
     
    // Si function Isset_action retourne 1 traitement de l'action
     
    if ($Test_action==1)) 
     
    {
    $X=$action;
     
    function bleu()
    {
    echo 'BLEU';
    }
     
    function rouge()
    {
    echo 'ROUGE';
    }
     
    $X();
    }
    else
    {
    echo 'fonction inconnue';
    }
    ?>
    suis-je sur la bonne route???

    merci d'avance pour vos réponses

  10. #10
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    Suite à mes lectures sur le sujet,
    pouvez-vous m'apporter quelques éclaircissements.

    Pour commencer, voici l'affichage de ma VUE principale.

    Nom : schema VUE principale.JPG
Affichages : 98
Taille : 101,1 Ko

    Il y a 3 zones:
    - haut droit: identifiant utilisateur et accès à des pages via "header" si l'uitilisateur a les droits administrateurs.

    -bas droit: liste des dates our lesquelles l'utilisateur a déclaré des disponibilités (GET)

    -bas gauche: zone de déclaration de disponibilité
    si changement de la date (GET)
    si bouton Valider - Modifier - Supprimer (POST)

    J'identifie ainsi 7 "fonctions"

    1-ouverture (à l'issue d'un identification par identifiant & mot de passe)
    2-changement de la capture date
    3-clique sur une date déjà déclarée
    4-ajout d'une disponibilité
    5-modification
    6-suppression
    7-changement de sélection du centre

    Ainsi, j'ai créé un contrôleur avec ces 7 fonctions.

    Ma première questions est:
    -Faut-il faire une bibliothèque des actions et vérifier si l'action reçu par le contrôleur existe?

    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
    <?php
     
    // importation de la bibliothèque des actions
    include(biblio_action.php);        //$B_action = array('ouverture', 'fermeture' );
     
    //Nettoyage de $_SESSION['fonction']
    //on récupére
    $action='ouverture';      //valeur pour le test
     
    //on test si $action existe dans biblio_action
    function Isset_action ()              // j'ai essayé en mettant $action et $B_action dans la parenthèse et ça beug, pourquoi????
    {
     global $action;
     global $B_action;
     
    // test si l'action existe
     
          if (in_array($action,$B_action))
    	{
     	return (1);
    	}
    	else
    	{
    	return (0);
    	}  
     
    }
     
    // Execution de la fonction
    Isset_action();
    Si je déclare de la disponibilité ou la modifie, via les différents boutons, je crée des variables pour executer des requêtes.

    Ce que je voulais savoir c'est quand effectuer le contrôle des données:

    1- saisie - POST -recherche si la fonction existe - appel du module d'execution requete - controle des variables et execution requête

    ou

    2 saisie - POST -recherche si la fonction existe -controle des variables....

    J'ai bien d'autres questions notament sur les Classes et déclarations de varibles mais plus tard...

  11. #11
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    C'est pas si compliqué, pour t'en sortir sans passer par des classes (tout à fait faisable) il va falloir t'organiser.

    Pour commencer, tu dois pour ton module :
    1. Lister les actions
    2. Affecter une route (URL) unique à chaque action

    Supposons que tu aies un module Disponibilité regroupant :
    • un contrôleur nommé dispo.php
    • des classes métiers
    • des vues


    On va décider (arbitrairement mais intelligemment) que pour gérer les actions de ce module, on va s'appuyer sur des url ayant cette structure :
    - http://www.tonsite.com/dispo.php?do=action
    Tu peux remarquer que chaque action pointe vers le contrôleur global du module.

    Reprenons ta liste de fonctions spécifiques au module et affectons à chacune d'entre-elles un identifiant action (toujours unique) :
    1 - ouverture                         -> do=index
    2 - changement de la capture date     -> do=seldate
    3 - clique sur une date déjà déclarée -> do=selodate
    4 - ajout d'une disponibilité         -> do=add
    5 - modification                      -> do=upd
    6 - suppression                       -> do=del
    7 - changement de sélection du centre -> do=selcentre
    Ainsi le code de ton contrôleur va avoir plus ou moins cette tête :
    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
    <?php
     
    session_start();
     
    // contrôle que le client est bien identifié et qu'il à bien accès à cette zone
    if (empty($_SESSION['user']['name']))
    {
        header('Location: ...');
        exit;
    }
     
    // si le module dispo n'est pas dans les pouvoirs de l'utilisateur
    if ( ! in_array('dispo', $_SESSSION['user']['grants'], true))
    {
        header('HTTP/1.1 403 Forbidden');
        echo
    <<<HTML
    <h1>Vous devez être identifié pour accéder à cette zone</h1>
    HTML;
        exit;
    }
     
    $actions = array('index', 'seldate', 'selodate', 'add', 'upd', 'del', 'selcentre');
     
    // on vérifie que l'action demandée est possible sinon -> par défaut $action = 'index'
    $action = (empty($_GET['do']) || ( ! in_array(strtolower($_GET['do']), $actions, true)))
                  ? 'index'
                  : strtolower($_GET('do'));
     
    $action();
    exit;
     
    function index()
    {
        echo 'abc';
    }
     
    function seldate()
    {
     
    }
     
    function selodate()
    {
     
    }
     
    function add()
    {
     
    }
    J'espère avoir éclairé un peu ta lanterne

  12. #12
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    Merci pour cette réponse mais ça oblige que toutes mes actions soient envoyées en GET?

    sauf si je mets méthode=POST et que je mets:
    dispo.php?do=action
    dans l'adresse?


    Je ne suis pas informaticien; peux tu m'expliquer ce que ça raconte :
    en particulier lignes 3 et 4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // on vérifie que l'action demandée est possible sinon -> par défaut $action = 'index'
    $action = (empty($_GET['do']) || ( ! in_array(strtolower($_GET['do']), $actions, true)))
                  ? 'index'
                  : strtolower($_GET('do'));

  13. #13
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Tu confonds : url et données.
    Toutes les actions sur un site web atteignent le serveur via une URL (sans exception).
    Ensuite tu peux envoyer des données supplémentaires au serveur :
    • soit via l'URL (méthode GET) dans ce cas tu auras une URL paramétrée (cela correspond aux bouts de codes après le ? comme http://.../dispo.php?do=action&nom=abc&cp=78...),
    • soit via la méthode POST qui ne pourrit pas l'url et sépare proprement la route empruntée des données qui lui sont rattachées.


    Dans les systèmes évolués, on parle de routage parce qu'une URL = une route. Pour t'aider à comprendre : c'est comme si ton serveur était Rome et comme tous les chemins mènent à Rome, tu as au final la possibilité de paramétrer des milliers de moyens d'atteindre ton serveur en jouant un peu sur l'url et pour peu que tu aies soigneusement dispatché les actions entre les routes (voir mon message précédent), tu vas avoir la possibilité de faire exécuter par le serveur autant d'actions que de routes. Intéressant, non ?

    Donc dans tes formulaires tu gardes bien ceci :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <form action="dispo.php?do=action" method="post">
    Comme ça, la route est légèrement paramétrée (reste lisible) et toutes les données sont envoyées séparément (récupérées avec $_POST)

    Juste pour te montrer, tu peux procéder dans certains cas autrement : en passant l'action avec les données du formulaire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <form action="dispo.php" method="post">
        <input type="hidden" name="do" value="add">
    </form>
    Au lieu d'avoir ton action via $_GET['do'], tu l'auras via $_POST['do']. C'est juste pour te montrer qu'il a bien des manières pour arriver au même résultat. Le plus important, c'est une que tu as opté pour un procédé, tu dois t'y tenir pour tout le reste du site web.

    Pour le code qui te paraît obscur : cela s'appelle un opérateur ternaire
    C'est la version courte de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (empty($_GET['do']) || ( ! in_array(strtolower($_GET['do']), $actions, true)))
    {
        $action = 'index';
    }
    else
    {
        $action = strtolower($_GET['do']);
    }
    La doc pour strtolower()

  14. #14
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    ok je pense avoir compris ce point là.
    Je vais me mettre au boulot.

  15. #15
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    ok je viense de tester, ça marche au poil.

    Je me pose juste une question
    dans mon formulaire , si j'ai déjà déclaré de la disponibilité, j'ai 2 options:
    modifier ou supprimer

    Comment faire pour faire passer "l'action" du bouton dans l'url?

    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
     
    <form methode="post" action="fonction.php?do=update">
    <input type="text" name="date"/>
    <br/>
     
    coche1
    coche2
    ..
    ..
    coche10
     
     
    <input type="submit" name="update" value="update" id="update"/>
    <br/>
    <input type="submit" name="erase" value="erase" id="erase"/>
    <br/>
    </form>
    Si je clique sur "update" ou "erase"; c'est l'action update qui va être prise en compte.

    Si j'isole "erase" dans un formulaire avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <form methode="post" action="fonction.php?do=erase">
    <input type="submit" name="erase" value="erase" id="erase"/>
    ma date ne sera pas POSTée.

  16. #16
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Concernant le contrôle des paramètres et des variables, tu dois faire attention à plusieurs petites choses. Je te rassure, ce sujet prête à discussion dans la mesure où l'organisation du code va dépendre de paramètres plus ou moins liés à la perception par le développeur du concept MVC...).

    Dans un premier temps, tu dois contrôler ce qu'on appelle les "paramètres d'appels", c'est-à-dire que ton contrôleur doit bien s'assurer qu'il a été correctement appelé : on ne regarde pas le métier, juste les paramètres d'appels (définition de $_GET['do'], présence de cette valeur dans la liste des actions possibles...).
    Vu que ton contrôleur est très simple, il doit aussi s'assurer du respect du contrôle d'accès.

    Ensuite, une fois que l'action à exécuter a bien été déterminée, le contrôleur passe la main à la fonction en charge de cette action. Généralement dans une architecture simple, tu vas vérifier à ce moment la présence et la validité de données récupérées. Quand tout est valide, tu vas ensuite appeler la couche métier (insert ou update...) afin de mettre à jour tes données et quand la couche métier s'exécute sans erreur, tu peux renvoyer la réponse (redirection, vue...)

    Donc dans ton architecture, c'est :
    1. formulaire de saisie
    2. soumission
    3. contrôle d'accès
    4. contrôle des paramètres d'appel
    5. exécution de l'action
    6. réponse

    A chaque étape tu peux avoir une erreur qui surgit et que tu devras gérer correctement.

  17. #17
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Pour plusieurs boutons dans un même formulaire, fais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <input type="submit" name="do" value="update" id="update"/>
    <br/>
    <input type="submit" name="do" value="erase" id="erase"/>
    Ensuite dans ton code, tu vas avoir un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ($_POST['do'] === 'update')
    {
        // ...
    }
    elseif ($_POST['do'] === 'erase')
    {
        // ...
    }
    Tu as même plus court, si tu contrôle bien tout en amont sur le $_POST, tu devrais finir par avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $action = $_POST['do'];

  18. #18
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    Pour la chronologie des actions c'est ok d'ailleurs un immense merci à toi de prendre le temps de m'expliquer avec des mots simples.

    Concernant la question 1 formulaire- 2 boutons - 2 actions

    on est bien d'accord que dans mon formulaire "global", pour un formulaire un bouton une action

    j'ai un sous-formulaire "liste des dates déclarée" qui renvoi comme ceci
    <form value="liste_date_decla" methode="post" action="fonction.php?do=selectdate">

    si pas de date déclarée (à l'ouverture par exemple) un sous-formulaire de saisiqui renvoi
    <form value="ajout_decla" methode="post" action="fonction.php?do=add">

    Si je comprends bien ton dernier post, je donne au formulaire l'appellation suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <form methode="post" action="fonction.php?do=upd_or_del">
    <bouton=del>
    <bouton=upd>
    Dans mon controleur

    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
     
    if (empty($_GET['do']) || ( ! in_array(strtolower($_GET['do']), $actions, true)))
    {
        $action = 'index';
    }
    else
    {
         if (strtolower($_GET['do'])=="upd_or_del")
         {
                 if (($_POST['do'])=="upd"
                 {
                  $action='update';
                  }
                  else
                 {
                 $action='delete';
                 }
         }
     
        $action = strtolower($_GET['do']);
    }

  19. #19
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Tu peux effectivement mixer une URL paramétrée avec des valeurs spéciales du $_POST mais dans ton cas c'est inutile.

    Ceci devrait être suffisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form action="dispo.php" method="post">
    <input type="submit" name="do" value="update" id="update"/>
    <br/>
    <input type="submit" name="do" value="erase" id="erase"/>
    </form>
    dans ce formulaire, tu récupères l'action via un bouton cliqué donc tu n'as pas besoin de définir ?do=action puisque c'est une fois le formulaire soumis que tu sauras quelle action a été demandée.

    Le but de la manœuvre c'est que quand tu atterris sur le contrôleur, le paramétrage récupéré de quelque manière que ce soit ($_GET et/ou $_POST) ne t'amène qu'à une seule et unique action.
    Tu peux mixer les moyens de paramétrages mais souvent ça rend le code imbitable, privilégie la simplicité.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] quel utiliser: Asp.net MVC ou sans MVC?
    Par spring.time dans le forum ASP.NET MVC
    Réponses: 5
    Dernier message: 06/05/2012, 19h06
  2. MVC or not MVC ?
    Par lirakien dans le forum Développement Web avec .NET
    Réponses: 7
    Dernier message: 14/05/2010, 17h49
  3. La différence entre MVC 1 et MVC 2
    Par ghir_ana dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 2
    Dernier message: 07/05/2010, 15h07
  4. Réponses: 6
    Dernier message: 17/06/2008, 12h04
  5. MVC or not MVC ?
    Par Seth77 dans le forum Langage
    Réponses: 7
    Dernier message: 06/07/2006, 15h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo