Quantcast
Channel: Grafikart | Derniers Sujets du forum
Viewing all articles
Browse latest Browse all 1542

Erreur Datatransformer ManyToMany MediasPickerformType

$
0
0

Bonjour,

Je rencontre un problème avec un dataTransformer entre deux entity avec une relation ManytoMany Unidirectionnel.

J'ai crée un nouveaux type de champs de formulaire mediasPicker pour pouvoir sélectionner les medias déja uploader pour insérer leur url dans un champs string pour ensuite à l'aide du datatransformer les convertir en entity Medias.

J'ai une relation ManyToMany entre un enitity Publications et mon entity Medias. Mon entity Publication possède la relation unidirectionnel.

Je n'est pas d'erreur avec la fonction transform mais lors de la soumission du formulaire j'ai une erreur que je n'arrive pas à comprendre

Ce que je fais

Voici mon entity Publication

<?php

namespace BusinessSocialsBundle\Entity;

use BusinessSocialsBundle\Model\PublicationsInterface; // gedmo annotations
use Gedmo\Mapping\Annotation as Gedmo; // gedmo annotations
use Doctrine\ORM\Mapping as ORM;
use MediasBundle\Entity\Medias;

/**
 * Publications
 *
 * @ORM\Table(name="publications")
 * @ORM\Entity(repositoryClass="BusinessSocialsBundle\Repository\PublicationsRepository")
 */
class Publications implements PublicationsInterface
{

    // ...
    /**
     *
     * @ORM\ManyToMany(targetEntity="MediasBundle\Entity\Medias")
     * @ORM\JoinTable(name="publications_medias",
     *      joinColumns={@ORM\JoinColumn(name="publications_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="medias_id", referencedColumnName="id")}
     *      )
     */
    private $medias;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->medias = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add media
     *
     * @param \MediasBundle\Entity\Medias $media
     *
     * @return Publications
     */
    public function addMedia(\MediasBundle\Entity\Medias $media)
    {
        $this->medias[] = $media;

        return $this;
    }

    /**
     * Remove media
     *
     * @param \MediasBundle\Entity\Medias $media
     */
    public function removeMedia(\MediasBundle\Entity\Medias $media)
    {
        $this->medias->removeElement($media);
    }

    /**
     * Get medias
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getMedias()
    {
        return $this->medias;
    }
 }

Voici mon entity Medias

<?php

namespace MediasBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use MediasBundle\Model\MediaInterface;

/**
 * Medias
 *
 * @Gedmo\Uploadable(path="uploads/medias/", filenameGenerator="ALPHANUMERIC", allowOverwrite=false, appendNumber=true)
 * @ORM\Entity(repositoryClass="MediasBundle\Entity\Repository\MediasRepository")
 * @ORM\Table(name="medias")
 * @ORM\HasLifecycleCallbacks
 */
class Medias implements MediaInterface
{
   // ... reste de l'entity
}

Voici mon PublicationsType pour enregistrer une nouvelle publication

<?php

class PublicationsType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('title')
                ->add('datePublished', DateType::class, array(
                    'widget' => "single_text",
                    'attr'   => array('class' => 'datepicker-numeric'),
                ))
                ->add('medias', MediasPickerType::class)
                ->add('content', CkeditorType::class)
                ->add('enabled', CheckboxType::class ,  array(
                    'attr' => array('class' => 'switchery switchery-info checkbox-right'),
                ))
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'BusinessSocialsBundle\Entity\Publications'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'BusinessSocialsBundle_publications';
    }
}

Et enfin mon Datatransformer

<?php

namespace MediasBundle\Form\DataTransformer;

// MediasBundle
use MediasBundle\Entity\Medias;
use MediasBundle\Entity\Repository\MediasRepository;
// Doctrine
use Doctrine\Common\Collections\ArrayCollection;
// Symfony
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;


class MediasArrayToStringTransformer implements DataTransformerInterface
{
    /**
     * @var \MediasBundle\Entity\Repository\MediasRepository
     */
    protected $mediasRepository;

    /**
     * @var string
     */
    protected $delimiter = ";";

    public function __construct(MediasRepository $mediasRepository)
    {
        $this->mediasRepository = $mediasRepository;
    }

    /**
     * Transforms an object (medias) to a string (number).
     *
     * @param  Medias|null $medias
     * @return string
     */
    public function transform($medias)
    {
        if (empty($medias)) {
            return '';
        }

        if (!$medias instanceof ArrayCollection) {
            throw new TransformationFailedException('Expected an ArrayCollection.');
        }


      /*  foreach ($medias as $file) {
            $value = $file->getPath();
        }*/

        return trim(implode($this->delimiter, $medias->toArray()));
    }

    /**
     * Transforms a string (number) to an object (medias).
     *
     * @param  string $mediasString
     * @return Medias|null
     * @throws TransformationFailedException if object (medias) is not found.
     */
    public function reverseTransform($mediasString)
    {
        if (!is_string($mediasString)) {
            throw new TransformationFailedException('Expected a string.');
        }

        $mediasString = trim($mediasString);
        if (empty($mediasString)) {
            return new ArrayCollection();
        }

        $medias = explode($this->delimiter, $mediasString);
        if (0 === count($medias)) {
            return new ArrayCollection();
        }

        $protocol = '';
        if(isset($_SERVER['HTTPS'])){
            $protocol = ($_SERVER['HTTPS'] && $_SERVER['HTTPS'] != "off") ? "https" : "http";
        }
        else{
            $protocol = 'http';
        }

        $base_url = $protocol . "://".$_SERVER['SERVER_NAME'].'/';

        $mediasCollection = array();
        foreach ($medias as $key => $path) {
            $rel_path = str_replace($base_url, '', $path);
            $item = $this->mediasRepository->findOneBy(array('path' => $rel_path));

            if (!is_null($item)) {
                $mediasCollection[] = $item;
            }
        }

        return new ArrayCollection($mediasCollection);
    }
}

Ce que je veux

J'aimerais utiliser dans n'importe quel formulaire mon type Mediaspicker pour sélectionner n'importe quel medias déjà uploader en string et lors de la soumission le transformer en ArrayCollection.

Ce que j'obtiens

Voici l'erreur que j'obtient lors de la soumission du formulaire:

    Expected argument of type "MediasBundle\Entity\Medias", "array" given

Je n'arrive pas à comprendre la raison car l'entity Publication possède un ArayCollection de medias mais si je comprend bien l'erreur cela m'indique qu'il attend un medias et non une collection.

Si quelqu'un pourrait m'éclairer je le remercie d'avance.


Viewing all articles
Browse latest Browse all 1542

Trending Articles