Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 31-08-2010 09:37:12

Zarx
Nouveau membre
Date d'inscription: 31-08-2010
Messages: 3

[Résolu][Zend_Db][1.10] Update account problème, mais insert OK

Bonjour,

Je suis tout neuf en PHP et tout neuf également avec le framework Zend.
Je réalise les tutos depuis un petit moment et au final j'ai installé Zend Server sous windows pour tester.

J'ai créé une simple application web qui affiche une page principale et propose :
- de s'enregistrer
- de se connecter
- de se déconnecter
- de visualiser les infos de son compte
- de modifier les informations de son compte

C'est cette dernière fonction qui me pose problème.

J'utilise la même chose que pour le tuto de Guestbook sur http://framework.zend.com/manual/en/lea … model.html

Ce qui fait que je me trouve avec les classes suivantes :
- Application_Model_Account qui possède les fonctions get/set pour un objet account
- Application_Model_AccountMapper qui possède les fonctions find/save

La création du nouveau compte passe bien par la fonction save, ensuite l'utilisateur se connecte correctement avec les composants Zend_Auth et finalement il peut afficher une page de modification qui utilise la fonction find pour pré-remplir les champs du formulaire qu'il veut modifier.

Le formulaire est le même pour la page de création du compte et pour la page de modification du compte.
J'ajoute simplement pour la page de modification un champ hidden "id" qui permet de passer l'identifiant de la ligne à mettre à jour au moment du save.

Or, au lieu de faire un update avec la fonction save, je me retrouve a faire une nouvelle insertion et je me retrouve avec un doublon de compte sous un autre id dans ma base MySQL.

Mon formulaire :

Code:

class Application_Form_Account extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post');

        $this->addElement('text', 'account_name', array(
            'filters'    => array('StringTrim', 'StringToLower'),
            'validators' => array(
                array('StringLength', false, array(0, 16)),
            ),
            'required'   => true,
            'label'      => '*** Username ***',
        ));

        $this->addElement('text', 'account_email', array(
            'filters'    => array('StringTrim', 'StringToLower'),
            'validators' => array(
                'EmailAddress',
            ),
            'required'   => true,
            'label'      => '*** Email ***',
        ));

        $this->addElement('password', 'password', array(
            'filters'    => array('StringTrim'),
            'validators' => array(
                array('StringLength', false, array(0, 16)),
            ),
            'required'   => true,
            'label'      => '*** Password ***',
        ));

        $this->addElement('text', 'first_name', array(
            'filters'    => array('StringTrim', 'StringToLower'),
            'validators' => array(
                array('StringLength', false, array(0, 128)),
            ),
            'required'   => true,
            'label'      => '*** First name ***',
        ));

        $this->addElement('text', 'family_name', array(
            'filters'    => array('StringTrim', 'StringToLower'),
            'validators' => array(
                array('StringLength', false, array(0, 128)),
            ),
            'required'   => true,
            'label'      => '*** Family name ***',
        ));

        $this->addElement('text', 'birthday', array(
            'filters'    => array('StringTrim', 'StringToLower'),
            'validators' => array(
                array('StringLength', false, array(0, 10)),
            ),
            'required'   => true,
            'label'      => '*** Birthday ***',
        ));
        
        $this->addElement('captcha', 'captcha', array(
            'label'      => '*** CAPTCHA code ***',
            'required'   => true,
            'captcha'    => array(
                'captcha' => 'Image',
                'font'    => './images/captcha/arial.ttf',
                'wordLen' => 5,
                'timeout' => 300
            )
        ));

        $this->addElement('submit', 'register', array(
            'required' => false,
            'ignore'   => true,
            'label'    => 'Enregistrer',
        ));
    }
}

Mon controller pour la partie création et modification de compte :

