À l'aide de entity type de champ dans symfony2.1 formulaire

À l'aide de Symfony 2.1.3-dev et de la Doctrine 2.3

Je cherche à créer un formulaire qui offrent de multiples options pour l'utilisateur de filtrer un retourné ensemble de données (Entity\EngineCodes). Le formulaire est composé de 1 champ de saisie de texte (id) et 3 sélectionnez les champs (module, type, status). Je suis tenter de l'utiliser Symfony2 entity form_type à générer des valeurs pour les 3 sélectionnez les champs de la EngineCodes entité.

Depuis que je suis désireux de filtre de la table à l'aide d'une combinaison de 3 de le sélectionner des champs. Basé sur le 2.1 docs, j'ai décidé de créer un FormType (EngineCodesFilterType) et trois de la les champs de formulaire à entity type avec query_builder déclarations de retourner un ensemble de valeurs uniques pour chacun des champs.

Malheureusement, je reçois l'erreur de suivi, et je ne suis pas sûr de savoir exactement pourquoi elle retourne un tableau au lieu d'un objet.

    The form's view data is expected to be an instance of class
    Vendor\IndexBundle\Entity\EngineCodes, but is a(n) array.
    You can avoid this error by setting the "data_class" option
    to null or by adding a view transformer that transforms a(n)
    array to an instance of Vendor\IndexBundle\Entity\EngineCodes.

Si j'ai mis data_class à null, je reçois cette erreur:

    A "__toString()" method was not found on the objects of type
    "Vendor\IndexBundle\Entity\EngineCodes" passed to the choice
    field. To read a custom getter instead, set the option
    "property" to the desired property path.

Depuis que je suis encore à apprendre de ces Symfony2 fonctionnalités, mon but était de faire correspondre l'2.1 docs en termes de construction et de format autant que possible.

Ici est la fonction dans le Contrôleur:

public function displayAction() {

    //...

    $entity = $this->getDoctrine()->getEntityManager()
        ->getRepository('VendorIndexBundle:EngineCodes')
        ->findAll();

    //...

    $form = $this->createForm(new EngineCodesFilterType(), $entity);

    //...

    return $this->render(
        'VendorIndexBundle::layout.html.twig',
        array(
            'entity'  => $entity,
            'form'    => $form->createView(),));

Ici est le type de formulaire:

class EngineCodesFilterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'id',
            'integer',
            array(
                'label' => 'Code ID',));
        $builder->add(
            'status',
            'entity',
            array(
                'label' => 'Code Status',
                'class' => 'VendorIndexBundle:EngineCodes',
                'query_builder' => function(EntityRepository $er)
                    {
                        return $er->createQueryBuilder('u')
                            ->select('u.status')
                            ->add('groupBy', 'u.status');
                    },
                'multiple' => true,));
        $builder->add(
            'type',
            'entity',
            array(
                'label' => 'Code Type',
                'class' => 'VendorIndexBundle:EngineCodes',
                'query_builder' => function(EntityRepository $er)
                    {
                        return $er->createQueryBuilder('u')
                            ->select('u.type')
                            ->add('groupBy' ,'u.type');
                    },
                'multiple' => true,));
        $builder->add(
            'module',
            'entity',
            array(
                'label' => 'Code Module',
                'class' => 'VendorIndexBundle:EngineCodes',
                'query_builder' => function(EntityRepository $er)
                    {
                        return $er->createQueryBuilder('u')
                            ->select('u.module')
                            ->add('groupBy', 'u.module');
                    },
                'multiple' => true,));
    }

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

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(
            array(
                'data_class'        => 'Vendor\IndexBundle\Entity\EngineCodes',
              /*'data_class'        => null,*/
                'validation_groups' => 'filter',));
    }
}

Et voici le Vendor\Entity\EngineCodes classe:

/**
 * Vendor\IndexBundle\Entity\EngineCodes
 *
 * @ORM\Table(name="engine_codes")
 * @ORM\Entity(repositoryClass="Vendor\IndexBundle\Entity\EngineCodesRepository")
 * @UniqueEntity(fields="id", message="ID already in use! Enter a unique ID for the code.")
 */
class EngineCodes
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false, unique=true)
     * @ORM\Id
     * @Assert\NotBlank(message="ID cannot be blank!")
     * @Assert\Regex(pattern="/^\d+$/", match=true, message="ID must be an integer!")
     * @Assert\MinLength(limit=8, message="ID must be 8 numbers in length!")
     * @Assert\MaxLength(limit=8, message="ID must be 8 numbers in length!")
     */
    private $id;

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

    /**
     * @var boolean $status
     *
     * @ORM\Column(name="status", type="integer", nullable=false)
     * @Assert\NotBlank(message="Status cannot be blank!")
     */
    private $status;

    /**
     * @var string $module
     *
     * @ORM\Column(name="module", type="string", length=255, nullable=false)
     * @Assert\NotBlank(message="Module cannot be blank!")
     */
    private $module;

    /**
     * @var string $submodule
     *
     * @ORM\Column(name="submodule", type="string", length=255, nullable=false)
     * @Assert\NotBlank(message="Submodule cannot be blank!")
     */
    private $submodule;

    /**
     * @var string $type
     *
     * @ORM\Column(name="type", type="string", length=255, nullable=false)
     * @Assert\NotBlank(message="Type cannot be blank!")
     */
    private $type;

    /**
     * @var string $description
     *
     * @ORM\Column(name="description", type="text", nullable=false)
     * @Assert\NotBlank(message="Description cannot be blank!")
     */
    private $description;

    /**
     * @var string $title
     *
     * @ORM\Column(name="title", type="string", length=255, nullable=false)
     * @Assert\NotBlank(message="Title cannot be blank!")
     */
    private $title;

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

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

    /**
     * @var \DateTime $createTimestamp
     *
     * @ORM\Column(name="create_timestamp", type="datetime", nullable=false)
     */
    private $createTimestamp;

    /**
     * @var Accounts
     *
     * @ORM\ManyToOne(targetEntity="Accounts")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="create_account_fk", referencedColumnName="id")
     * })
     */
    private $createAccountFk;


    //getters and setters ...

    /**
     * Set createAccountFk
     *
     * @param Vendor\IndexBundle\Entity\Accounts $createAccountFk
     * @return EngineCodes
     */
    public function setCreateAccountFk(\Vendor\IndexBundle\Entity\Accounts $createAccountFk = null)
    {
        $this->createAccountFk = $createAccountFk;

        return $this;
    }

    /**
     * @ORM\PrePersist
     */
    public function setCreateTimestampValue()
    {
        $this->createTimestamp = new \DateTime();
    }
}

OriginalL'auteur Alan Scott | 2012-09-22