À 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
Vous devez vous connecter pour publier un commentaire.
Votre premier problème, c'est que
$entity
n'est pas une entité unique, mais plutôt un tableau d'entités (qui est ce qui est retourné par lafindAll()
méthode). Lorsque vous avez défini le type de formulaire, vous avez dit que vous vous attendiez à construire la forme d'une entité (c'est ce que ledata_class
option) et c'est pourquoi vous obtenez la première erreur.Si vous définissez
data_class
null vous dites que vous n'attendez pas que le formulaire puisse être créé à partir d'une entité, de sorte qu'il acceptera votre ensemble d'entités et de ne pas se plaindre. Mais, pourquoi êtes-vous en passant un tableau d'entités pour le type de formulaire? C'est juste un formulaire de filtre qui vous permet de choisir quatre valeurs possibles pour filtrer vos entités. Cela n'a pas besoin d'un tableau d'entités que ses données sous-jacentes. Si vous pensez que vous en avez besoin pour obtenir les valeurs pour le code, le type et l'état des champs, ce n'est pas comme ils sont déjà récupérées avec votre requête constructeurs. Si votre contrôleur de code doit être juste:Puis vous obtenez l'erreur parce que vous ajoutez trois champs de formulaire et chacun vous permet de choisir à partir d'une entité de la liste. Mais, comment voulez-vous "montrer" cette entité? Symfony ne sais pas quel est le champ où il devrait vous montrer à représenter l'entité, de sorte qu'il génère cette erreur.
Cette erreur a pu être corrigé par l'ajout d'un __toString() la méthode la EngineCodes classe, qui dit juste "hey, ce que je veux montrer cette classe", mais si l'erreur ne sera pas levée, il ne fonctionnera pas comme prévu puisque chacun des trois champs veut montrer une propriété différente.
Une autre solution est d'utiliser le
property
option de champ de formulaire pour dire la propriété de l'objet sous-jacent que vous souhaitez utiliser pour afficher les données.Par exemple:
Ahhhh, il est logique de ne pas appliquer mon tableau d'entités à la forme. Merci pour cette observation.
Et maintenant il semble que mon query_builder déclarations ne sont pas de retourner les tableaux/objets, mais plutôt des entiers et des chaînes de caractères. Va falloir revoir avec des yeux frais le matin.
OriginalL'auteur Carlos Granados
Vous êtes tout simplement disparu de la option de la propriété dans "statut", "type" et "module" les types d'entité:
OriginalL'auteur gremo