Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour tous le monde;
Comme je m'autoforme sur Zend Framwork, j'ai trouvé sur la toile une application bien faite. J'arrive à l'installer et de la faire tourner sur mon localhost. J'essai maintenant à décortiquer le code mais je me trouve coincer sur le faite comment il insére les données dans la base de données je dis bien quand je fais des tests d'insertion cela marche à merveille. Il s'agit d'ajout d'un User. Alors quand je me suis rendu sur la classe Model_DbTable_Users biensur qui se trouve model\DbTable\users.php elle completement vide.
<?php class Model_DbTable_Users extends Zend_Db_Table_Abstract { protected $_name = "users"; } ?>
et dans UserController.php j'ai ce code
public function registerAction() { $form = new Model_Form_UserRegister ( ); $this->view->form = $form; if ($this->_request->isPost ()) { $formData = $this->_request->getPost (); if ($form->isValid ( $formData )) { $datas = $formData; unset($datas['submit']); unset($datas['password2']); unset($datas['cgv']); $datas['password'] = md5($datas['password']); $email = $datas['email']; $datas = array_map('strtolower', $datas); $datas = array_map('ucwords', $datas); $datas['email'] = $email; $Users = new Model_DbTable_Users(); $Users->insert($datas); /* $mail = new Zend_Mail(); $mail->setBodyHtml('Nous avons bien pris en compte votre inscription au site'); $mail->setFrom($email, 'TP1-Ecommerce'); $mail->addTo($email); $mail->setSubject('Bienvenue sur TP1-Ecommerce'); $mail->send();*/ $email = $form->getValue('email'); $password = $form->getValue('password'); $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter()); $authAdapter->setTableName('users') ->setIdentityColumn('email') ->setCredentialColumn('password') ->setCredentialTreatment('MD5(?)') ->setIdentity($email) ->setCredential($password); $authAuthenticate = $authAdapter->authenticate(); $storage = Zend_Auth::getInstance()->getStorage(); $storage->write($authAdapter->getResultRowObject(null, 'password')); $session = Zend_Registry::get('session'); $session->panier = new Model_Panier_Panier(); if ($this->addToCartTemp()) { return $this->_helper->redirector('index','panier'); } $this->_helper->redirector('index','index'); } } }
Le formulaire est composé des éléments suivant :
UserRegister.php
<?php class Model_Form_UserRegister extends Zend_Form { public function init() { $this->setName ( 'UserRegister' ); $this->setAction('../user/register'); $email = new Model_Form_EText ( 'email', 'Email : ' ); $email->addValidator ( 'EmailAddress' )->addValidator(new Zend_Validate_Db_NoRecordExists('users','email')); $password = new Zend_Form_Element_Password ( 'password' ); $password->setLabel ( 'Mot de passe : ')->addFilter ( 'StripTags' )->addFilter ( 'StringTrim' )->setRequired ( true ); $password2 = new Zend_Form_Element_Password ( 'password2' ); $password2->setLabel ( 'Vérification du mot de passe : ' )->addFilter ( 'StripTags' )->addFilter ( 'StringTrim' ); $nom = new Model_Form_EText ( 'nom', 'Nom : ' ); $prenom = new Model_Form_EText ( 'prenom', 'Prénom : ' ); $adresse = new Model_Form_EText ( 'adresse', 'Adresse : ' ); $codePostale = new Model_Form_EText ( 'codePostale', 'Code Postale : ' ); $codePostale->addValidator(new Zend_Validate_Regex('#[0-9]{2} ?[0-9]{3}#')); $ville = new Model_Form_EText ( 'ville', 'Ville : ' ); $telMobile = new Model_Form_EText ( 'telMobile', 'Numéro de téléphone mobile : ' ); $telMobile->setRequired(false)->addValidator('Digits')->addValidator(new Zend_Validate_StringLength(10)); $telFixe = new Model_Form_EText ( 'telFixe', 'Numéro de téléphone fixe : ' ); $telFixe->setRequired(false)->addValidator('Digits')->addValidator(new Zend_Validate_StringLength(10)); $newsletter = new Zend_Form_Element_Checkbox('newsletter'); $newsletter->setLabel('En cochant cette case, je m\'abonne à la newsletter'); $cgv = new Zend_Form_Element_Checkbox('cgv'); $cgv ->setLabel('En cochant cette case, j\'accepte les CGV')->setRequired(true); $submit = new Zend_Form_Element_Submit ( 'submit' ); $submit->setAttrib ( 'class', 'submitbutton' )->setLabel ( 'Continuer' )->setAttrib('class', 'submit'); $elements = array ($email, $password, $password2, $nom, $prenom, $adresse,$codePostale,$ville,$telMobile,$telFixe,$newsletter,$cgv ,$submit ); $this->addElements ( $elements ); }
Est ce que cette ligne $formData = $this->_request->getPost (); est un tableau qui contient tous les champs à inserer dans la table users ? Est ce que c'est facon pour proteger mes champs contre toutes les intrusions malveillantes?
Merci de m'éclairer ce qui se passe.
Hors ligne
Alors ça c'est pas une bonne pratique déjà pour commencer!
if ($this->_request->isPost ()) { $formData = $this->_request->getPost (); if ($form->isValid ( $formData )) { $datas = $formData;
Le fait de récupérer directement les données $_POST : $datas = $formData;
Alors que quand tu valides ton formulaire juste avant, les données sont vérifiées et filtrées si tu as mit des filtres dans ton formulaire.
Je te conseille donc de récupérer les données validées comme suit:
if ($this->_request->isPost ()) { $formData = $this->_request->getPost (); if ($form->isValid ( $formData )) { $datas = $form->getValues();
Ensuite pour l'insertion, rien de compliqué dans ton exemple.
C'est fait comme ceci:
$Users = new Model_DbTable_Users(); $Users->insert($datas);
L'insertion se fait via Zend_Db_Table, les données sont protégées avant leur insertion en base.
Par contre, tu fais un ucwords sur toutes les données, y compris le MD5 de ton mot de passe, c'est pas très propre comme procédé. Le mieux serait de faire du cas par cas. Je dit ça, je dit rien... c'est un conseil !
Dernière modification par Roromix (23-03-2012 09:22:12)
Hors ligne
Merci beaucoup pour l'éclaircissement. et pour le conseil. je testerai et je reveindrais.
Hors ligne
C'est la classe Zend_Db_Table qui s'occupe des opérations CRUD.
Dernière modification par yelmontaser (24-03-2012 13:08:54)
Hors ligne
De retour. Un grand merci pour vous . Maintenant j'ai bien compris le processus d'ajout des données auprès du zend. D'abord la récupération des données à par d'un formulaire et l'appel du controlleur d'ajout qui lui aussi appelle la classe Zend_Db_Table pour l'insertion. J'essai de m'autoformer sur Zend s'il y a queque chose qui m'échape je reviendrais chez vous.
Hors ligne
Alors que quand tu valides ton formulaire juste avant, les données sont vérifiées et filtrées si tu as mit des filtres dans ton formulaire.
Hors ligne