2010-03-26 4 views
0

j'ai installé sfDoctrineGuardUser et ont créé ce modèle qui modèle hérite sfGuardUser:Symfony 1.3 et les formulaires: le mot de passe change quand je clique sur 'Sauvegarder', pourquoi?

Usuario: 
    inheritance: 
    extends: sfGuardUser 
    type: simple 
    columns: 
    nombre_apellidos: string(60) 
    sexo: boolean 
    fecha_nac: date 
    provincia: string(60) 
    localidad: string(255) 
    email_address: string(255) 
    avatar: string(255) 
    avatar_mensajes: string(255) 

J'ai aussi créé un module appelé « miembros » basé sur ce modèle.

Eh bien, je me connecte normalement par sfGuardAuth/signin, puis je vais à "miembros/modifier/id/$ id_of_the_member_i_used_to_log_in" et appuyez sur le bouton 'Save' . Puis je me déconnecte.

Si j'essaie de me reconnecter, il est écrit: "Le nom d'utilisateur et/ou le mot de passe est invalide". Plus tard, j'ai réalisé que lorsque vous cliquez sur 'Enregistrer', la valeur du champ 'mot de passe' change (bien sa version cryptée). Donc, c'est la raison pour laquelle je ne peux pas me connecter.

Mais, pourquoi la valeur du mot de passe change quand je clique sur 'Sauvegarder' ???

Cordialement

Javi

+2

Postez le code. Ma baguette magique ne fonctionne pas. –

+0

Quelle partie? --------- – ziiweb

+0

template et action – develop7

Répondre

0

L'objet sf_guard_user n'est pas destiné à être étendu comme celui-ci par héritage. Un mécanisme est fourni pour vous permettre de lier un objet "profil" à un utilisateur. J'ai vu des gens utiliser une méthode similaire à la vôtre, mais je ne l'ai pas essayé moi-même, donc je ne sais pas si c'est un problème courant. Mais je vérifierais que toutes vos classes de modèles et de formulaires héritent correctement l'une de l'autre, y compris les classes Pluginxxxx du dossier plugin.

+0

Merci, en tout cas pour délimiter le problème, j'ai créé un module basé uniquement sur sfGuardUser, donc pas inherits: php symfony doctrine: generate-module --with-show frontend guardausuario sfGuardUser Ce sont mes étapes: - Installer symfony et sfDoctrineGuardUser - Créer un module basé sur sfGuardUser appelé 'foo'. - Exécutez 'frontend_dev.php/foo/edit/id/X' et appuyez sur le bouton 'Enregistrer'. - La valeur du mot de passe change. Javi – ziiweb

0

Avez-vous affiché l'ancien mot de passe dans le champ du mot de passe? dans ce cas, il pourrait être affiché crypté et donc crypté une deuxième fois lors de l'enregistrement.

Les hachages ne sont généralement pas déchiffrables, vous ne devriez donc pas afficher le mot de passe sur un champ.

Ceci est un problème courant lorsque vous travaillez avec sfGuard. Voici 2 solutions, il y a probablement d'autres qui répondront à cette question:

  1. Ne laissez pas le mot de passe de l'utilisateur du changeur d'utilisateur sous cette forme et de créer un formulaire distinct pour le mot de passe réinitialisés
  2. Laissez-forme de mot de passe champ vide par défaut, et enregistrez-le uniquement lorsque les types d'utilisateur dans un nouveau mot de passe

Je reçois habituellement dans la deuxième voie, voici la classe de formulaire utilisé:

class ewaSfGuardUserForm extends sfGuardUserForm 
{ 
    public function configure() 
    { 
    // parent::configure(); 

    //"virtual" new password fields, empty by default 
    $this->widgetSchema['new_password'] = new sfWidgetFormInputPassword(); 
    $this->widgetSchema['new_password_bis'] = new sfWidgetFormInputPassword(); 

    $error_messages = array('min_length' => 'Passwords must be at least 4 characters long.'); 
    $this->validatorSchema['new_password'] = new sfValidatorString(array('required' => false, 'min_length' => 4), $error_messages); 
    $this->validatorSchema['new_password_bis'] = new sfValidatorString(array('required' => false, 'min_length' => 4), $error_messages); 

    $error_messages = array('invalid' => 'New password didn\'t match confirmation'); 

    //validate identical password 
    $this->validatorSchema->setPostValidator(new sfValidatorSchemaCompare('new_password', '==', 'new_password_bis', array(), $error_messages)); 
    $this->validatorSchema->setPostValidator(
     new sfValidatorAnd(array(
     new sfValidatorDoctrineUnique(array('model' => 'sfGuardUser', 'column' => array('email_address'))), 
     new sfValidatorDoctrineUnique(array('model' => 'sfGuardUser', 'column' => array('username')), array('invalid' => 'Email is already in use for another account')), 
     new sfValidatorSchemaCompare('new_password', '==', 'new_password_bis', array(), $error_messages) 
    )) 
    ); 
    //unused fields 
    unset(
     $this['groups_list'], 
     $this['permissions_list'], 
     $this['password'], 
     $this['created_at'], 
     $this['updated_at'], 
     $this['last_login'], 
     $this['salt'], 
     $this['algorithm'] 
    ); 

    //putting back validator for real password field 
    $this->validatorSchema['password'] = new sfValidatorPass(); 
    } 
} 

le autre partie est en classe d'action sf_guard_userActions

protected function processForm(sfWebRequest $request, sfForm $form) 
    { 
    $requestParams = $request->getParameter($form->getName()); 
    $requestParams['password'] = $requestParams['new_password']; 
    $requestParams['email_address'] = $requestParams['username']; 
    $form->bind($requestParams, $request->getFiles($form->getName())); 
    if ($form->isValid()) 
    { 
     [....] Copy of generated code 

    } 
    } 

La spécificité de ma mise en œuvre est-il toujours la force utilise email == nom d'utilisateur. Je n'utilise pas de modèle étendu pour stocker le profil de l'utilisateur, mais je remplace la table de doctrine sfGuardUser de defaut pour ajouter des champs supplémentaires comme le prénom, le nom, etc. Cela fonctionne, peut-être que l'héritage de doctrine aurait été meilleur.

Questions connexes