Partage
  • Partager sur Facebook
  • Partager sur Twitter

[TUTO] MVC, bonnes pratiques et site complet !

Espace membres - À venir : livre d'or, news, etc.

    11 janvier 2009 à 23:42:31

    J'aurais besoin de quelqu'un pour bêta-tester le système de connexion automatique. J'enverrai le tutoriel à la validation à nouveau après cet ajout ! ;)
    Envoyez-moi un MP, ne polluez pas le sujet, merci.
    • Partager sur Facebook
    • Partager sur Twitter
      13 janvier 2009 à 22:24:34

      Salutations,

      Bon déja un ptit mot pour dire que je trouve le tuto sympa dans on ensemble, avec des bons conseils et des idées bien sympathique, comme la class Form.

      Pour continuer sur la class Form, je trouve donc l'idée sympa mais je trouve un peu dommage de devoir déclarer 2 fois la structure du formulaire. Bon ok j'admets c'est pas compliqué mais bon c'est le principe qui me chiffonne un peu, alors je me demandai si il etait pas possible d'ajouter un champ de type hidden lors de l'appel a __toString du formulaire pour ajouter un champ contenant la structure du formulaire avec un appel a serialize ?
      Enfin je dis ca j'ai pas testé et ca se trouve c'est plus lent ... mais bon c'est juste une idée quoi :D

      Citation : Nanocom

      Pour utiliser le pattern singleton avec la classe SPDO proprement : http://www.apprendre-php.com/tutoriels [...] rant-pdo.html


      Euuh j'ai ptet pas tout compris mais du coup la tu es obligé de redéfinir toutes les fonctions que tu veux utiliser ? o_O
      Bon ca peut etre cool mais si j'ai pas envie est ce que j'aurai pas mieux a faire de mettre le new PDO directement dans self::$instance ?

      @ Peluche :)
      • Partager sur Facebook
      • Partager sur Twitter
        13 janvier 2009 à 22:28:03

        Merci pour les encouragements, ça fait plaisir ! ;)

        Citation : Onime no Kyo

        je trouve un peu dommage de devoir déclarer 2 fois la structure du formulaire


        Hum... On ne déclare qu'une fois la structure du formulaire, de quoi parles-tu ? Quel est le rapport avec serialize() ?

        Non, SPO est bien codé, tout va bien à ce niveau, ne t'inquiètes pas ! ^^
        • Partager sur Facebook
        • Partager sur Twitter
          13 janvier 2009 à 23:00:20

          Citation : Onime no Kyo


          Citation : Nanocom

          Pour utiliser le pattern singleton avec la classe SPDO proprement : http://www.apprendre-php.com/tutoriels [...] rant-pdo.html


          Euuh j'ai ptet pas tout compris mais du coup la tu es obligé de redéfinir toutes les fonctions que tu veux utiliser ? o_O
          Bon ca peut etre cool mais si j'ai pas envie est ce que j'aurai pas mieux a faire de mettre le new PDO directement dans self::$instance ?

          @ Peluche :)



          Et oui en effet tu dois ajouter toutes les méthodes de PDO à ta class SPDO ... pas très pratique.
          Essaie en remplaçant la ligne
          return self::$instance;
          par
          return self::$PDOinstance;
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            13 janvier 2009 à 23:08:21

            Si tu ne veux pas redéfinir toutes les méthodes de PDO alors tu peux toujours faire hériter ta classe SPDO avec la classe PDO
            • Partager sur Facebook
            • Partager sur Twitter
              13 janvier 2009 à 23:15:54

              Je pense que la classe SPDO a un problème : c'est self::$PDOinstance qui nous intéresse, pas self::$instance... (je me demande même ce que self::$instance vient faire ici...).

              [edit] Re-validation du tutoriel aujourd'hui avec corrections de tous les bugs que l'on m'a signalé (du moins j'espère) ainsi que l'ajout de la connexion automatique !

              Certaines fonctions ont changé.
              </span>
              • Partager sur Facebook
              • Partager sur Twitter
                14 janvier 2009 à 0:13:36

                Yeah, à mon tour de venir pourrir le topic. Ou pas.

                Pour l'avis (flemme d'écrire un commentaire), tu le connais je pense (bien, chouette, toussa toussa) :].

                Pour revenir sur une extension de PDO : Non, pas besoin de redéfinir toutes les méthodes... Par contre, si on veut coller aux standards stricts de PHP (via un petit <?php error_reporting(E_ALL | E_STRICT); ), il faut avoir exactement la même signature que l'originale... Jusqu'au noms des attributs (je me suis fait avoir très longtemps comme ça, je pense que Savageman peut en témoigner §§) !
                • Partager sur Facebook
                • Partager sur Twitter
                Mon profil Github - Zeste de Savoir, pour la beauté du zeste
                  14 janvier 2009 à 10:33:48

                  Citation : Savageman


                  Citation : Onime no Kyo

                  je trouve un peu dommage de devoir déclarer 2 fois la structure du formulaire


                  Hum... On ne déclare qu'une fois la structure du formulaire, de quoi parles-tu ? Quel est le rapport avec serialize() ?


                  Ah ué, j'avais lu un peu vite le truc et du coup j'avais pas bien saisi le fonctionnement de la chose. Mea Culpa :)

                  @balzard :
                  J'ai déjà fais :) . En fait mon message c'était plus pour savoir si j'étais le seul a trouver le fonctionnement de SPDO un peu euh ... bancal ? (Enfin c'est pas vraiment bancal mais bon si on veut juste se contenter du singleton ça l'est [enfin ... a mon avis :p ]). Mais merci quand même ;) .

                  @Talus :
                  Euuh pas tout compris, peux tu approfondir stp ?


                  @ Peluche :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 janvier 2009 à 10:37:55

                    Citation : Onime no Kyo

                    @Talus :
                    Euuh pas tout compris, peux tu approfondir stp ?


                    Va sur son blog y'a plus de détails ! : http://blog.talus-works.net/
                    Mais en effet ce genre d'info meriteraient d'être explicitées plus clairement et avec encore plus de détails ;)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Si y'a pas d'accents dans mes messages c'est parce que je suis sur un clavier norvegien :)

                      14 janvier 2009 à 21:54:38

                      Vous pouvez remercier S0pra qui s'est penché longuement sur la classe Form et m'a signalé un certain nombre de bugs. Je vous conseille vivement de la re-télécharger et de remplacer votre fichier actuel form.php afin d'avoir une meilleur base ! :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 janvier 2009 à 22:31:43

                        Apres avoir mis à jour la class Form comme stiplué ci-dessus, une erreur subsiste :)

                        Fatal error: Call to undefined method Form_File::extensions()

                        Erreur apparu avec ce code:
                        <?php
                        $form->add("File", "avatar")->max_size(1024000)->extensions(array("png"))->label("Logo/image");
                        ?>



                        [Edit]
                        Une question persiste: Pour les champ Hidden, comment inserer une valeur ?

                        Citation : Code : PHP - Ajout d'un champ caché à $mon_form



                        <?php
                        // Ajout d'un champ cache nommé "secret"
                        $mon_form->add('Hidden', 'secret');
                        
                        ?>





                        ca je comprends bien, mais comment inserer l'attribut value ?

                        Merci :)


                        [Re: Edit]

                        En lisant la class "Form", j'ai trouver la reponse à ma question. Je la post, ca peut toujours aider ;)

                        <?php
                        $form->add("Hidden", "id")->value($id);
                        ?>


                        Voilà, il suffit de faire appel à la methode "value";
                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 janvier 2009 à 23:36:54

                          Parfait tout marche :)


                          Merci, Karsen.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 janvier 2009 à 19:27:15

                            Salut déjà merci pour avoir créer ce tutoriel, je comprends maintenant comment fonctionnent les sites :p . J'ai cependant quelques problèmes :
                            Config : Wampserver
                            Version de Apache:
                            2.2.11
                            Version de PHP:
                            5.2.8
                            Version de MySQL:
                            5.1.30

                            Alors je poste quelques erreurs que j'ai :
                            modeles/membres.php
                            <?php
                            function lire_infos_utilisateur($id_utilisateur) {
                            
                                    $pdo = PDO2::getInstance();
                            
                                    $requete = $pdo->prepare("SELECT id, nom_utilisateur, mot_de_passe, adresse_email, avatar, date_inscription, hash_validation
                                            FROM membres
                                            WHERE
                                            id = :id_utilisateur");
                            ?>

                            J'ai été obligé de rajouter id pour SELECT id.

                            modifier_profil.php : j'obtiens l'erreur suivante 2 fois
                            Warning: Invalid argument supplied for foreach() in C:\wamp\www\Site web\www\Site Voiture\libs\form.php on line 244
                            Seuls les inputs du type submit s'affichent

                            afficher_profil.php : j'obtiens les erreurs suivantes :
                            Notice: Undefined offset: 4 in C:\wamp\www\Site web\www\Site Voiture\modules\membres\afficher_profil.php on line 24

                            Notice: Undefined offset: 3 in C:\wamp\www\Site web\www\Site Voiture\modules\membres\afficher_profil.php on line 24

                            Notice: Undefined offset: 2 in C:\wamp\www\Site web\www\Site Voiture\modules\membres\afficher_profil.php on line 24

                            Notice: Undefined offset: 0 in C:\wamp\www\Site web\www\Site Voiture\modules\membres\afficher_profil.php on line 24


                            Elles n'apparaissent plus si j'utilise
                            $nom_utilisateur=$infos_utilisateur['nom_utilisateur'];
                            $adresse_email=$infos_utilisateur['adresse_email'];
                            $date_inscription=$infos_utilisateur['date_inscription'];

                            Pourtant d'après http://fr2.php.net/manual/fr/function.list.php ta fonction est parfaitement utilisée alors bizarre o_O
                            Sinon une question pour la suite, pour ton TP livre d'or comptes-tu utiliser un captcha ? sinon il serait intéressant de l'ajouter à ta classe Form.php
                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 janvier 2009 à 20:02:57

                              Bof, suffit de rajouter un champ de type texte pour contenir le code, et en tant que label, spécifier une image... ou le captcha en lui meme (car un captcha n'est pas forcément une image, après tout !).
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Mon profil Github - Zeste de Savoir, pour la beauté du zeste
                                19 janvier 2009 à 20:05:26

                                Pour modifier_profil, c'est que la définition des fieldsets n'est pas bonne.
                                $form_modif_infos->fieldsets("Modification de l'e-mail et de l'avatar", array('adresse_email', 'suppr_avatar', 'avatar'));
                                à remplacer par :
                                $form_modif_infos->fieldsets("Modification de l'e-mail et de l'avatar" => array('adresse_email', 'suppr_avatar', 'avatar'));

                                Pour l'erreur de list(), c'est... louche. :/ Je ne vois pas trop quoi faire...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  19 janvier 2009 à 20:30:05

                                  Bon je continue sur les bugs que j'ai (rooh le vilain ;) )
                                  modifier_profil.php
                                  erreur : Fatal error: Call to undefined method Form_Submit::initial() in C:\wamp\www\Site web\www\Site Voiture\modules\membres\modifier_profil.php on line 33
                                  ligne incriminée : ->initial("Modifier ces informations !");
                                  solution : j'ai remplacé initial par value tout simplement, même erreur pour le formulaire suivant

                                  Pour la fonction list il faudrait savoir si ça le fait que chez moi, si ca vient de wamp, je vais le mettre a jour (s'il y en a une) EDIT: j'ai la version la plus récente.

                                  modifier_profil.php
                                  : j'obtiens l'erreur suivante 2 fois
                                  Warning: Invalid argument supplied for foreach() in C:\wamp\www\Site web\www\Site Voiture\libs\form.php on line 244
                                  Seuls les inputs du type submit s'affichent

                                  tu m'as répondu cependant il n'y a pas de code ressemblant a $form_modif_infos->fieldsets :o
                                  j'ai seulement fait un copier coller de ton code.
                                  Merci pour ta rapidité de réponse.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    19 janvier 2009 à 20:35:33

                                    Moi, j'aurais bien aidé, mais le code source est inbuvable...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 janvier 2009 à 20:55:20

                                      J'obtiens une erreur de parsage
                                      Parse error: parse error in C:\wamp\www\Site web\www\Site Voiture\modules\membres\vues\formulaires_modifier_profil.php on line 29
                                      EDIT: j'a carrément enlevé les lignes
                                      $form_modif_infos->fieldsets("Modification de l'e-mail et de l'avatar" , array('adresse_email', 'suppr_avatar', 'avatar'));
                                      et
                                      $form_modif_mdp->fieldsets("Modification du mot de passe" , array('mdp_ancien', 'mdp', 'mdp_verif'));
                                      tout s'affiche, je vais voir s'il n'y a pas de probleme d'enregistrement
                                      EDIT2: En fait j'ai pas encore écrit les fonction pour les mises à jour XD, je fais ca et je renvoie un message
                                      EDIT3:Non ca ne marche pas :(
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        19 janvier 2009 à 21:08:52

                                        Bravo pour ton tuto,

                                        ajoute une messagerie ou autre.

                                        et bonne chance
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          19 janvier 2009 à 21:55:17

                                          Bonsoir,
                                          Moi je rencontre un petit problème avec les checkbox, aucun label n'apparait en utilisant ce code :
                                          <?php
                                          $form_modif_infos->add('Checkbox', 'suppr_avatar')
                                                           ->label("Je veux supprimer mon avatar")
                                                           ->Required(false);
                                          

                                          Pas très pratique pour avoir à quoi correspond une case à cocher sans texte :p .


                                          Sinon j'ai rencontré le même problème avec les list(), la doc php nous apprend que list ne fonctionne que sur des tableaux numéroté commençant à 0.
                                          Donc pour retourner un tableaux numéroté avec PDO, utilisé la constante PDO::FETCH_NUM (et attention de ne pas planter les autres scripts si vous modifiez ^^ ).

                                          Maintenant quelques erreurs relevée dans la partie sur le profil.
                                          - Partie "Fonctions du modèle membres"
                                          Tu parles de la fonction maj_email_membre à créer mais dans le script tu utilises maj_adresse_email_membre.
                                          - Partie ~/modules/membres/modifier_profil.php
                                          Peut-être mettre les formulaires en POST
                                          A la ligne 101 du script, la fonction emty n'existe pas :) .

                                          Pour finir une petite question, comment faire pour récupérer plusieurs entrées dans la bdd toujours avec des fonctions dans les modèles ?
                                          Car pour le moment on a toujours récupéré une seule donnée qu'on retourne directement.

                                          Et merci pour ce big-tuto qui apprend pas mal de choses ^^ .

                                          Lorexe

                                          PS : Je n'avais pas vu ce topic au début alors j'ai posté dans les commentaires pour signaler quelques bugs (lien).
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            20 janvier 2009 à 2:14:42

                                            salut

                                            et tout simplement super :D

                                            enfin une suite au php de m@teo, bon balaize mais sa devrait passer

                                            en relisent des centaines de fois ^^ , vraiment bien

                                            vivement la suite

                                            juste une question:
                                            on peux dir que MVC et une alternative au Template ?
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Tout se sait un jour, il suffit de l'apprendre !
                                              20 janvier 2009 à 2:52:43

                                              [tonydu76]

                                              Le MVC n'est pas du tout une alternative au template, bien au contraire, tu peux coupler une architecture MVC AVEC un moteur de TPL et cela sans probleme.
                                              Il te suffit simplement de revoir ton FS pour que tout tes templates (ou tes vues) soit dans le même dossier.

                                              Exemple:

                                              ./templates/
                                              news/
                                              lire_news.tpl
                                              liste_news.tpl
                                              livreor/
                                              liste_messages.tpl
                                              ajouter_message.tpl

                                              ./templates_c/
                                              news/
                                              lire_news_compiled.php
                                              liste_news_compiled.php
                                              livreor/
                                              liste_messages_compiled.php
                                              ajouter_message_compiled.php


                                              Bref tu as compris je pense ;)


                                              [savageman]

                                              J'ai trouvé une nouvelle erreur (si on peut appeler ca comme ca), je ne parviens pas ajouter une valeur aux textarea:

                                              <?php
                                              $form->add("Textarea", "description")->value($fav['description'])->label("Description");
                                              ?>
                                              


                                              cela marche tres bien si j'utilise un champ "Text" mais pas avec un champ "Textarea"

                                              Voila :)

                                              Bon courage pour la suite, continue c'est vraiment plaisant à lire.

                                              Peace, Karsen.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                20 janvier 2009 à 11:17:57

                                                Citation : Lyrke


                                                Pas très pratique pour avoir à quoi correspond une case à cocher sans texte :p .



                                                Il y avait une petite faute de frappe dans le fichier libs/form.php (il a été mis à jour récemment je crois car je ne la vois plus :p ) mais vérifie que ton code form.php contienne bien


                                                class Form_Checkbox extends Form_Input {
                                                
                                                    public function __construct($name, $form) {
                                                
                                                        parent::__construct($name, $form);
                                                        $this->attrs['type'] = 'checkbox';
                                                    }
                                                
                                                    function __toString($tab = '') {
                                                
                                                        $this->_generate_class();
                                                
                                                        $id = '';
                                                        if (!empty($this->label)) {
                                                
                                                            list($for, $id) = self::_generate_for_id($this->form->auto_id(), $this->attrs['name']);
                                                            $label = "\n$tab".'<label'.$for.'>'.$this->label.'</label>';
                                                        }
                                                        $errors = $this->error_messages->__toString($tab);
                                                        if (!empty($errors)) { $errors = "\n".$errors; }
                                                
                                                        $checked = '';
                                                        ('on' == $this->form->get_bounded_data($this->attrs['name']) && $checked = ' checked="checked"');
                                                
                                                        $field = '<input'.$id.$this->attrs.$checked.' />';
                                                        return $tab.sprintf("%1\$s%2\$s%3\$s", $field, $label, $errors);
                                                    }
                                                }
                                                

                                                Le problème se situait aux alentours de la ligne 23.
                                                Le plus simple si tu ne vois pas directement est d'interchanger le code de ta classe par celui-ci (il fonctionne chez moi :-° )

                                                Pour les problèmes de textarea,

                                                essayer de remplacer la ligne de code ci-dessous (elle se trouve dans la class form_textarea, ligne 1033)
                                                $value = htmlspecialchars($this->form->get_bounded_data($this->attrs['name']));
                                                par

                                                $value = $this->form->get_bounded_data($this->attrs['name']);
                                                            $value = (!empty($value)) ? $value : $this->value;
                                                            $value = (!empty($value)) ? htmlspecialchars($value).'' : '';
                                                


                                                Chez moi ca fonctionne ^^



                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  20 janvier 2009 à 15:05:24

                                                  J'ai un problème, dans le chapitre objectifs et préparations, tu mets une table SQl
                                                  CREATE TABLE `membres` (
                                                  
                                                  	`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
                                                  	`nom_utilisateur` VARCHAR( 32 ) NOT NULL ,
                                                  	`mot_de_passe` CHAR( 40 ) NOT NULL ,
                                                  	`adresse_email` VARCHAR( 128 ) NOT NULL ,
                                                  	`hash_validation` CHAR( 32 ) NOT NULL ,
                                                  	`date_inscription` DATE NOT NULL ,
                                                  	`avatar` VARCHAR( 128 ) NOT NULL DEFAULT '',
                                                  
                                                  	PRIMARY KEY ( `id` ) ,
                                                  
                                                  	INDEX ( `mot_de_passe` ) ,
                                                  
                                                  	UNIQUE ( `nom_utilisateur` ) ,
                                                  
                                                  	UNIQUE ( `adresse_email` ) ,
                                                  
                                                  	)
                                                  
                                                  ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci
                                                  


                                                  phpadmin me mets une erreur !
                                                  #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')


                                                  C'est quoi le probleme ? :(
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    20 janvier 2009 à 16:23:14

                                                    Une parenthèse de trop ? :)
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Mon profil Github - Zeste de Savoir, pour la beauté du zeste
                                                      20 janvier 2009 à 16:48:30

                                                      Merci pour les Checkbox ^^

                                                      Pout le sql :
                                                      CREATE TABLE `membres` (
                                                      
                                                      	`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
                                                      	`nom_utilisateur` VARCHAR( 32 ) NOT NULL ,
                                                      	`mot_de_passe` CHAR( 40 ) NOT NULL ,
                                                      	`adresse_email` VARCHAR( 128 ) NOT NULL ,
                                                      	`hash_validation` CHAR( 32 ) NOT NULL ,
                                                      	`date_inscription` DATE NOT NULL ,
                                                      	`avatar` VARCHAR( 128 ) NOT NULL DEFAULT '',
                                                      
                                                      	PRIMARY KEY ( `id` ) ,
                                                      
                                                      	INDEX ( `mot_de_passe` ) ,
                                                      
                                                      	UNIQUE ( `nom_utilisateur` ) ,
                                                      
                                                      	UNIQUE ( `adresse_email` )
                                                      
                                                      ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci
                                                      

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      [TUTO] MVC, bonnes pratiques et site complet !

                                                      × 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