Partage
  • Partager sur Facebook
  • Partager sur Twitter

MOOC Programmez en orienté objet en PHP

    27 septembre 2019 à 13:36:40

    Bonjour a tous. Je suis sur la partie 3 de ce cours; mais je n'arrive pas a obtenir les page du site. Je tombe toujours sur la page 404.html.

    Quelque peut m'expliquer un peu comment faire marcher cette application? (je cherche depuis des jours je n'y arrive pas). Merci de votre aide.

    • Partager sur Facebook
    • Partager sur Twitter

    Diogo DIALLO 

      27 septembre 2019 à 19:29:16

      salioudiogo a écrit:

      Bonjour a tous. Je suis sur la partie 3 de ce cours; mais je n'arrive pas a obtenir les page du site. Je tombe toujours sur la page 404.html.

      Quelque peut m'expliquer un peu comment faire marcher cette application? (je cherche depuis des jours je n'y arrive pas). Merci de votre aide.


      Bonjour,

      Avez-vous bien configuré votre serveur (Wamp ou lamp ?) sur le répertoire web de l'application ?

      C'est à dire, vous êtes sous wamp par exemple, il faut configurer un virtualhost sur 'nom du disque dur'/Wamp64/www/"nom du projet"/web ? Parce que le serveur doit avoir accès directement au fichier .htaccess qui redirige par défaut vers bootstrap.php avec app=Fronted et là cela démarre.

      Le fait de créer un virtualhost permet (après redémarrage de tous les services de Wamp) d'ajouter le nom du projet dans le fichier hosts de Windows.

      Après le démarrage de WampServer on clique juste sur le nouveau virtualHost ou même tapez directement dans la barre d'adresse du navigateur http://"nom-du-projet"/ et cela doit normalement lancer l'application.

      Mais attention, je ne sais pas vraiment pourquoi, cela marche parfaitement bien sous internet explorer, Firefox, Chrome mais pas sur Edge (au passage si quelqu'un peut m'expliquer… n'hésitez pas).

      Sinon, à partir de la page 404.html, si elle est bien construite par l'application, essayez de taper sur le lien accueil qui devrait rediriger correctement vers le bootstrap et relancer correctement sur le bon chemin (cela m'est déjà arrivé de rencontrer ce problème que je résolvais ainsi).

      En espèrant que cela puisse vous aider un peu.

      Bon courage, cet exercice est difficile.

      Patrick

      • Partager sur Facebook
      • Partager sur Twitter
        27 septembre 2019 à 21:02:36

        Patrick Bourges a écrit:

        salioudiogo a écrit:

        Bonjour a tous. Je suis sur la partie 3 de ce cours; mais je n'arrive pas a obtenir les page du site. Je tombe toujours sur la page 404.html.

        Quelque peut m'expliquer un peu comment faire marcher cette application? (je cherche depuis des jours je n'y arrive pas). Merci de votre aide.


        Bonjour,

        Avez-vous bien configuré votre serveur (Wamp ou lamp ?) sur le répertoire web de l'application ?

        C'est à dire, vous êtes sous wamp par exemple, il faut configurer un virtualhost sur 'nom du disque dur'/Wamp64/www/"nom du projet"/web ? Parce que le serveur doit avoir accès directement au fichier .htaccess qui redirige par défaut vers bootstrap.php avec app=Fronted et là cela démarre.

        Le fait de créer un virtualhost permet (après redémarrage de tous les services de Wamp) d'ajouter le nom du projet dans le fichier hosts de Windows.

        Après le démarrage de WampServer on clique juste sur le nouveau virtualHost ou même tapez directement dans la barre d'adresse du navigateur http://"nom-du-projet"/ et cela doit normalement lancer l'application.

        Mais attention, je ne sais pas vraiment pourquoi, cela marche parfaitement bien sous internet explorer, Firefox, Chrome mais pas sur Edge (au passage si quelqu'un peut m'expliquer… n'hésitez pas).

        Sinon, à partir de la page 404.html, si elle est bien construite par l'application, essayez de taper sur le lien accueil qui devrait rediriger correctement vers le bootstrap et relancer correctement sur le bon chemin (cela m'est déjà arrivé de rencontrer ce problème que je résolvais ainsi).

        En espèrant que cela puisse vous aider un peu.

        Bon courage, cet exercice est difficile.

        Patrick

        Merci Patrick pour votre réponse.  Je suis sous Mac et j'utilise Mamp. Je vous enverrai le code mais c'est le même que dans le cours. Je vous envoi après mon htaccess et la configuration du vhost. 

        • Partager sur Facebook
        • Partager sur Twitter

        Diogo DIALLO 

          28 septembre 2019 à 7:36:04

          bonjour,

          je suis egualement sur Mamp. Vois ce tutos pour la configuration du vhost (https://coolestguidesontheplanet.com/how-to-set-up-virtual-hosts-in-apache-on-macos-osx-sierra/). Perso meme apres la configuration le lancement de l'appli buguait au niveau du .htaccess : si fichier .htaccess => err 500 (serveur), si pas de .htaccess pas de soucis mais evidemment l'appli ne se lance pas..... cependant le .htaccess du cours fonctionne parfaitement. 

          Apres quelques semaines de galere j'ai opte pour une autre solution : faire fonctionner l'appli en localhost tout simplement. Pour cela il faut modifier les deux fichiers route.xml (celui du Fend et celui Bend) voici ce que donne le route.xml du Fend (faire pareil avec le Bend). Il faut aussi modifier les url des quelques liens places dans les vues pour qu ils correspondent.

           <?xml version="1.0" encoding="utf-8" ?>
          
          <routes>
          	<route url="/monsupersite/Web/" module="News" action="index" ></route>
          	<route url="/monsupersite/Web/news-([0-9]+)\.html" module="News" action="show" vars="id"></route>
          	<route url="/monsupersite/Web/commenter-([0-9]+)\.html" module="News" action="insertComment" vars="news"></route>
          </routes>

          Il n'y a plus qu'a lancer l'appli en localhost : localhost:8888/monsupersite/web/ et tout fonctionne a merveille.

          ps: Il y a aussi quelques erreurs laisser volontairement je devine, il te faudra les rectifier (mais rien de sorcier, tres bon exercice d'ailleurs).

          • Partager sur Facebook
          • Partager sur Twitter
            28 septembre 2019 à 13:15:36

            Bonjour,

            Mamadoo, J'ai bien reçu ton message et comme je te l'ai écris il est important que le chemin d'accès inscrit sur le serveur se termine par un '/' comme par ailleurs les routes dans les fichiers de configuration de l'exemple décrit dans le message précédent.

            Tiens nous au courant

            Patrick

            • Partager sur Facebook
            • Partager sur Twitter
              29 septembre 2019 à 2:18:15

              djedjethai a écrit:

              bonjour,

              je suis egualement sur Mamp. Vois ce tutos pour la configuration du vhost (https://coolestguidesontheplanet.com/how-to-set-up-virtual-hosts-in-apache-on-macos-osx-sierra/). Perso meme apres la configuration le lancement de l'appli buguait au niveau du .htaccess : si fichier .htaccess => err 500 (serveur), si pas de .htaccess pas de soucis mais evidemment l'appli ne se lance pas..... cependant le .htaccess du cours fonctionne parfaitement. 

              Apres quelques semaines de galere j'ai opte pour une autre solution : faire fonctionner l'appli en localhost tout simplement. Pour cela il faut modifier les deux fichiers route.xml (celui du Fend et celui Bend) voici ce que donne le route.xml du Fend (faire pareil avec le Bend). Il faut aussi modifier les url des quelques liens places dans les vues pour qu ils correspondent.

               <?xml version="1.0" encoding="utf-8" ?>
              
              <routes>
              	<route url="/monsupersite/Web/" module="News" action="index" ></route>
              	<route url="/monsupersite/Web/news-([0-9]+)\.html" module="News" action="show" vars="id"></route>
              	<route url="/monsupersite/Web/commenter-([0-9]+)\.html" module="News" action="insertComment" vars="news"></route>
              </routes>

              Il n'y a plus qu'a lancer l'appli en localhost : localhost:8888/monsupersite/web/ et tout fonctionne a merveille.

              ps: Il y a aussi quelques erreurs laisser volontairement je devine, il te faudra les rectifier (mais rien de sorcier, tres bon exercice d'ailleurs).

              Bonjour, merci de ta réponse; mais ca ne marche tours pas. Encore le 404.



              • Partager sur Facebook
              • Partager sur Twitter

              Diogo DIALLO 

                29 septembre 2019 à 6:00:29

                Huuummm,

                Tu as l'habitudes de bosser en localhost (puisque tu procedes deja comme ca). Donc je devine que tu places le dossier 'monsupersite' dans le bon dossier (la ou pointe mamp). Si ce n'est pas le cas met un fichier 'test.php' (avec un <?php echo 'salut; ?>) et fait localhost:8888/test.php =>'salut' dois apparaitre.

                A partir de la tu sais que cote serveur ca fonctionne, place le dossier 'monsupersite' au meme endroit que le 'test.php'. Adapte le code comme j'ai marque precedemment et fait 'localhost:8888/monsupersite/web/' (ou peut etre 'localhost:8888/monsupersite/web') : Ca doit fonctionner ! 

                Si tu as tout verifie, que tout fonctionne, et que ton erreur 404 persiste, c'est que l'appli se lance correctement, et que c'est elle qui genere l'erreur 404... 

                J'espere aussi que tu as active l'affichage des erreurs dans le php.ini sinon tu ne vas pas y arriver.

                Mais ca m'etonnerai que l'err 400 vienne de l'appli, si l'affichage des erreurs est bien actif, php devrait t'afficher des erreurs precises....

                -
                Edité par djedjethai 29 septembre 2019 à 6:11:07

                • Partager sur Facebook
                • Partager sur Twitter
                  29 septembre 2019 à 6:34:51

                  Bonjour Mamadoo, 

                  Effectivement, il faut absolument que tu soit sûr que c'est bien la page 404 de l'application qui se lance et non pas une page 404 standard. Le message précédent est une bonne idée, c'est à dire de personnaliser ta propre page 404 quitte à y mettre un truc totalement farfelu. 

                  Tu peux aussi le savoir par rapport à la page de style, normalement tu doit avoir une page dans le genre :

                  Ne fais pas attention au bouton connexion, je l'ai ajouté à la fin pour passer en mode admin plus facilement. Mais tu soit avoir un style dans ce genre avec le bouton Accueil et l'adresse http://ton-nom-de-serveur[:port]/web/bootstrap.php

                  Et comme il est dit dans le message précédent, si tu n'as pas cela c'est que n'est pas dans ton application et que le problème est coté serveur. Par contre si tu obtient cela, il devrait suffire de cliquer sur accueil pour retrouver le bon chemin sinon c'est dans ton code qu'il y a un soucis.

                  J'ai une autre idée mais il faut que j'essaye avant d'en parler parce que cela n'a pas l'air si simple… Bon courage tout de même l'exercice quoi que difficile est finalement très pédagogique parce qu'il faut bien comprendre tout le cours pour y arriver de façon assez simple et je trouve que ça vaut le coût.

                  Cordialement

                  Patrick

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 septembre 2019 à 11:36:30

                    djedjethai a écrit:

                    Huuummm,

                    Tu as l'habitudes de bosser en localhost (puisque tu procedes deja comme ca). Donc je devine que tu places le dossier 'monsupersite' dans le bon dossier (la ou pointe mamp). Si ce n'est pas le cas met un fichier 'test.php' (avec un <?php echo 'salut; ?>) et fait localhost:8888/test.php =>'salut' dois apparaitre.

                    A partir de la tu sais que cote serveur ca fonctionne, place le dossier 'monsupersite' au meme endroit que le 'test.php'. Adapte le code comme j'ai marque precedemment et fait 'localhost:8888/monsupersite/web/' (ou peut etre 'localhost:8888/monsupersite/web') : Ca doit fonctionner ! 

                    Si tu as tout verifie, que tout fonctionne, et que ton erreur 404 persiste, c'est que l'appli se lance correctement, et que c'est elle qui genere l'erreur 404... 

                    J'espere aussi que tu as active l'affichage des erreurs dans le php.ini sinon tu ne vas pas y arriver.

                    Mais ca m'etonnerai que l'err 400 vienne de l'appli, si l'affichage des erreurs est bien actif, php devrait t'afficher des erreurs precises....

                    -
                    Edité par djedjethai il y a environ 8 heures

                    Bonjour, j'ai mis un fichier test a la racine du dossier Mamp et il marche mais mon appli renvoi toujours ma page error404.php

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Diogo DIALLO 

                      30 septembre 2019 à 13:43:36

                      Bonjour,

                      As tu bien active l'affichage des erreurs dans ton php.ini ?? si tu n'es pas sur, fait une erreur bidon dans ton dossier test.php (<?php echo 'salu ?>) le message doit etre precis 'erreur a telle ligne, fin de fichiet incorrect etc.... (un truc comme ca)'. vois ce cours d'OCR https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/4238821-configurez-php-pour-visualiser-les-erreurs 

                      Si c'est fait et "verifier que cela fonctionne". C'est que la position des dossiers et fichiers qui se trouvent a l'interieur est incorrect. C'est a dire que tu ne les as pas dipose comme le prof les as place. (tu peux verifier en telechargeant le code final fournit dans l'activite 3, en supposant que ne l'ai pas deja fait, sinon c ok).

                      Si tout est correct et que tu as convenablement modifie les deux fichiers (celui du front-end et du Back-end) route.xml + adapter les liens des vues, ca doit fonctionner (en localhost) !!!!! En fait meme si ne copie que le code que j'ai affiche dans route.xml du front-end, tu n'auras pas d'erreur 404, mais une autre te stipulant une erreur precise dans ton code...... 

                      L'appli fournit dans le cours fonctionne parfaitement, la modif au niveau des routes que j'ai envoye fonctionne parfaitement (pour du localhost bien entendu). Donc si ton ficher test fonctionne, que tu places au meme endroit le code fournit ds le cours et le modifie convenablement (si tu reste en localhost, pour t'eviter la manip du vhost), ca ne peut que marcher ! 

                      j'insiste, l'url reste le meme que pour ton test si par exemple: localhost:8888/test.php (fonctionne) tu feras : localhost:8888/monsupersite/web (ou localhost:8888/monsupersite/web).

                      Nettoies le cache de ton navigateur.

                      Effaces tous les fichiers et remet tout en place

                      -
                      Edité par djedjethai 30 septembre 2019 à 14:12:28

                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 octobre 2019 à 0:06:31

                        Bonjour, malgré toutes mes tentatives (activation display_errors de php.ini, récupération du code typique du cours) rien ne marche toujours pas.

                        Je ne vois plus quoi faire d'autres.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Diogo DIALLO 

                          1 octobre 2019 à 11:29:39

                          Bonjour,

                          Normalement Salioudogo tu n'a rien à écrire dans ton url à part  "localhost" , ça se redirige automatiquement vers la vue initale de l'appli, Si ton vhost par défaut ou celui que tu a configuré pointe bien sur le dossier Web/ bien sûr .

                          • Partager sur Facebook
                          • Partager sur Twitter
                            1 octobre 2019 à 13:05:37

                            Bonjour,

                            Je suis désolé que tu ne trouves pas de solution. Mais, au vu de la copie d'écran que tu as fourni ainsi que les autres documents que tu m'as envoyés, il est impératif de comprendre à quoi sert le serveur apache, le fichier host (qui était correct quand tu me l'as envoyé) et l'interêt de ce que tu as renseigné dans tes fichiers httpd et httpd-vhosts. Aussi, le chemin que tu renseignes dans l'image que tu envoi ne peux pas marcher !

                            Il faut que l'adresse soit http://nom-du-projet[:port]/  le port n'est pas nécessaire si tu utilise le port 80 sinon il faut le mettre et je vois que tu as mis 8000 es-tu sûr que ce soit ce port là ? Il me semble qu'il s'agissait d'un autre port dans les post précédent port 80 dans ton virtualhost déclaré dans ton fichier httpd.conf. En tous cas, ce chemin ne peux pas être localhost:8000/web/bootstrap… !

                            Dans ton fichier host tu as (je copie ton code envoyé par la messagerie)

                            127.0.0.1 diogo.local www.diogo.local
                            ::1 diogo.local
                            

                            Dans ton fichier httpd.conf tu as 

                            ServerAdmin webmaster@localhost
                            
                            # Mettez ici le nom de domaine que vous avez utilisé dans le fichier hosts.
                            ServerName diogo.local
                            
                            # Mettez ici le chemin vers lequel doit pointer le domaine.
                            # Je suis sous Linux. Si vous êtes sous Windows, le chemin sera de la forme C:\Wamp\www\monsupersite\Web
                            DocumentRoot /Applications/MAMP/htdocs/diogo.local/Web
                            <Directory /Applications/MAMP/htdocs/diogo.local/Web>
                            Options Indexes FollowSymLinks MultiViews
                            
                            # Cette directive permet d'activer les .htaccess.
                            AllowOverride All
                            
                            # Si le serveur est accessible via l'Internet mais que vous n'en faites qu'une utilisation personnelle
                            # pensez à interdire l'accès à tout le monde
                            # sauf au localhost, sinon vous ne pourrez pas y accéder !
                            deny from all
                            allow from localhost
                            </Directory>
                            </VirtualHost>
                            

                            et ton httpd-vhosts

                            <VirtualHost *:80>
                            ServerAdmin webmaster@localhost
                            
                            # Mettez ici le nom de domaine que vous avez utilisé dans le fichier hosts.
                            ServerName diogo.local
                            
                            # Mettez ici le chemin vers lequel doit pointer le domaine.
                            # Je suis sous Linux. Si vous êtes sous Windows, le chemin sera de la forme C:\Wamp\www\monsupersite\Web
                            DocumentRoot /Applications/MAMP/htdocs/diogo.local/Web
                            <Directory /Applications/MAMP/htdocs/diogo.local/Web>
                            Options Indexes FollowSymLinks MultiViews
                            
                            # Cette directive permet d'activer les .htaccess.
                            AllowOverride All
                            
                            # Si le serveur est accessible via l'Internet mais que vous n'en faites qu'une utilisation personnelle
                            # pensez à interdire l'accès à tout le monde
                            # sauf au localhost, sinon vous ne pourrez pas y accéder !
                            deny from all
                            allow from localhost
                            </Directory>
                            </VirtualHost>
                            

                            Le nom de ton projet : diogo.local (attention il faut se méfier du . dans ton chemin)
                            le numéro de port : 80 donc le port par défaut et donc inutile de le préciser et c'est sans doute là qu'est l'erreur.
                            Je l'ai déjà écrit il devrait y avoir un '/' à la fin de la ligne <Directory "…./" > (c'est écris dans le cours) et moi, je mettrais le tout entre guillemets par sécurité.

                            A partir de là dans ton navigateur tu dois juste appeler http://diogo.loca soit à partir du navigateur directement soit à partir de mamp peu importe tant que le server mamp est démarré cela est impératif.

                            Par exemple pour moi :

                            Nom du projet :poo-php-07
                            Port : 8080

                            et mon virtual-host est déclaré comme ceci :

                            <VirtualHost *:8080>
                            	ServerName poo-php-07
                            	DocumentRoot "e:/wamp64/www/projets/sites/poo-php-07/web"
                            	<Directory  "e:/wamp64/www/projets/sites/poo-php-07/web/">
                            		Options +Indexes +Includes +FollowSymLinks +MultiViews
                            		AllowOverride All
                            		Require local
                            	</Directory>
                            </VirtualHost>
                            

                            donc pour moi le chemin soit de la page d'accueil du serveur virtual-host ou d'un navigateur sera http://poo-php-07:8080 est je t'assure que cela marche.

                            Ne te décourage pas, tu vas y arriver.

                            Patrick




                            • Partager sur Facebook
                            • Partager sur Twitter
                              1 octobre 2019 à 16:15:37

                              Volbos a écrit:

                              Bonjour,

                              Normalement Salioudogo tu n'a rien à écrire dans ton url à part  "localhost" , ça se redirige automatiquement vers la vue initale de l'appli, Si ton vhost par défaut ou celui que tu a configuré pointe bien sur le dossier Web/ bien sûr .


                              Bonjour Volbos, j'ai fait ca mais il m'affiche tout simplement It works. Si je mets un index.php ou test.php a la racine est que je pointe dessus elle s'affiche convenablement ou m'affiche l'erreur.
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Diogo DIALLO 

                                1 octobre 2019 à 17:07:40

                                Bonjour,

                                Je suis actuellement le cours Programmez en Orienté Objet en PHP (que je trouve très difficile).

                                Mon problème se situe dans la partie 3 consacré à la création d'une bibliothèque (framework) et plus précisément le chapitre 2 de la partie 3 Développement de la bibliothèque sous-chapitre le back controller.

                                Dans le code de la class BackController il y a une méthode execute() qui comprend une instruction que je ne comprends pas :  $this->$method($this->app->httpRequest());

                                Quand je fais un var_dump( $this->$method($this->app->httpRequest())); celui - ci me return null alors que l'application vas dans la class NewsController et execute la methode public function executeIndex(HTTPRequest $request) !

                                Où se trouve l'instruction qui renvoi le code vers la class NewsController pour executer la methode executeIndex(HTTPRequest $request) ?

                                Merci d'avance pour votre aide, car je suis bloqué sur ce problème depuis plusieurs jours et tout seul je ne trouverais pas la solution...

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 octobre 2019 à 17:51:44

                                  Bonjour,

                                  Pas facile effectivement ce cours pourtant, au final, je le trouve pas si mal justement parce qu'il nous oblige vraiment à tout décortiquer pour vraiment comprendre.

                                  Alors pour ta question, la réponse est trois ligne plus haut. C'est toute la méthode qu'il faut regarder ainsi que la classe HttpRequest mais surtout le fichier routes.xml.

                                  La méthode dont tu parles est la méthode execute du BackController qui est indirectement instanciée par la classe NewsController est est la suivante :

                                      public function execute(): void
                                      {
                                          $method = 'execute'.ucfirst($this -> action);
                                          if (!is_callable([$this, $method]))
                                          {
                                              throw new RuntimeException('L\'action "'.$this -> action.'" n\'est pas définie sur ce module');
                                          }
                                          else
                                          {
                                              $this -> $method($this -> app -> httpRequest());
                                          }
                                      }
                                  

                                  Imaginons que l'utilisateur clique sur la news 3 pour la visualiser, la page demandée sera donc news-3.html 

                                  Dans le fichier routes.xml on trouve

                                  <?xml version="1.0" encoding="utf-8" ?>
                                  <routes>
                                      <route url="/" module="News" action="index"></route>
                                      <route url="/news-([0-9]+)\.html" module="News" action="show" vars="id"></route>
                                      <route url="/commenter-([0-9]+)\.html" module="News" action="insertComment" vars="newsId"></route>
                                  </routes>
                                  

                                  Donc, logiquement l'application va mettre sa propriété action à show pour le module News.
                                  et dans la méthode du BackControleur la variable $method devient $method = 'executeShow'

                                  C'est donc grâce à cette ligne que le NewsControlller (ici) sait qu'il doit appeler sa méthode executeShow(HttpRequest $request).

                                  Ainsi la méthode executeShows est appelée avec pour argument l'objet HttpRequest qui permet de récupérer tous les $_GET, $_POST, $_COOKIES passés en argument via la requête html.

                                  Voilà, est-ce que tu comprends un peu mieux ? Dans ton exemple, c'est l'action index qui est transmise et donc, par ce mécanisme, c'est la méthode executeIndex(http $request) qui sera appelée.

                                  Tiens nous au courant si cela te semble encore obscur.

                                  Cordialement

                                  Patrick

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    1 octobre 2019 à 18:21:10

                                    Nothing...

                                    -
                                    Edité par Paul Vanderbeken 1 octobre 2019 à 19:23:18

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      8 octobre 2019 à 14:57:49

                                      Bonjour,

                                          Merci beaucoup pour la rapidité et la pertinence de votre réponse. 

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        9 octobre 2019 à 17:17:17

                                        Bonjour, 

                                        Je viens vers vous car je trouve nul part une solution, je suis entrain de faire le cours sur la POO et j'en suis aux Interfaces

                                        j'ai fais 2 fichiers : 

                                        <?php
                                        
                                        interface Movable
                                        {
                                            public function move($dest);
                                        }
                                        <?php
                                        class Personnage implements Movable
                                        {
                                        
                                        }

                                        C'était sensé me donner une erreur et avec la suite l'enlever :

                                        <?php
                                        
                                        class Personnage implements Movable
                                        {
                                            public function move($dest)
                                            {
                                        
                                            }
                                        }

                                        Le problème c'est que déjà mon erreur c'était pas la bonne, j'avais Fatal error: Interface 'Movable' not found in C:\wamp64\www\openclassroom\cours\php\poo\training\Personnage.php on line 3


                                        Et même en ajoutant la modification j'ai exactement la même erreur

                                        D'après ce que je comprend il est dit que mon interface 'Movable' n'est pas trouvé, or les deux fichiers sont dans le même dossier Movable.php et Personnage.php et il s'appel bien interface Movable donc je vois pas du tout d'ou peut venir le problème

                                        Si quelqu'un a une solution je suis preneur.

                                        Merci d'avance :)

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          10 octobre 2019 à 11:52:15

                                          AnthonyDubois8 a écrit:

                                          Bonjour, 

                                          Je viens vers vous car je trouve nul part une solution, je suis entrain de faire le cours sur la POO et j'en suis aux Interfaces

                                          j'ai fais 2 fichiers : 

                                          <?php
                                          
                                          interface Movable
                                          {
                                              public function move($dest);
                                          }
                                          <?php
                                          class Personnage implements Movable
                                          {
                                          
                                          }

                                          C'était sensé me donner une erreur et avec la suite l'enlever :

                                          <?php
                                          
                                          class Personnage implements Movable
                                          {
                                              public function move($dest)
                                              {
                                          
                                              }
                                          }

                                          Le problème c'est que déjà mon erreur c'était pas la bonne, j'avais Fatal error: Interface 'Movable' not found in C:\wamp64\www\openclassroom\cours\php\poo\training\Personnage.php on line 3


                                          Et même en ajoutant la modification j'ai exactement la même erreur

                                          D'après ce que je comprend il est dit que mon interface 'Movable' n'est pas trouvé, or les deux fichiers sont dans le même dossier Movable.php et Personnage.php et il s'appel bien interface Movable donc je vois pas du tout d'ou peut venir le problème

                                          Si quelqu'un a une solution je suis preneur.

                                          Merci d'avance :)


                                          Puisque ton code est dans deux fichiers distincts, c'est normal que ça ne marche pas. Il faut que tu inclues ta première page dans la 2° avec require ou include.

                                          -
                                          Edité par Paul Vanderbeken 10 octobre 2019 à 11:54:45

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            10 octobre 2019 à 12:14:24

                                            Ah ben oui en effet, je sais pas pourquoi j'étais persuadé que ça marcherait sans 

                                            Merci beaucoup pour ta réponse et désolé pour une question aussi débile...

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              10 octobre 2019 à 17:42:08

                                              AnthonyDubois8 a écrit:

                                              Ah ben oui en effet, je sais pas pourquoi j'étais persuadé que ça marcherait sans 

                                              Merci beaucoup pour ta réponse et désolé pour une question aussi débile...


                                              Y a pas de quoi (ni pour le merci, ni pour le désolé) ;)
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                12 octobre 2019 à 17:15:10

                                                Patrick Bourges a écrit:

                                                Bonjour Patrick,

                                                merci pour tes encouragement et ton soutien moral. Finalement j'ai pas lâché et j'ai pu au moins afficher le frontend avec les articles. Je continu avec le backend qui marche pas encore.

                                                Pour info, j'ai utilisé le serveur local de PHP pour obtenir la page d'accueil des news.


                                                Merci.

                                                Bonjour,

                                                Pas facile effectivement ce cours pourtant, au final, je le trouve pas si mal justement parce qu'il nous oblige vraiment à tout décortiquer pour vraiment comprendre.

                                                Alors pour ta question, la réponse est trois ligne plus haut. C'est toute la méthode qu'il faut regarder ainsi que la classe HttpRequest mais surtout le fichier routes.xml.

                                                La méthode dont tu parles est la méthode execute du BackController qui est indirectement instanciée par la classe NewsController est est la suivante :

                                                    public function execute(): void
                                                    {
                                                        $method = 'execute'.ucfirst($this -> action);
                                                        if (!is_callable([$this, $method]))
                                                        {
                                                            throw new RuntimeException('L\'action "'.$this -> action.'" n\'est pas définie sur ce module');
                                                        }
                                                        else
                                                        {
                                                            $this -> $method($this -> app -> httpRequest());
                                                        }
                                                    }
                                                

                                                Imaginons que l'utilisateur clique sur la news 3 pour la visualiser, la page demandée sera donc news-3.html 

                                                Dans le fichier routes.xml on trouve

                                                <?xml version="1.0" encoding="utf-8" ?>
                                                <routes>
                                                    <route url="/" module="News" action="index"></route>
                                                    <route url="/news-([0-9]+)\.html" module="News" action="show" vars="id"></route>
                                                    <route url="/commenter-([0-9]+)\.html" module="News" action="insertComment" vars="newsId"></route>
                                                </routes>
                                                

                                                Donc, logiquement l'application va mettre sa propriété action à show pour le module News.
                                                et dans la méthode du BackControleur la variable $method devient $method = 'executeShow'

                                                C'est donc grâce à cette ligne que le NewsControlller (ici) sait qu'il doit appeler sa méthode executeShow(HttpRequest $request).

                                                Ainsi la méthode executeShows est appelée avec pour argument l'objet HttpRequest qui permet de récupérer tous les $_GET, $_POST, $_COOKIES passés en argument via la requête html.

                                                Voilà, est-ce que tu comprends un peu mieux ? Dans ton exemple, c'est l'action index qui est transmise et donc, par ce mécanisme, c'est la méthode executeIndex(http $request) qui sera appelée.

                                                Tiens nous au courant si cela te semble encore obscur.

                                                Cordialement

                                                Patrick



                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Diogo DIALLO 

                                                  12 octobre 2019 à 18:29:19

                                                  Bonjour Mamadoo,

                                                  Cela me fait plaisir d'avoir de tes nouvelles et je suis heureux que tu aies enfin réussi à démarrer et à accéder à ton application.

                                                  Pour le Backend, la réponse n'est pas forcement évidente. Et que tu n'y accède pas, c'est… normal en fait (!) il est nécessaire d'intervenir manuellement sur l'adresse dans la barre d'adresse. Je m'explique :

                                                  Normalement, une fois sur le Frontend, tu as accès aux news et uniquement un bouton accueil sur la page principale et lorsque tu visualise une news, tu ne peux qu'ajouter des news et bien sûr revenir à l'accueil. C'est bien cela ? Donc si tu as cela tout va pour le mieux.

                                                  Alors dans la barre d'adresse de ton navigateur tu doit avoir [http://]nom-du-projet et c'est tout (ce qui est entre crochet peut être affiché ou pas selon le navigateur mais peut importe, tu devrais être là.

                                                  Pour accéder au Backend il suffit d'ajouter \admin\ afin d'obtenir [http://]nom-du-projet/admin/ attention le dernier anti-slash est nécessaire. Tu valides et ho! surprise tu te retrouves sur la page qui te demande tes code d'accès [login : admin et mot de passe : mdp si tu n'as rien changé]

                                                  Une fois validé tu devrais avoir deux nouveaux boutons soit trois au total Accueil - Admin - Ajouter un article et également lorsque à partir d'accueil tu visualise une news deux nouveaux boutons Modifier Supprimer  

                                                   Une astuce, pour simplifier la manip, tu peux ajouter deux doutons dans ton layout.php

                                                  <nav>
                                                      <ul>
                                                          <li><a href="/">Accueil</a></li>
                                                          <?php if ($user -> isAuthenticated())
                                                          {
                                                              ?>
                                                              <li><a href="/admin/">Admin</a></li>
                                                              <li><a href="/admin/news-insert.html">Ajouter un article</a></li>
                                                              <li><a href="/admin/disconnect.html">Déconnexion</a></li>
                                                              <?php
                                                          }
                                                          else
                                                          {
                                                              ?>
                                                              <li><a href="/admin/">Connexion</a></li>
                                                              <?php
                                                          }
                                                          ?>
                                                      </ul>
                                                  </nav>
                                                  
                                                  

                                                  et pour que cela marche, il faut alors ajouter la route en rouge si dessus href="/admin/disconnect.html")dans le fichier route.xml du backend (attention pas du Frontend). Ce qui devrait donner : 

                                                  <?xml version="1.0" encoding="utf-8" ?>
                                                  <routes>
                                                      <route url="/admin/" module="News" action="index"></route>
                                                      <route url="/admin/news-insert.html" module="News" action="insert"></route>
                                                      <route url="/admin/disconnect.html" module="News" action="disconnect"></route>
                                                      <route url="/admin/news-update-([0-9]+)\.html" module="News" action="update" vars="id"></route>
                                                      <route url="/admin/news-delete-([0-9]+)\.html" module="News" action="delete" vars="id"></route>
                                                      <route url="/admin/comment-update-([0-9]+)\.html" module="News" action="updateComment" vars="id"></route>
                                                      <route url="/admin/comment-delete-([0-9]+)\.html" module="News" action="deleteComment" vars="id"></route>
                                                  </routes>
                                                  

                                                  Pour se connecter par contre la route existe normalement déjà. (en vert) <route url="/admin/" module="News" action="index"></route>

                                                  En espérant que cela va pouvoir d'aider à aller un peu plus loin.

                                                  Patrick



                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    14 octobre 2019 à 17:41:57

                                                    salioudiogo a écrit:

                                                    Patrick Bourges a écrit:

                                                    Bonjour Mamadou,

                                                    Cela me fait plaisir d'avoir de tes nouvelles et je suis heureux que tu aies enfin réussi à démarrer et à accéder à ton application.

                                                    Pour le Backend, la réponse n'est pas forcement évidente. Et que tu n'y accède pas, c'est… normal en fait (!) il est nécessaire d'intervenir manuellement sur l'adresse dans la barre d'adresse. Je m'explique :

                                                    Normalement, une fois sur le Frontend, tu as accès aux news et uniquement un bouton accueil sur la page principale et lorsque tu visualise une news, tu ne peux qu'ajouter des news et bien sûr revenir à l'accueil. C'est bien cela ? Donc si tu as cela tout va pour le mieux.

                                                    Alors dans la barre d'adresse de ton navigateur tu doit avoir [http://]nom-du-projet et c'est tout (ce qui est entre crochet peut être affiché ou pas selon le navigateur mais peut importe, tu devrais être là.

                                                    Pour accéder au Backend il suffit d'ajouter \admin\ afin d'obtenir [http://]nom-du-projet/admin/ attention le dernier anti-slash est nécessaire. Tu valides et ho! surprise tu te retrouves sur la page qui te demande tes code d'accès [login : admin et mot de passe : mdp si tu n'as rien changé]

                                                    Une fois validé tu devrais avoir deux nouveaux boutons soit trois au total Accueil - Admin - Ajouter un article et également lorsque à partir d'accueil tu visualise une news deux nouveaux boutons Modifier Supprimer  

                                                     Une astuce, pour simplifier la manip, tu peux ajouter deux doutons dans ton layout.php

                                                    <nav>
                                                        <ul>
                                                            <li><a href="/">Accueil</a></li>
                                                            <?php if ($user -> isAuthenticated())
                                                            {
                                                                ?>
                                                                <li><a href="/admin/">Admin</a></li>
                                                                <li><a href="/admin/news-insert.html">Ajouter un article</a></li>
                                                                <li><a href="/admin/disconnect.html">Déconnexion</a></li>
                                                                <?php
                                                            }
                                                            else
                                                            {
                                                                ?>
                                                                <li><a href="/admin/">Connexion</a></li>
                                                                <?php
                                                            }
                                                            ?>
                                                        </ul>
                                                    </nav>
                                                    
                                                    

                                                    et pour que cela marche, il faut alors ajouter la route en rouge si dessus href="/admin/disconnect.html")dans le fichier route.xml du backend (attention pas du Frontend). Ce qui devrait donner : 

                                                    <?xml version="1.0" encoding="utf-8" ?>
                                                    <routes>
                                                        <route url="/admin/" module="News" action="index"></route>
                                                        <route url="/admin/news-insert.html" module="News" action="insert"></route>
                                                        <route url="/admin/disconnect.html" module="News" action="disconnect"></route>
                                                        <route url="/admin/news-update-([0-9]+)\.html" module="News" action="update" vars="id"></route>
                                                        <route url="/admin/news-delete-([0-9]+)\.html" module="News" action="delete" vars="id"></route>
                                                        <route url="/admin/comment-update-([0-9]+)\.html" module="News" action="updateComment" vars="id"></route>
                                                        <route url="/admin/comment-delete-([0-9]+)\.html" module="News" action="deleteComment" vars="id"></route>
                                                    </routes>
                                                    

                                                    Pour se connecter par contre la route existe normalement déjà. (en vert) <route url="/admin/" module="News" action="index"></route>

                                                    En espérant que cela va pouvoir d'aider à aller un peu plus loin.

                                                    Patrick



                                                    Bonjour Patrick,

                                                    je reviens encore vers toi et les autres pour savoir si vous avez rencontrer cette erreur lors de la saisie d'un article ?

                                                    Fatal error: Uncaught TypeError: Argument 1 passed to Model\CommentManager::save() must be an instance of Entity\Comment, instance of Entity\News given, called in 

                                                    Je comprends ce qui est dit mais je ne trouve pas le fichier a modifier. 

                                                    Merci d'avance

                                                    -
                                                    Edité par salioudiogo il y a moins de 5s



                                                    -
                                                    Edité par salioudiogo 15 octobre 2019 à 2:01:06

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Diogo DIALLO 

                                                      15 octobre 2019 à 10:09:58

                                                      Bonjour,

                                                      le fichier se trouve : lib/Vendors/Model/CommentsManager.php

                                                      l'argument passer a la method save($comment) de la class 'CommentManager' doit etre une instance de la class 'Comment' qui se trouve: lib/Vendors/Entity/Comment.php (ca c'est le message).

                                                      1.le depart de l'action save() un commentaire se trouve dans la class NewsControler.php du front-end si on ajoute un commentaire soit NewsControler.php du back-end si on modifie un commentaire.

                                                         a.dans le f-end on a la method : executeInsertComment(HTTPRequest $request) //se trouve ds app/frontend/Module/news

                                                         b.dans le B-end : executeUpdateComment(HTTPRequest $request) //se trouve ds app/backend/Module/news

                                                      2.dans chacune de ces method il y a la class FormHandler instanciee de cette maniere : 

                                                      $formHandler = new \OCFram\FormHandler($form, $this->managers->getManagerOf('Comments'), $request);

                                                      qui ensuite (la class 'FormHandler') appel sa method 

                                                      if ($formHandler->process())
                                                          {

                                                      et dans cette method se trouve l'appel a save()

                                                      public function process()
                                                        {
                                                          if($this->request->method() == 'POST' && $this->form->isValid())
                                                          {
                                                            $this->manager->save($this->form->entity());
                                                      
                                                            return true;
                                                          }
                                                      
                                                          return false;
                                                        }


                                                      Ces class se trouvent dans lib/OCFram.

                                                      Vois par la, mais l'erreur peut venir d'ailleurs puisque est ce que '$this->form->entity()' est bien implemente ?, par exemple...

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        15 octobre 2019 à 12:35:26

                                                        thanks for the share this information !!
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          15 octobre 2019 à 17:02:10

                                                          Bonjour Diogo DIALLO

                                                          Fatal error: Uncaught TypeError: Argument 1 passed to Model\CommentManager::save() must be an instance of Entity\Comment, 
                                                          instance of Entity\News given, called in ????

                                                          Désolé j'ai bien vu ton message hier mais je n'avais, curieusement pas la fin du message (ce que tu as ajouté) aussi je n'ai pas bien compris. Aujourd'hui, elle apparaît.

                                                          Je connais bien l'erreur que tu signales. Il s'agit d'une erreur de type. Il est dommage que tu n'aies pas mis la fin du message d'erreur. Cela arrive lorsqu'il y a une erreur de type au niveau du paramètre passé à la méthode (qui doit être nommée avec la ligne) dans la suite du message d'erreur. Mais, je ne comprends pas bien tu dis avoir voulu enregistré une nouvelle news alors pourquoi est-ce la méthode save de comentManager qui est appelée, c'est curieux.

                                                          Si tu en es là, c'est que tu a pu accéder au backend et si c'est suite à la réponse que je t'avais faites, il aurait été bien de me le dire. C'est utile pour moi bien sûr mais aussi pour tous ceux qui consulltent ce forum.

                                                          A ce sujet, je t'avais proposé de modifier ton layout.php afin de rendre le site connectable et déconnectable. Mais j'ai oublié de te donner la méthode de déconnection executeDisconnect à ajouter dans NewsController du backend. Je corrige donc imédiatement cet oubli :

                                                              public function executeDisconnect(HTTPRequest $request)
                                                              {
                                                                  $this->app->user()->setAuthenticated(false);
                                                                  $this->app->user()->setFlash('Vous êtes déconnecté.');
                                                                  $this->app->httpResponse()->redirect('/');
                                                              }

                                                          Si ton erreur se reproduit peux tu me communiquer le message d'erreur complet ainsi que la pile d'appels qui doit normalement être décrite en dessous.

                                                          Je te remercie et à bientôt

                                                          Patrick



                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            15 octobre 2019 à 17:38:35

                                                            djedjethai a écrit:

                                                            Bonjour,

                                                            le fichier se trouve : lib/Vendors/Model/CommentsManager.php

                                                            l'argument passer a la method save($comment) de la class 'CommentManager' doit etre une instance de la class 'Comment' qui se trouve: lib/Vendors/Entity/Comment.php (ca c'est le message).

                                                            1.le depart de l'action save() un commentaire se trouve dans la class NewsControler.php du front-end si on ajoute un commentaire soit NewsControler.php du back-end si on modifie un commentaire.

                                                               a.dans le f-end on a la method : executeInsertComment(HTTPRequest $request) //se trouve ds app/frontend/Module/news

                                                               b.dans le B-end : executeUpdateComment(HTTPRequest $request) //se trouve ds app/backend/Module/news

                                                            2.dans chacune de ces method il y a la class FormHandler instanciee de cette maniere : 

                                                            $formHandler = new \OCFram\FormHandler($form, $this->managers->getManagerOf('Comments'), $request);

                                                            qui ensuite (la class 'FormHandler') appel sa method 

                                                            if ($formHandler->process())
                                                                {

                                                            et dans cette method se trouve l'appel a save()

                                                            public function process()
                                                              {
                                                                if($this->request->method() == 'POST' && $this->form->isValid())
                                                                {
                                                                  $this->manager->save($this->form->entity());
                                                            
                                                                  return true;
                                                                }
                                                            
                                                                return false;
                                                              }


                                                            Ces class se trouvent dans lib/OCFram.

                                                            Vois par la, mais l'erreur peut venir d'ailleurs puisque est ce que '$this->form->entity()' est bien implemente ?, par exemple...

                                                            Merci beaucoup djedjethai pour le temps que tu m'as consacrer. Le problème est résolu. Et merci a tous ceux qui m'ont consacrer leur temps en général et Patrick en particulier.



                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Diogo DIALLO 

                                                              15 octobre 2019 à 18:24:12

                                                              Bonjour tout le monde :)

                                                              Je suis actuellement le MOOC sur la programmation orientée objet, après avoir suivi ceux sur PHP/MySQL et l'architecture MVC.

                                                              J'en suis à ce chapitre: https://openclassrooms.com/fr/courses/1665806-programmez-en-oriente-objet-en-php/1666289-manipulation-de-donnees-stockees , et je suis bloqué: j'ai scrupuleusement reproduit le code qui est montré, mais quand j'essaye ceci:

                                                              <?php
                                                              // On admet que $db est un objet PDO.
                                                              $request = $db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages');
                                                                  
                                                              while ($donnees = $request->fetch(PDO::FETCH_ASSOC)) // Chaque entrée sera récupérée et placée dans un array.
                                                              {
                                                                // On passe les données (stockées dans un tableau) concernant le personnage au constructeur de la classe.
                                                                // On admet que le constructeur de la classe appelle chaque setter pour assigner les valeurs qu'on lui a données aux attributs correspondants.
                                                                $perso = new Personnage($donnees);
                                                                      
                                                                echo $perso->nom(), ' a ', $perso->forcePerso(), ' de force, ', $perso->degats(), ' de dégâts, ', $perso->experience(), ' d\'expérience et est au niveau ', $perso->niveau();
                                                              }

                                                              Plutôt que la méthode classique:

                                                              <?php
                                                              // On admet que $db est un objet PDO
                                                              $request = $db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages');
                                                                  
                                                              while ($perso = $request->fetch(PDO::FETCH_ASSOC)) // Chaque entrée sera récupérée et placée dans un array.
                                                              {
                                                                echo $perso['nom'], ' a ', $perso['forcePerso'], ' de force, ', $perso['degats'], ' de dégâts, ', $perso['experience'], ' d\'expérience et est au niveau ', $perso['niveau'];
                                                              }

                                                              les valeurs des champs de la table ne s'affichent pas.

                                                              C'est vraiment bizarre, car avec la méthode classique tout fonctionne bien; ce n'est donc pas un souci de connexion à la BDD.

                                                              Y aurait-il quelque chose que j'ai zappé ?

                                                              D'avance merci pour votre aide :)


                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              MOOC Programmez en orienté objet en PHP

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