Partage
  • Partager sur Facebook
  • Partager sur Twitter

Appel d'une vue dans la même vue

    8 février 2024 à 18:26:11

    Bonjour.
    le titre n'est pas de plus explicite mais je vais essayer de vous expliquer.

    J'ai une vue simple par exemple (paracerque j'ai le même problème sur plusieurs vue)

    {% include '/partials/header.twig' %}
    <div class="container col-lg-8 mt-4">
        <h1>Ajouter un Post</h1>
        <form action="{{ base_url }}post" method="POST">
            <div class="form-group">
                <label for="title">Titre</label>
                <input type="text" name="title" class="form-control" required>
            </div>
            <div class="form-group">
                <label for="content">Contenu</label>
                <textarea name="content" class="form-control" rows="4" required></textarea>
            </div>
            <button type="submit" class="btn btn-primary mt-3">Ajouter</button>
        </form>
    </div>
    {% include '/partials/footer.twig' %}

    Je précise pas avance que le problème ne vient pas des includes car j'ai essayé avec et sans
    Voici le code de la fonction du contrôleur qui appelle la vue:

        public function create_post_Form()
        {
            $config = new Config();
            $base_url = $config->getBaseUrl();
            echo $this->twig->render('posts/add_post_form.twig', ['base_url' => $base_url]);
        }

    Je vous donne le code du Router (on sait jamais ^^):

    <?php
    
    namespace App\Core;
    
    use App\Config\Config;
    use Twig\Environment;
    use Twig\Loader\FilesystemLoader;
    
    
    class Router
    {
        private $routes;
        private $twig;
    
        public function __construct($routes)
        {
            $this->routes = $routes;
    
            // Initialiser Twig
            $loader = new FilesystemLoader(__DIR__ . '/../views');
            $this->twig = new Environment($loader);
        }
    
        public function route($url, $request_method)
        {
            $config = new Config();
            $base_url = $config->getBaseUrl('base_url');
    
            foreach ($this->routes as $route => $params) {
                // Remplace les annotations dans la route par des regex
                $pattern = '#^' . preg_replace('#\{([\w]+)\}#', '([^/]+)', $route) . '$#';
                $url = $request_method . ' ' . substr_replace($_SERVER['REQUEST_URI'], '/', 0, strlen($base_url));
    
                if (preg_match($pattern, $url, $matches)) {
                    // Supprime le premier élément qui contient l'URL complète
                    array_shift($matches);
    
                    // Appelle la méthode du contrôleur avec les paramètres
                    list($controllerClass, $action) = $params;
                    $controller = new $controllerClass($this->twig);
    
                    // Rendre la vue en utilisant Twig
                    echo $this->twig->render($action . '.twig' .$controller->$action(...$matches));
                    return;
                }
            }
            // Si aucune route n'est trouvée, affiche la page 404
           echo $this->twig->render('404.twig');
        }
    }

    et le code de routes.php

    <?php
    
    use App\Controllers\HomeController;
    use App\Controllers\PostController;
    use App\Controllers\UserController;
    use App\Controllers\DashboardController;
    
    // Définition des routes
    $routes = [
        'GET /' => [HomeController::class, 'index'],
        // admin routes
        'GET /admin' => [DashboardController::class, 'index'],
        // user routes
        'GET /user/create' => [UserController::class, 'add_user_Form'],
        'POST /user/add' => [UserController::class, 'add_user'],
        'GET /user/{id}/edit' => [UserController::class, 'update_user_Form'],
        'POST /user/{id}/update' => [UserController::class, 'update'],
        'POST /user/{id}/delete' => [UserController::class, 'delete_user_confirmation'],
        'POST /user/delete/{id}' => [UserController::class, 'delete'],
        // post routes
        'GET /post/create' => [PostController::class, 'create_post_Form'],
        'POST /post' => [PostController::class, 'create_post'],
        'GET /post/{id}/edit' => [PostController::class, 'update_post_Form'],
        'POST /post/{id}' => [PostController::class, 'update_post'],
        'POST /post/{id}/delete' => [PostController::class, 'delete_post_confirmation'],
        'POST /post/delete/{id}' => [PostController::class, 'delete_post']
    ];
    
    return $routes;
    

    Voici ce que j'ai à l'écran :

    Le formulaire s'affiche bien (malgré que ce soit du Bootstrap mais bon, faut bien ce facilité les chose des fois ^^)
    le formulaire fait ce qu'on lui demande mais j'ai un message qui me dit qu'il manque la vue dans laquelle je suis :(

    J'ai ce problème sur toutes vues qui ont un formulaire

    Merci d'avance pour votre aide généreuse 





    • Partager sur Facebook
    • Partager sur Twitter
      8 février 2024 à 19:23:59

      Salut

      Je ne vois pas vraiment d'où ça peut venir, mais peut-être que j'ai une piste et le moyen d'en trouver une autre.

      Dans un premier temps, est-ce que tu as xdebug d'installé sur ta machine ? Est-ce que tu as un "mode débogage" que tu pourrais activer pour Twig, ou un journal quelconque qui te fournirait plus d'informations ? Parce qu'à part cette erreur laconique, il n'y a effectivement que peu d'information pratique, comme où l'erreur survient, dans quel template et à quelle ligne notamment.

      Ensuite, avec Twig, sa force est "d'inverser" le paradigme qui dit qu'on inclut dans la page les parties communes : on rend la page qui, elle, étend ({% extends … %}) un template parent qui lui va contenir les parties communes.

      • Partager sur Facebook
      • Partager sur Twitter
        8 février 2024 à 20:32:36

        Je dois être débile mais j'ai installer (je crois) xdebug.

        en tout cas, il est présent en mode debug dans la partie configuration php de wamp mais je dois pas savoir comment voir le resulat.

        J'utilise VSCode.
        il y a une proposition de débug mais quand je clique dessus, j'ai un message me disant que j'ai pas d'extension pour débugger 'HTML(Twig)'.
        j'en trouve pas le marketplace des extensions.

        je me suis essayé à utiliser {% extends … %}

        avec un fichier "base.twig"

        <!DOCTYPE html>
        <html>
            <head>
                {% block head %}
                    <meta charset="utf-8">
                    <meta name="viewport" content="width=device-width, initial-scale=1">
                    <title>Mon site</title>
                    <link rel="icon" type="image/x-icon" href="public/img/favicon.ico">
                    <link rel="stylesheet" href="public/css/style.css"/>
                    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
                    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
                    <script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
                {% endblock %}
            </head>
            <body>
                <div id="content">{% block content %}{% endblock %}</div>
                <div id="footer">
                    {% block footer %}
                        &copy; Copyright 2011 by <a href="http://domain.invalid/">you</a>.
                    {% endblock %}
                </div>
            </body>
        </html>

        et la vue 

        {{ {% extends "base.tiwg" %}}}
        {% block title %}Add Post
        {% endblock %}
        
        {% block content %}
        	<div class="container col-lg-8 mt-4">
        		<h1>Ajouter un Post</h1>
        		<form action="{{ base_url }}post" method="POST">
        			<div class="form-group">
        				<label for="title">Titre</label>
        				<input type="text" name="title" class="form-control" required>
        			</div>
        			<div class="form-group">
        				<label for="content">Contenu</label>
        				<textarea name="content" class="form-control" rows="4" required></textarea>
        			</div>
        			<button type="submit" class="btn btn-primary mt-3">Ajouter</button>
        		</form>
        	</div>
        {% endblock %}
        

        Mais ma page web affiche

        Une erreur s'est produite : A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses (unexpected token "operator" of value "%".

        edit
        J'ai trouvé mon erreur citée précédement:

        {% extends "/base.twig" %} à la place de {{ {% extends "base.tiwg" %}}}C'est déjà mieux ^^


        Re edit

        Bon, un peux d'avancement ^^

        Je crois avoir réussi a utiliser XDebug mais ça na pas l'ai de fonction sur des fichiers twig

        J'ai réussi a utiliser {% extends … %}  

        Mais, bien sur qu'il a un "mais", j'ai toujours le même message :

        Une erreur s'est produite : Unable to find template "create_post_Form.twig" (looked into: C:\wamp64\www\flow\app\Core/../views).

        Relou. Je préféré les gros warning php ^^

        Au final, on en est toujours au même endroit

        -
        Edité par FCL31 8 février 2024 à 21:28:55

        • Partager sur Facebook
        • Partager sur Twitter
          8 février 2024 à 23:24:48

          En fait, il n'est pas exclu que la casse pose problème. Apparemment, ton template possède un f en minuscule, alors que l'erreur mentionne un F en majuscule… C'est ça de faire du templating dynamique  :p
          Et c'est moins un souci sous Windows qui n'a pas vraiment cure de la casse, mais un système UNIX va encore moins aimer.

          Pour ce qui est de xdebug, c'est surtout que plutôt que juste l'erreur, il devrait aussi t'afficher la pile d'appel. Et non, il ne peut évidemment pas déboguer du Twig, mais il peut le faire pour le PHP généré par Twig après mise en cache des templates. Comme le souci est probablement avant l'exécution de l'un d'entre eux, avec une exécution pas à pas depuis le début l'action, ça devrait être possible.

          -
          Edité par Ymox 8 février 2024 à 23:25:02

          • Partager sur Facebook
          • Partager sur Twitter
            9 février 2024 à 23:32:23

            Bon, j'ai modifier le noms des fichiers et fonctions pour les mettre en camelCase.

            J'ai fait du nettoyage dans le code mais j'ai toujours ce pu*** de problème d'appel d'une vue dans la même vu :(

            Si jamais, je peux donner le lien du repository GitHub

            • Partager sur Facebook
            • Partager sur Twitter
              10 février 2024 à 0:23:13

              Je n'aurais pas recommandé de nommer les fichiers en camelCase, mais plutôt d'effectuer une conversion dans ton code pour t'assurer de n'avoir que des minuscules… voire de les mettre aussi aux noms des actions/méthodes/fonctions de manière à ce que ce soit cohérent.

              • Partager sur Facebook
              • Partager sur Twitter

              Appel d'une vue dans la même vue

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown