Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Formulario asociación Many-To-Many - self Referencing - symfony

18 de diciembre de 2015

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

#1

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

18 diciembre 2015, 12:50
#2

Una pregunta, ¿has generado los getters/setters con el comando de Symfony doctrine:generate:entities o lo has hecho a mano?

Saludos.

@RoberRielo

18 diciembre 2015, 14:59
#3

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

18 diciembre 2015, 16:04