Bonjour,

Je viens vous solliciter suite à un problème avec un DataTransformer. Je cherche à transformer une Entity en une collection d'entity pour l'insérer dans un formulaire de type collection.

J'ai une entity User qui possède une seul et unique image de profile (OneToOne) et se que j'aimerais c'est d'avoir comme pour le cas d'une collection, un bouton delete si je souhaite simplement supprimer l'image associer à l'utilisateur je click sur supprimer ou si je souhaite ajouter je click sur ajouter. Cela me permettrais lors de la soumission du formulaire, si je n'est rien alors c'est une suppression de l'image associé à l'utilisateur, si j'ai quelque chose alors c'est soit un ajout soit une modification normale.

Je cherche à faire cela car une relation OneToOne ne peut pas être supprimer dans un formulaire.

n'ayant jamais utiliser de dataTransformer et étant novice j'ai fait plusieurs recherche dessus et je pense que je peut palier mon problème avec ceci.

cas d'utilisation :

1) transformer mon champs Image (qui est une Entity Image) en un champs de collection contenant l'entity Image avant l'insertion dans le form
2) récupérer la collection de mon formulaire qui retourne soit un tableau vide soit avec une Entity Image dedans lors de la soumission de mon formulaire

Même après mes différentes recherche j'ai beaucoup de mal à comprendre comment cela s'utilise :( . J'ai donc essayer de l'utiliser mais cela me lève une erreur lors de l'édition d'un utilisateur et lorsque je veux créer un utilisateur j'ai bien ma collection mais pas dans le bon champ.

Mon erreur lors de l'édition:

[code]Expected argument of type "array or (\Traversable and \ArrayAccess)", "Proxies__CG__\Portfolio\WorkBundle\Entity\Image" given[/code]

Mon DataTransformer :

[code]
<?php
// src/Acme/TaskBundle/Form/DataTransformer/IssueToNumberTransformer.php
namespace Portfolio\WorkBundle\Form\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Doctrine\Common\Persistence\ObjectManager;
use Portfolio\UserBundle\Entity\User;

class UserImageToCollectionTransformer implements DataTransformerInterface
{
/**

  • @var ObjectManager
    */
    private $om;

    /**

  • @param ObjectManager $om
    */
    public function __construct(ObjectManager $om)
    {
    $this->om = $om;
    }

    public function transform($image)
    {
    $collection = new \Doctrine\Common\Collections\ArrayCollection();

    if (null === $image) {
        return $collection;
    }else{
        return $collection[] = $image;
    }       

    }

    public function reverseTransform($collection_image)
    {
    /if ($collection_image->count() > 1) {
    throw new TransformationFailedException(sprintf(
    'Il ne peut n\'y avoir qu\'une seul image"%s"',
    $collection_image
    ));
    }
    /
    / var_dump($collection_image[0]);
    var_dump($collection_image);
    exit();
    /
    if (!$collection_image) {
    return null;
    }
    var_dump($collection);
    exit();
    return $collection_image[0];
    }
    }
    ?>
    [/code]

Mon UserType :

[code]
<?php

namespace Portfolio\UserBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Portfolio\UserBundle\Entity\User;
use Symfony\Component\Form\FormInterface;
use Portfolio\WorkBundle\Form\ImageType;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Portfolio\WorkBundle\Form\DataTransformer\UserImageToCollectionTransformer;

class UserType extends AbstractType
{
/**

  • @param FormBuilderInterface $builder
  • @param array $options
    */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

    // cela suppose que le gestionnaire d'entité a été passé en option
    $entityManager = $options['em'];
    $transformer = new UserImageToCollectionTransformer($entityManager);
    
    $builder->add(
        $builder
            ->create('image', 'bootstrap_collection', array(
                'type'               => new ImageType(),
                'required'           => false,
                'allow_add'          => true,
                'allow_delete'       => true,
                'sub_widget_col'     => 9,
                'button_col'         => 3,
                'prototype_name'     => 'inlinep',
                'by_reference'       => false,
                'options'            => array(
                    'attr' => array('style' => 'inline')
                )
            ))
            ->addModelTransformer($transformer)
    );

    // ... le reste de mes champs
    [/code]

Mon ImageType :

[code]
<?php
// src/Portfolio/WorkBundle/Form/ImageType.php

namespace Portfolio\WorkBundle\Form;

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

class ImageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', 'file', array('image_path' => 'webPath', 'image_name' => 'UploadDir'))
;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Portfolio\WorkBundle\Entity\Image'
));
}

public function getName()
{
return 'sdz_blogbundle_imagetype';
}
}
[/code]

Auriez vous une idée de mon erreur?

Je vous remercie d'avance pour votre aide

Aucune réponse