Bonjour tous le monde,

Voilà mon problème, je veux imbriquer le formulaire "RegistrationType" de FOSUserBundle dans une autre formulaire dans mon cas dans le formulaire de l'entité Candidat. Mon entité candidat est propriétaire par relation OneToOne avec l'entité User.
L'enregistrement fonctionne mais j'ai un problème. Il n'y a aucune validation sur le formulaire imbriqué de l'entité User.

J'aimerais qu'il fasse les testes de validation de base présent dans FOSUserBundle, c'est à dire si l'email est unique, avec un paterne correcte et si le password est bon dans mon formulaire de Candidats.

Mon formulaire de Candidat avec le RegistrationType Imbriqué :
( ps: je précise que je ne veux pas fusionner mon entité User et mon entité Candidat, car j'ai une autre entité 'Client' qui utilise elle aussi User pour se loguer. J'aimerais vraiment laisser Vierge l'entité 'User' ).

Aidé moi s'il vous plais, je suis complètement bloquer à cause de ce soucis.
Merci de vos réponses !

namespace CandidacyBundle\Form\Onepage;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\CountryType;
use Symfony\Component\Form\Extension\Core\Type\BirthdayType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Validator\Constraints as Assert;

use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use CandidacyBundle\Form\AttachmentType;
use UserBundle\Form\RegistrationType;

class FolderType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('user',                      RegistrationType::class)
        ->add('firstname',                  TextType::class)
        ->add('lastname',                   TextType::class)
        ect ...

Mon Formulaire de l'entité User RegistrationType Surchage Basic de FOSUserBundle

namespace UserBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class RegistrationType extends AbstractType{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);
    }
    public function getParent()
    {
        return 'FOS\UserBundle\Form\Type\RegistrationFormType';
    }

    public function getBlockPrefix()
    {
        return 'app_user_registration';
    }

}

Voici ma fonction d'ajouts de Candidat dans le Controller :

namespace CandidacyBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use CandidacyBundle\Entity\Candidat;
use SchoolBundle\Entity\School;
use SchoolBundle\Entity\Section;

use CandidacyBundle\Form\Onepage\FolderSchoolType;

class FolderSchoolController extends Controller
{
public function addFolderAction(Request $request)
    {
        $em     = $this->getDoctrine()->getManager();
        $candidat = new candidat();
        $form = $this->createForm('CandidacyBundle\Form\Onepage\FolderSchoolType', $candidat);

        if($request->isMethod('POST') && $form->handleRequest($request)->isValid())
        {
            $em->persist($candidat);
            $em->flush();
            $this->get('session')->getFlashBag()->add('notice','Yours new candidacy is added !');
            return $this->redirectToRoute('candidacy_home');
        }
        return $this->render('CandidacyBundle:Folder_B:folder.html.twig', array(
            'new_folder' => $form->createView()
        ));
    }
    ect ...
 }

Et pour finir mes deux entités :
[ USER ]

namespace UserBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Constraints as Assert;

use Doctrine\ORM\Mapping as ORM;

use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
    public function setEmail($email){

        parent::setEmail($email);
        $this->setUsername($email);
    }
}

[ CANDIDATS ] ( je vous passe les get/set )

<?php

namespace CandidacyBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Constraints as Assert;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\mapping\Annotation as Gedmo;

use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
 * Candidat
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Candidat
{
//x - x - x - x - x - x - x - x - x - x - x - x - x - x - OBJ

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToOne(targetEntity="UserBundle\Entity\User", cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     * @Assert\Valid
     */
    private $user;

    /**
     * @ORM\ManyToOne(targetEntity="SchoolBundle\Entity\School")
     * @ORM\JoinColumn(name="id_school", referencedColumnName="id", nullable=true)
     */
    private $school;

    /**
     * @var boolean
     *
     * @ORM\Column(name="state", type="boolean")
     */
    private $state = true;

    /**
     * @var boolean
     *
     * @ORM\Column(name="state_blacklist", type="boolean")
     */
    private $stateBlacklist = false;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_entry", type="datetime")
     */
    private $dateEntry;

    /**
     * @var string
     * @Assert\NotBlank()
     * @Assert\Length(min=3)
     * @ORM\Column(name="name", type="string", length=255, nullable=true)
     */
    private $firstname;

    /**
     * @var string
     * @Assert\NotBlank(message="Vous devez indiquer votre nom")
     * @Assert\Length(min=3)
     * @Assert\Regex(
     *     pattern="/\d/",
     *     match=false,
     *     message="Uniquement des lettres"
     * )
     * @ORM\Column(name="lastname", type="string", length=255, nullable=true)
     */
    private $lastname;

    /**
     * @var \date
     * @ORM\Column(name="date_birth", type="date", nullable=true)
     */
    private $dateBirth;

    /**
     * @var string
     *
     * @ORM\Column(name="nationality", type="string", length=255, nullable=true)
     */
    private $nationality;

    /**
     * @var integer
     *
     * @ORM\Column(name="phone", type="integer", nullable=true)
     */
    private $phone;

    /**
     * @var string
     *
     * @ORM\Column(name="adress_street", type="string", length=255, nullable=true)
     */
    private $adress_street;

    /**
     * @var string
     *
     * @ORM\Column(name="adress_city", type="string", length=255, nullable=true)
     */
    private $adress_city;

    /**
     * @var string
     *
     * @ORM\Column(name="adress_region", type="string", length=255, nullable=true)
     */
    private $adress_region;

    /**
     * @var string
     *
     * @ORM\Column(name="adress_country", type="string", length=255, nullable=true)
     */
    private $adress_country;

    /**
     * @var integer
     *
     * @ORM\Column(name="adress_zip", type="smallint", nullable=true)
     */
    private $adress_zip;

    ect ....

3 réponses


Kulgor
Auteur

help me !

Salut,

dans ton Form il me semble qu'il faille lui passer ton Entity User

namespace UserBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class RegistrationType extends AbstractType{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);
        $builder
        ->add('save', SubmitType::class);
    }

     /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'UserBundle\Entity\User' //ici ta surcharge de l'Entity User
        ));
    }

    public function getParent()
    {
        return 'FOS\UserBundle\Form\Type\RegistrationFormType';
    }

    public function getBlockPrefix()
    {
        return 'app_user_registration';
    }

}
Kulgor
Auteur

Salut Bidule, j'ai pris note de ta remarque, mais ça ne change toujours pas mon problème. Je n'arrive toujours pas à avoir mes testes de validation sur mon entité imbriqué User qui je le rappel à zero surcharge, c'est vraiment l'entité User basique.
Et qui plus est le formulaire RegistrationType fonctionne avec un Controller comme voir ci dessous.

Je me suis resous diviser mon formulaire en deux partie, avec une surcharge du controler comme ici
Ce qui fonctionne, les testes de base apparaissent et je redirige vers mon formulaire Candidats puis je fais un $candidat->setUser($user-getId()) avant de persister mon entité le tous passer par session, C'est sale T.T.

Si quelqu'un trouve un solution à mon problème je suis en serais infiniment reconnaissant.