2012-04-11 2 views
0

Ich verwende eine Form-Klasse, um ein Formular zu generieren. Es ist ein Passwort-Reset-Formular.Symfony2 - Formularklassen: data_class scheint nicht zu funktionieren

Dieses Formular muss an meine Benutzereinheit gebunden sein. Sobald das Formular abgeschickt wurde, wird das Passwort aktualisiert.

Alles funktioniert mit dem Code, den ich derzeit habe, aber in einem Versuch, Code zu entfernen, von dem ich glaube, dass er nicht benötigt wird (wegen der Verwendung der data_class-Option), bricht meine Validierung ab (da das Formular zu werden scheint) freistehend "um die Einheit bilden)

Ok, so dass einige Code:

public function passwordResetAction(Request $request, $key = NULL) 
{ 
    $user = $this->getDoctrine() 
      ->getRepository('DemoUserBundle:User\User') 
      ->findOneBy(array('resetToken' => $key)); 

    if (!$user) { 
     throw $this->createNotFoundException('No user found for reset token '.$key.'!'); 
    } 

    $form = $this->createForm(new PasswordResetType(), $user); 

    if ($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 

     if ($form->isValid()) { 
      $postData = $request->request->get('resetpass'); 

      $newPassword = $postData['password']; 

      $encoder = new MessageDigestPasswordEncoder('sha1', false, 1); 
      $password = $encoder->encodePassword($newPassword, $user->getSalt()); 
      $user->setPassword($password); 

      $newToken = base64_encode($user->getUsername().'|'.date('Y-m-d')); 
      $user->setResetToken($newToken); 

      $em = $this->getDoctrine()->getEntityManager(); 
      $em->persist($user); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('password_reset_success')); 
     } 

    } 

    return $this->render('DemoUserBundle:User\Reset:password-reset.html.twig', array('key' => $key, 'form' => $form->createView())); 
} 

Das Stück Code, das mich interessiert ist" $ form = $ this-> Create (neu PasswordResetType(), $ Benutzer);" Wie Sie sehen können, verwende ich den Formulartyp, um das Formular zu erstellen und ihm die $ user-Variable zu übergeben, die das Formular an die User-Entität anhängt. Nun, soweit ich verstehen kann, soll ich nicht diese Parameter muß eingestellt, wie ich die Einheit festgelegt in dem Formulartyp (siehe unten für den Code)

namespace Demo\UserBundle\Form\Type\User; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 
use Symfony\Component\Form\FormError; 
use Symfony\Component\Form\CallbackValidator; 

class PasswordResetType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->add('password', 'password', array('label' => 'New Password')); 
     $builder->add('confirmPassword', 'password', array('label' => 'Confirm Password', 'property_path' => false)); 
     $builder->addValidator(new CallbackValidator(function($form) 
      { 
       if($form['confirmPassword']->getData() != $form['password']->getData()) { 
        $form['confirmPassword']->addError(new FormError('Passwords must match.')); 
      } 
     })); 
} 

public function getDefaultOptions(array $options) 
{ 
    return array(
     'data_class' => 'Demo\UserBundle\Entity\User\User', 
    ); 
} 

public function getName() 
{ 
    return 'resetpass'; 
} 

} 

So soll diese Form standardmäßig den Benutzer anhang Entity (ohne die $ user Variable), aber es funktioniert nicht. Ohne dass diese Variable übergeben wird, funktioniert die Validierung einfach nicht (ein Indikator, dass sie nicht an die Benutzereinheit angehängt ist)

Was gibt? Irgendwelche Ideen Leute?

Antwort

0

Diese Option data_class wird verwendet, um den entsprechenden Datenzuordner für das Formular festzulegen. Wenn Sie es nicht angeben, wird es basierend auf dem Objekt geschätzt, das Sie übergeben.

Es befreit Sie nicht davon, ein Objekt an das Formular zu übergeben. Wie denkst du würde es wissen, mit welchem ​​Objekt du arbeiten willst?

+0

Ah, also habe ich die Informationen missverstanden? Es ist eine optionale Option, die es mir nicht erlaubt, die Variable $ user nicht zu verwenden? Was könnte möglicherweise schief gehen, wenn ich es nicht spezifiziere? –

+0

Wenn eingebettete Formulare ausgeführt werden, kann Symfony Probleme beim automatischen Ableiten einer Datenklasse haben. Diese Option hilft es. –

0

in den neuen symfony-Versionen verwenden eine andere Methode Signatur (Option Resolver statt $ Optionen Variable):

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Demo\UserBundle\Entity\User\User', 
    )); 
} 

Hinweis für Symfony 2.7: das Formular API etwas geändert hat, so dass Sie diese stattdessen verwenden sollten :

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Demo\UserBundle\Entity\User\User', 
    )); 
}