Code:

    public function addAction()
    {
        $request = $this->getRequest();
        $form    = new Application_Form_Account();
 
        if ($this->getRequest()->isPost()) {
            if ($form->isValid($request->getPost())) {
                $account = new Application_Model_Account($form->getValues());
                $mapper  = new Application_Model_AccountMapper();
                $mapper->save($account);
                return $this->_helper->redirector('index', 'index');
            }
        }
 
        $this->view->form = $form;
    }

    public function editAction()
    {
        $auth = Zend_Auth::getInstance();
        if ($auth->hasIdentity()) { /* Tester préalablement si l'utilisateur est connecté */
            $userid = (int) $auth->getIdentity()->id;
            
            $request = $this->getRequest();
            $form    = new Application_Form_Account();
            
            if ($this->getRequest()->isPost()) { /* Tester si c'est le moment de mettre en oeuvre la modification */
                if ($form->isValid($request->getPost())) {
                    $account1 = new Application_Model_Account($form->getValues());
                    $mapper1  = new Application_Model_AccountMapper();
                    $mapper1->save($account1);
                    return $this->_helper->redirector('index', 'index');
                }
            } else {
                if ($userid > 0) { /* Si l'utilisateur existe, récupérer ses infos pour pré-remplir le formulaire */
                $account = new Application_Model_Account();
                $mapper = new Application_Model_AccountMapper();
                $form->addElement('hidden', 'id', null);
                
                $mapper->find($userid, $account);
                
                $form->populate(array('id' => $userid,
                                      'account_name' => $account->getAccount_name(),
                                      'account_email' => $account->getAccount_email(),
                                      'first_name' => $account->getFirst_name(),
                                      'family_name' => $account->getFamily_name(),
                                      'birthday' => $account->getBirthday()
                                     )
                               );
                }
            }
            
            $this->view->form = $form;
        }   
        else {
            return $this->_helper->redirector('bad', 'account');
        }
    }

Et pour terminer, ma fonction save dans le mapper :

Code:

    public function save(Application_Model_Account $account)
    {
        $sha1 = sha1(date());
        $data = array(
            'date_cre'       => date('Y-m-d H:i:s'),
            'account_name'   => $account->getAccount_name(),
            'account_email'  => $account->getAccount_email(),
            'password'       => sha1($account->getPassword().$sha1),
            'salt'           => $sha1,
            'first_name'     => $account->getFirst_name(),
            'family_name'    => $account->getFamily_name(),
            'birthday'       => $account->getBirthday(),
        );

        if (null === ($id = $account->getId())) {
            unset($data['id']);
            $this->getDbTable()->insert($data);
        } else {
            $this->getDbTable()->update($data, array('id = ?' => $id));
        }
    }

Et je comprends tout à fait que mon problème se trouve ici :

Code:

if (null === ($id = $account->getId())) {
    unset($data['id']);
    $this->getDbTable()->insert($data);
} else {
    $this->getDbTable()->update($data, array('id = ?' => $id));
}

Mais je ne comprends pas pourquoi au moment de la modification il détermine que mon id est null et qu'il fait un insert au lieu d'un update.

Je vous remercie d'avance pour votre aide smile

P.S. : Si quelqu'un peut également m'expliquer comment débugguer ou afficher des variables dans les controllers je suis preneur. Car au final mon problème est aussi sur la partie débuggage, quand j'ai un souci je ne sais pas comment remonter visuellement le problème sur mes page web et afficher des variables.

Dernière modification par Zarx (04-09-2010 09:46:13)

Hors ligne

 

#2 31-08-2010 11:43:09

yvann
Membre
Date d'inscription: 24-07-2008
Messages: 81

Re: [Résolu][Zend_Db][1.10] Update account problème, mais insert OK

Pour débugger, le couple xDebug/(Eclipse|Netbeans) est très pratique, plus "simple" tu peux utiliser du Zend_Debug::dump($taVar); qui fonctionne sur le principe d'un "var_dump($taVar)"

Hors ligne

 

#3 02-09-2010 09:54:04

Zarx
Nouveau membre
Date d'inscription: 31-08-2010
Messages: 3

Re: [Résolu][Zend_Db][1.10] Update account problème, mais insert OK

Ok, merci.
Je vais voir ce que j'arrive à faire avec ça.

Pour le moment je vois simplement que mon $account->getId() me renvoie NULL.

Je suppose qu'il doit y avoir un souci au niveau du formulaire pour passer l'ID.

Si d'autres personnes ont une idée, je suis preneur big_smile

Hors ligne

 

#4 04-09-2010 09:45:53

Zarx
Nouveau membre
Date d'inscription: 31-08-2010
Messages: 3

Re: [Résolu][Zend_Db][1.10] Update account problème, mais insert OK

Bon du coup j'ai résolu mon problème.

Il se trouve que pour traiter le formulaire je repasse dans la fonction "edit" du controlleur.
Or je réinitialise mon objet $form mais avec un formulaire qui ne comporte pas le champ "id".
Du coup au moment du $form->getValues() il ne prend pas l'id.

J'ai remonté la ligne : $form->addElement('hidden', 'id', null); sous la déclaration de $form et ça fonctionne.

Bon au final il vaut mieux faire autant de formulaires que d'actions, ça évite ce genre de désagréments.

Sinon, pour le debugging, quand il faut afficher des variables quand c'est du code qui tourne coté serveur, ce n'est pas franchement pratique.

Merci et à plus tard.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages