Partage
  • Partager sur Facebook
  • Partager sur Twitter

Perte variables quand redirection vers template

Sujet résolu
    22 janvier 2020 à 19:42:40

    Bonsoir,

    J'ai commencé à adopter une structure MVC, mais je bloque sur un point.

    Suivant le cours d'Openclassrooms j'ai créé un template pour ma vue principale avec notamment une variable $content. A la mise en place, tout se passe bien, le contrôleur initialise ma variable $content et la vue s'affiche parfaitement.

    C'est après que ça bug. J'ai un lien dans cette page qui passe par l'index puis le contrôleur pour mettre à jour ma base de donnée. Je voudrais alors retourner vers ma vue principale que je n'ai pas besoin de remettre à jour, mais je me retrouve coincé, car :

    • soit à la fin de l'action du contrôleur je me retrouve avec une page blanche alors que je voudrais revenir sur ma page principale
    • soit je me redirige vers le template avec un header('location:view/template.php') et alors celui-ci ne connaît plus la variable $content que je n'ai pas envie de réinitialiser.

    Y a-t-il un moyen que le contrôleur rende la main à la page principale sans tout perdre ? Est-ce que je vais être obligé d'abandonner la solution du template ?

    Merci.

    • Partager sur Facebook
    • Partager sur Twitter
      22 janvier 2020 à 20:21:39

      Bonsoir,

      Tu récupère les données depuis ta bdd pour les retourner à ton controlleur qui va appeler la bonne vue grâce à require

      Voir require -> https://www.php.net/manual/fr/function.require.php

      Peut-on voir ton code sinon ?

      -
      Edité par Mehddii 22 janvier 2020 à 20:23:25

      • Partager sur Facebook
      • Partager sur Twitter

      Postez votre code et vos msg d'erreurs - "ça marche pas" n'est pas un message d'erreur ...

        23 janvier 2020 à 8:21:52

        Bonjour,

        merci de ton aide.

        Voici à quoi ressemble une partie de mon code :

        L'index :

        require('controller/controller.php') ;
        
        if (isset($_GET['action'])) {
        	if ($_GET['action']=='instal') {
        		installation() ;
        	} elseif ($_GET['action']=='db_update') {
        		db_update() ;
        	} else {
        		exit('au revoir') ;
        	}
        }

        Le contrôleur :

        controller.php :
        
        require('model/model.php') ;
        
        function installation() {
        	$list=getInstallation() ;		// appel de la fonction dans model.php, marche parfaitement.
        	require('view/main_view.php') ;	        // marche parfaitement.
        }
        
        function db_update() {
        	db_field_update() ;			// appel de la fonction dans model.php, marche parfaitement.
        	require('view/template.php') ;		// Si je ne mets pas cette ligne, j'ai une page blanche.
        						// Si je mets cette ligne template.php me dit qu'il ne connaît pas $content
        }
        

        main_view.php appelée par la fonction installation() du contrôleur ; marche parfaitement :

        <?php ob_start();?>
        <?php
        	//… code qui crée du html en utilisant la variable $list fournie par le contrôleur
        ?>
        <?php $content=ob_get_clean();?>
        <require('template.php') ;

        Ma vue principale sur laquelle je voudrais revenir après db_update : template.php

        …
        <body>
        	<div><?=$content;?></div>
        	<a href='index.php?action=db_update'>cliquer ici</a>
        </body>
        

        c'est en cliquant sur la balise <a> de cette vue que j'appelle db_update via l'index. Objectif : mettre à jour la bdd sans toucher à l'affichage.

        Quand je fais le require('template.php') dans db_update(), je comprends parfaitement que $content n'est pas connue du template, mais je ne veux pas avoir à réinitialiser cette variable car ça va modifier ce que voit l'utilisateur, alors que je veux que le fait de cliquer sur <a> lance des actions sur la bdd de façon totalement transparente pour l'affichage. Et si je ne fais pas le require, db_update me laisse sur une page blanche.

        J'ai essayé require_once et header (j'avoue ne pas bien comprendre la différence entre les deux), mais aucun ne marche.

        Merci.





        • Partager sur Facebook
        • Partager sur Twitter
          23 janvier 2020 à 9:37:48

          require_once c'est pour ne pas appeler deux fois le même fichier.

          header pour rediriger vers une page spécifique

          require et require_once c'est comme si tu disais que le fichier a besoin du fichier spécifié dans require(...)

          contrairement à include qui va seulement venir inclure le fichier sans se préoccuper si cette variable existe ou pas.

          Aussi, dans ton template, lorsque tu fais <?= $content ?>

          Je te conseille de toujorus faire des vérifications, du style -> if(isset($content)) -> c'est plus propre

          Sinon pour ton problème j'ai pas très très bien compris, mais regarde du coté des constantes magiques

          Plus précisément du coté de __DIR__ ou __FILE__

          Essayes de faire un : require(__DIR__ . "/view/template.php");

          • Partager sur Facebook
          • Partager sur Twitter

          Postez votre code et vos msg d'erreurs - "ça marche pas" n'est pas un message d'erreur ...

            23 janvier 2020 à 12:27:37

            Je pense que le soucis viens d'un problème de compréhension de l'architecture MVC.

            En soit la page qui sert pour la view ne devrait même pas être accessible par le navigateur et donc par la même occasion, sera inaccessible pour le header location.

            Si tu veux afficher la view il faut passer par le contrôleur correspondant et donc passer par le fichier index.php avec la bonne action. Voici un exemple sur repl.it de la structure sur quelque chose de simplifier le plus possible : https://repl.it/repls/PiercingDutifulSolaris

            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2020 à 9:16:15

              Bonjour,

              merci pour ces précisions.

              Pour bien comprendre mon problème : mon but n'est pas d'afficher la view, mais tout simplement d'appeler la fonction db_update() qui n'a rien à voir avec aucune vue.

              Si dans mon contrôleur la fonction est la suivante, sans require, j'atterris sur une page blanche.

              function db_update() {
              	db_field_update() ;			// appel de la fonction dans model.php, no pb.
              }

              Ma question est donc très générale finalement : comment, en passant par l'index, appeler une fonction php qui n'a aucun impact sur la view sans arriver sur une page blanche ? Est-ce que mon problème vient du fait que je l'appelle depuis une balise <a> plutôt qu'un open('GET',...) caché derrière un eventlistener en JS ?

              Merci.

              • Partager sur Facebook
              • Partager sur Twitter

              Perte variables quand redirection vers template

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown