Bonsoir,

Suite aux contraintes de mon projet et à la discussion de ce poste j'ai installer le Bundle mentionné dans le titre. mais je rencontre un petit soucis au niveau des FormType.
je ne comprends pas d'ou vient l'erreur qui s'affiche et qui est la suivante :

UserDiscriminator, error getting form type : "JOB\UserBundle\Form\Type\RegistrationUserOneFormType" not found

J'ai pourtant il me semble bien suivi la documentation. Et bien crée les formulaires type dans:

JOB/UserBundle/Form/Type/RegistrationUserOneFormType/user_one.form.html.twig
JOB/UserBundle/Form/Type/RegistrationUserTwoFormType/user_two.form.html.twig

Si qqun connais une solution et/ou a déjà été confronté à ce problème, de l'aide serait la bienvenue =)
En vous remerciant

5 réponses


nicovak
Réponse acceptée

Pourquoi tu fais un use JOB\UserBundle\Form\Type\RegistrationUserOneFormType as BaseType; dans ta classe RegistrationUserOneFormType ? L'erreur vient de là.

Il faut enlever la ligne use JOB\UserBundle\Form\Type\RegistrationUserOneFormType as BaseType;. En gros tu lui dis d'étendre d'elle même.

Les form type sont des classes qui vont permettent de générer des formulaires. Le builder permet d'ajouter les champs à ton objet. Cela evite de créer le builder dans les controller. Il faut adapter la méthode buildForm et ajouter autant de ->add() que nécessaire. Cela dépend bien sûr de ta class User.
Pour info voici à quoi devrait ressembler ta classe:

<?php
namespace JOB\UserBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class RegistrationUserOneFormType  extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', 'text', array(
                'label'     => 'Identifiant* :',
                'attr'      => array('class' => 'form-control', 'maxlength' => 100),
            ))
            ->add('plainPassword', 'repeated', array(
                'type'              => 'password',
                'label'             => false,
                'attr'              => array('class' => 'form-control', 'maxlength' => 100),
                'options'           => array('translation_domain' => 'FOSUserBundle'),
                'first_options'     => array('label' => 'Mot de passe* :', 'attr' => array('class' => 'form-control', 'maxlength' => 100)),
                'second_options'    => array('label' => 'Vérification mot de passe* :', 'attr' => array('class' => 'form-control', 'maxlength' => 100)),
                'invalid_message'   => 'fos_user.password.mismatch',
            ))
            ->add('email', 'email', array(
                'label'     => 'Email* :',
                'attr'      => array('class' => 'form-control', 'maxlength' => 100),
            ))
            ->add('prenom', 'text', array(
                'label'     => 'Prénom* :',
                'attr'      => array('class' => 'form-control', 'maxlength' => 100),
            ))
            ->add('nom', 'text', array(
                'label'     => 'Nom* :',
                'attr'      => array('class' => 'form-control', 'maxlength' => 100),
            ));
    }

    public function getParent()
    {
        return 'fos_user_registration';
    }

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

Bon courage.

C'est des classes FormType JOB\UserBundle\Form\Type\RegistrationUserOneFormType et non des vues. Tu dois les spécifier das la config comme énnoncer dans la doc.

Oui j ai vu ça dans la doc mais lien qui y est proposé n'est plus valide.

          form: 
            type: JOB\UserBundle\Form\Type\RegistrationUserOneFormType
            name: fos_user_registration_form
            validation_groups:  [Registration, Default]
          template: JOBUserBundle:Registration:user_one.form.html.twig
        profile:
          form:
            type: JOB\UserBundle\Form\Type\ProfileUserOneFormType
            name: fos_user_profile_form
            validation_groups:  [Profile, Default] 
    user_two:
        entity: 
          class: JOB\UserBundle\Entity\UserTwo
        registration:
          form: 
            type: JOB\UserBundle\Form\Type\RegistrationUserTwoFormType
          template: JOBUserBundle:Registration:user_two.form.html.twig
        profile:
          form: 
            type: JOB\UserBundle\Form\Type\ProfileUserTwoFormType

dans mon config.yml voilà ce que j'ai mis. Je suppose du coup que je dois créer dans JOB/UserBundle/Form/Type, les fichiers :
-> RegistrationUserOneFormType.php
-> RegistrationUserTwoFormType.php
Je cherche sur la doc de symfony2 , mais je ne vois pas encore quoi bien mettre dedans.
Je donne des nouvelles sur mes recherches, Merci encore nicovak pour ton aide.

Arf, vraiement j'essaie d'y mettre du miensmais visiblement je n'arrive pas à arriver à qqch de correct. Je vais mettre un peu de code voir si on peut m'aider à comprendre ce qui en va pas.
L'erreur que j'ai est la suivante :
Attempted to load class "RegistrationUserOneFormType" from namespace "JOB\UserBundle\Form\Type".
Did you forget a "use" statement for another namespace?

Un peu de code :s

<?php
#src/JOB/UserBundle/Entity/User.php
namespace JOB\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({"user_one" = "UserOne", "user_two" = "UserTwo"})
 *
 */
abstract class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}
<?php
#src/JOB/UserBundle/Entity/UserOne.php
namespace JOB\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use PUGX\MultiUserBundle\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * @ORM\Table(name="user_one")
 * @UniqueEntity(fields = "username", targetClass = "JOB\UserBundle\Entity\User", message="fos_user.username.already_used")
 * @UniqueEntity(fields = "email", targetClass = "JOB\UserBundle\Entity\User", message="fos_user.email.already_used")
 */
class UserOne extends User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}
<?php
#src/JOB/UserBundle/Form/Type/RegistrationUserOneFormType.php
namespace JOB\UserBundle\Form\Type;

use JOB\UserBundle\Form\Type\RegistrationUserOneFormType as BaseType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class RegistrationUserOneFormType extends BaseType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        // add your custom field
    }

    public function getName()
    {
        return 'acme_user_registration';
    }
}
<!-- src/JOB/UserBundle/Resources/views/Registration -->
{% extends "layout.html.twig" %}

{% block fos_user_content %}
    {% trans_default_domain 'FOSUserBundle' %}

    <form action="{{ path('user_one_registration') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register">
        {{ form_widget(form) }}
        <div>
            <input type="submit" value="{{ 'registration.submit'|trans }}" />
        </div>
    </form>
{% endblock fos_user_content %}

Merci, en effet je comprends. Je serais surement améner à poser d'autres questions, j'éespere ne pas trop spammer le form :s
Parce que du coup j'ai un probleme de routes, j'ai retirer les routes de fosuserbundle pr mette seulement les routes de registrations j'éspère que ça vient de là.