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