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 :

Rechargement de page après validation de formulaire en MVC


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    en reconversion
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 28
    Points
    28
    Par défaut Rechargement de page après validation de formulaire en MVC
    Bonjour

    voilà mon problème.
    je réalise un petit site commercial en MVC, histoire de me familiariser avec la POO et cette organisation du code. j'ai déjà pas mal avancé.
    Toutes les parties réalisées fonctionnent sauf que je n'avais pas pensé à une chose : Empêcher le rechargement de page après une validation de formulaire.
    En effet quand je mets à jour une quantité en stock d'un produit et que j'actualise la page en cours, la quantité augmente d'autant que celle saisie.
    j'ai pensé à utiliser la fonction hearder('Location....') pour rediriger la page, mais vu l'organisation de mes fichiers je ne sais pas où la mettre dans le code (peut être au niveau des contrôleurs).
    les fichiers sont les suivants :

    • un index
    • un routeur qui redirige vers des contrôleurs en fonctions d'une action
    • des contrôleurs qui appellent des managers appropriés
    • des managers pour agir sur la base de données

    Les contrôleurs appellent une classe Vue, qui génère le fichier à charger. l'instance de Vue génère la page en fonction du contenu qui lui est transmis.
    Par exemple pour le controleur $ctrlGestionStocks (issu de la classe ControleurGestionStocks), la génération de la vue qui confirme que telle quantité pour tel produit a bien été ajoutée dans la bdd , se fait comme ceci:

    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
     
    class ControleurGestionStocks
    {
    	private $managMarque;
    	private $managProduit;
     
    //.....code
     
    	public function ajouterQte($qtes, $idfts)
    	{
    		//....code
     
    		if(!empty($majProds)) //tableau des produits à mettre à jour
    		{
    			//transmission du tableau et récupération des produits mis à jour
    			$produits = $this->managProduit->ajouter($majProds);
    			$vue = new Vue('ConfirmationEntreeStocks', 'Privee');
                             //affichage de la vue via la méthode generer
    			$vue->generer(array('Prods'=>$produits));
    		}
    		//...code	
     
    	}
    //...code
    }
    Je pense que c'est là qu'il faut agir car la classe Vue ne pourrait pas faire de redirection et ce n'est pas sont rôle .
    Du coup, je me sent un peu coincé.
    Qu'en pensez vous ?
    merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    effectivement c'est le boulot du contrôleur de vérifier qu'il ne fait pas face à un rechargement de page. Donc la redirection doit se situer à ce niveau. Le modèle et la vue restent en sommeil dans ce traitement.
    Généralement, tu évites autant que possible de traiter avec le même chemin la création d'un formulaire à remplir et sa soumission. Cela facilite grandement la vie.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    en reconversion
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Ok merci pour la réponse rawscr.
    Donc mon intuition était bonne.

    est ce que par ex une solution serait de récupérer les données du formulaires et les mettre dans une variable de session, puis rediriger avec header() vers le routeur en lui donnant comme infos action = traiterform par ex, lequel
    contrôleur irait chercher sa méthode ajouterQte () ? en gros comme ça à la va vite :

    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
     
     
    class ControleurGestionStocks
    {
    private $managMarque;
    private $managProduit;
     
    //.....code
     
    public function traiterForm($qtes, $idfts)
    {
      $_SESSION ['qtes'] = $qtes;
      $_SESSION['$idfts'] = $idfts;
     
    header('Location: index.php?action=traiterForm ');
     
    }
     
     
    public function ajouterQte($_SESSION['qtes'], $_SESSION['$idfts'])
    {
    	//....code
     
    		if(!empty($majProds)) //tableau des produits à mettre à jour
    		{
    			//transmission du tableau et récupération des produits mis à jour
    			$produits = $this->managProduit->ajouter($majProds);
    			$vue = new Vue('ConfirmationEntreeStocks', 'Privee');
                             //affichage de la vue via la méthode generer
    			$vue->generer(array('Prods'=>$produits));
    		}
    		//...code	
    }
    //...code
    }
    }
    Un peu tarabiscoté non ? mais c'est la seule possibilité que je vois

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Je suis pas certain que ce soit la méthode la plus propre, cela doit pas mal dépendre de comment tu as organisé tes fichiers et tes données; mais sans plus de précision j'aurais fais comme ceci.

    Ta page contenant le formulaire serait seulement "rempli" par ton contrôleur initial de sorte que si tu actualise la page tu n'actualises pas une soumission de formulaire mais juste le remplissage de la page.
    Ensuite tu ajoutes un appel AJAX sur ton bouton submit qui fera appel à un contrôleur différent chargé de la soumission des données.

    Comme c'est la page AJAX qui fait la soumission, recharger ta page courante n'aura donc pas d'effet sur tes données en BDD.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    en reconversion
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    ben je n'aurais pas pensé à une solution Ajax. Le problème est que je ne connais pas encore, sauf de nom.
    Pour le moment je préfère rester sur une solution en PHP si possible. ça reste dans mes cordes
    Mais c'est sûr que, et je suis d'accord, que ça dépend de l'organisation des fichiers. j'ai voulu rester simple pour une compréhension aisée de la chose mais je m'aperçois en progressant que ce n'est pas très flexible tous ça.
    Mais bon je n'ai pas trop envie de tout refaire. je verrais plus tard les choses à améliorer.

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Reelo Voir le message
    est ce que par ex une solution serait de récupérer les données du formulaires et les mettre dans une variable de session, puis rediriger avec header() vers le routeur en lui donnant comme infos action = traiterform par ex,
    non, tu renvoies directement sur l'url de traitement en charge de la soumission du formulaire.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    en reconversion
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    bonjour,
    je vois en gros ce que tu veux dire rawsrc , mais pour l'instant ma seul URL possible est mon fichier index.php.Tous le reste représente les classes . en gros c'est réparti comme ça :

    • dossier contenu
      • css


    • dossier Controleur
      • fichiers des différentes classes controleur + routeur


    • dossier Modele
      • dossier entites
        • fichiers représentant les classes des entités de la bdd

      • fichiers des classes manager


    • dossier Vue

    • index.php


    C'est pour ça que je disais que ce n'était pas très flexible plus haut. à moins de faire un fichier du genre traitementformulaire.php par ex mais est ce que ça resterait cohérent au niveau organisation des fichiers ?

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    ok, poste les deux url de traitement :
    - génération du formulaire
    - soumission du formulaire

    Tu renvoies tout sur index.php, tu fais une redirection au niveau applicatif ou une redirection au niveau du serveur web ?

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    en reconversion
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Bonjour désolé pour cette réponse tardive pour cause d'absence . et ça risque d'être pareil aujourd'hui.
    Bon en même temps j'ai pas chômé puisque j'ai trouvé une petite solution qui fonctionne, ce matin à la fraîche. Après est ce la meilleur dans mon cas,je ne sais pas. En tous cas lorsque j'actualise, la page ne recharge rien et reste figée sur le tableau de retour de mise à jour.

    je vais poster ce que j'ai fait.
    côté routeur:
    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
     
     
    //....code
    elseif($_GET['action'] == 'entreeStocks') //entrée en stock de produits en fonction du nom d'une marque
    {
        if(!empty($_POST))
        {
    	$nomMarque = $this->getParametre($_POST, 'choixMarque');
    	$this->ctrlGestionStocks->entreeStocks($nomMarque);
         }
    }
    elseif($_GET['action'] == "entrerQtes") //modifier des quantités en stocks			
    {
         if(!empty($_POST))
        {
    	$qtes = $this->getParametre($_POST, 'qtes');
    	$idsProds = $this->getParametre($_POST, 'ids');
    	$this->ctrlGestionStocks->ajouterQte($qtes, $idsProds);
        }
    }
    elseif($_GET['action'] == "voirModifEntrees") //voir le retour des modifications
        {	
    	if(!empty($_SESSION['ProdsModifies']))
    	{
    		$prodsMaj = $this->getParametre($_SESSION, 'ProdsModifies');
    	}
    	else
    	{
    		$prodsMaj = NULL;
    	}
    	$this->ctrlGestionStocks->afficheResultat($prodsMaj);	
       }
     
    //....code
    côté 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
    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
     
    //...code
    public function ajouterQte($qtes, $idfts)
    {
       //transformation des identifiants et des quantités envoyés par le formulaire en entiers	
        foreach($qtes as $q)
         {
    	$qtesAajouter[] = intval($q);
         }
        foreach($idfts as $id)
        {
    	$idsProds[] = intval($id);
        }
     
    //on rassemble les deux tableaux
    $tabIdsProds = array_combine($idsProds, $qtesAajouter);
     
        foreach($tabIdsProds as $id=>$valeur)
       {
          if($this->managProduit->existeProd($id) AND $valeur != 0)
    	{	
    	//création d'un produit auquel on ajoute la quantité saisie, et mise de l'objet dans un tableau de
    	//produits à mettre à jour
    		$prod = $this->managProduit->getProduit($id);
    		$prod->ajouterQteStock($valeur);
    		$majProds[] = $prod;
    	}
        }
        if(isset($majProds))
       {
    	//transmission du tableau et récupération des produits mis à jour
    	$produits = $this->managProduit->ajouter($majProds);
    	$_SESSION['ProdsModifies'] = $produits;
        }
        else
       {	//Le tableau est vide
    	$_SESSION['ProdsModifies'] = NULL;
        }
        //redirection pour éviter le rechargement de page
        header('Location: index.php?action=voirModifEntrees');
    }
     
     
    public function AfficheResultat($produits)
    {
       if(!empty($produits))
        {
    	$vue = new Vue('ConfirmationEntreeStocks', 'Privee');
    	$vue->generer(array('prods'=>$produits));
         }
       else
       {
    	$vue = new Vue('ConfirmationEntreeStocks', 'Privee');
    	$vue->generer(array());
        }
    }
    côté manager des produits:
    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
     
     
    //...Code
    /**
    * Méthode ajouter() : ajoute une quantité à un stock d'un produit donné
    * 
    * @param array() $produits : tableau d'objets de type Produit
    * 
    * @return array() $lesProduits :  tableau d'objets de type Produit représentant les produits dont la qté à été modifiée
    */
    public function ajouter($produits)
    {
       foreach($produits as $prod)
       {	
    	$sql = 'UPDATE Produit SET qte_stock = :param1 WHERE id_prod = :param2 ';
     
    	$maj = $this->executerRequete($sql, $params = array(
    	$prod->getQteStock(),
    	$prod->getIdProd()));
    	if($maj->rowCount() == 1)
    	{	
    		$lesProduits[] = $this->getProduit($prod->getIdProd());
    	}			
        }
    	$maj->closeCursor();
    	return $lesProduits;
    }
     
    //...code
    le formulaire :
    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
     
    <section>
    <h2>Gestion des stocks</h2>
    <h3>Rentrer un produit de la marque <?php echo $_SESSION['marque'];?> en stocks :</h3>
    <?php
       if(!empty($Prods))
       {
    	echo'
    	<form method="post" action="index.php?action=entrerQtes" class="form">
    		<table>';
    	foreach($Prods as $produit)
    	{	
    	echo'<tr><td>
    	<span>Réf :</span> ' . $produit->getRefProd() . ' <span>Nom produit : </span>' .  $produit->getNomProd() . 
        '<span>Type : </span>' . $produit->getLaCategorie()->getNomCategorie() . 
        ' <span>Couleur :</span> ' . $produit->getCouleur() . ' <span>Genre : </span>' . $produit->getGenre() .
        ' <span>Taille : </span>' . $produit->getTaille() . '<span>Qté stocks : </span>' . $produit->getQteStock() .
        '<input type="hidden" name="ids[]" value="' . $produit->getIdProd() . '" />
        </td>
        <td>
        <input type="number" name="qtes[]" value="0" min="0" class="combien"/>
        </td></tr>';	
    	}
    echo'</table>
    <p class="validation"><input type="submit" value="Enregistrer"/></p>
    </form>';
    }
    else
    {
    echo"<p>Il n'y a aucun produit correspondant à la marque " . $_SESSION['marque'] . " enregistré dans le catalogue.</p>";
    }
    ?>
     
    //......

Discussions similaires

  1. recharger page apres validation formulaire
    Par nicerico dans le forum jQuery
    Réponses: 5
    Dernier message: 19/08/2009, 08h16
  2. Recharger page après validation de formulaire par POST
    Par Flynt dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/02/2008, 16h33
  3. [PHP-JS] rechargement d'une page après validation
    Par illight dans le forum Langage
    Réponses: 7
    Dernier message: 16/05/2007, 11h55
  4. Ouverture d'une page aprés validation d'un formulaire
    Par civodultrebor37 dans le forum Langage
    Réponses: 11
    Dernier message: 14/12/2006, 13h19
  5. [PEAR][HTML_QuickForm] Comment afficher une page après validation du formulaire ?
    Par jpinfotech dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 27/11/2006, 15h58

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