user3735229
user3735229

Reputation: 389

Silex Framework Collection form type

I have a problem with collection form type. My entities:

User

use Doctrine\Common\Collections\ArrayCollection;

/**
  * @OneToMany(targetEntity="Comment", mappedBy="user")
  */
protected $comments;

public function __construct() {
$this->comments= new ArrayCollection();
}

Comment

/**
  * @ManyToOne(targetEntity="User", inversedBy="comments")
  * @JoinColumn(name="user_id", referencedColumnName="id")
  **/
protected $user;

Formbuilder:

$form = $silex['form.factory']->createBuilder('form', $user)
                ->add('comments', 'collection', array(
                    'type'   => 'text',
                    'options'  => array(
                        'required'  => false,
                        'data_class' => 'Site\Entity\Comment'
                    ),
                ))
                ->getForm();

and is returned error:

Catchable fatal error: Object of class Site\Entity\Comment could not be converted to string in C:\XXX\vendor\twig\twig\lib\Twig\Environment.php(331) : eval()'d code on line 307 Call Stack 

Upvotes: 1

Views: 993

Answers (1)

madebydavid
madebydavid

Reputation: 6517

I think that you might struggle to use a text type collection field here, since you want a field which is a collection of complex entities and not just one which is an array of strings.

I would suggest adding a new Form type for the Comment Entity:

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

class CommentType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('text', 'text', array());
    }

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

    public function getDefaultOptions(array $options) {
        return array(
            'data_class' => 'Site\Entity\Comment'
        );
    }
}

Then in the original Formbuilder, reference this type:

$form = $silex['form.factory']->createBuilder('form', $user)
    ->add('comments', 'collection', array(
        'type'   => new CommentType(),
        'options'  => array(
            'required'  => false,
            'data_class' => 'Site\Entity\Comment'
            'allow_add' => true,
            'allow_delete' => true
        ),
    ))
    ->getForm();

Upvotes: 1

Related Questions