Hola, buenas
Tengo un formulario que muestra 3 propiedades[title, language(asociación Many-To-One con Language entity y funciona bien) y translations (Many-To-Many - self Referencing , aquí el problema)].
translations Resulta que en si la propiedad translation no especifico valor funciona, y muestra un select-multioption (aunque solo funciona con si selecciono un valor), mi idea es que sea un select para elegir solo una opción.
namespace AppBundle\Form; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class PostForm extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('title', TextType::class) ->add('language', EntityType::class, [ 'class' => 'AppBundle\Entity\Language' ]) ->add('translations') //sin especificar valor ; } public function configureOptions(OptionsResolver $resolver) { return $resolver->setDefaults([ 'data_class' => 'AppBundle\Entity\Post' ]); } }
Y si le especifico la clase para poder personalizar la lista con una consulta, la VISTA me aparece el select, pero al realizar el submit me da un error
->add('translations',EntityType::class, [ 'class' => 'AppBundle\Entity\Post', 'query_builder' => function (EntityRepository $er) { return $er->createQueryBuilder('p') ->orderBy('p.title', 'ASC'); }, ])
Error mostrado al hacer submit:
Neither the property "translations" nor one of the methods "addTranslation()"/"removeTranslation()", "setTranslations()", "translations()", "set()" or "call()" exist and have public access in class "AppBundle\Entity\Post".
En la entidad Post tengo dichos métodos :
/** * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Post") * @ORM\JoinTable(name="translations", * joinColumns={@ORM\JoinColumn(name="post_a_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="post_b_id", referencedColumnName="id")} * ) * @var ArrayCollection */ private $translations; /** * Post constructor. */ public function __construct() { $this->translations = new ArrayCollection(); } public function addTranslation(Post $post) { $this->translations->add($post); } public function removeTranslation(Post $post) { $this->translations->removeElement($post); }
CONCLUSIÓN Si dejo el valor del formulario para que symfony decida que campo utilizar funciona bien (sin poder personalizar la consulta ni el campo a mostrar) y si intento personalizar la consulta e indico la clase asociada a esa propiedad no funciona al hacer submit, pero sí lo renderiza. =(
muchas gracias
Respuestas
He añadido el método setTranslations()
(en plural) y ahora si funciona (aunque dentro del set
llama a la función addTranslation()
)
public function setTranslations($translations) { $this->addTranslation($translations); }
¿Cómo tendría que tener los setter/getter de la manera más óptima?
gracias
@JuanluGarciaB
Una pregunta, ¿has generado los getters/setters con el comando de Symfony doctrine:generate:entities
o lo has hecho a mano?
Saludos.
@RoberRielo
Hola Roberto, lo he hecho a mano. He probado con el comando y sale igual que al principio, para que funcione le tengo q añadir el setTranslations() saludos
@JuanluGarciaB