Posté(e) le 21 août 20159 a Salutations à tous, Encore une fois je fais appelle à vos super pouvoirs d'INpactiens, et encore une fois pour Symfony. Bref, voici mon problème : J'ai un formulaire pour upload une vidéo, avec titre etc... Et 2 champs files, l'un pour la vidéo et l'autre pour l'image. Donc histoire qu'on ne puisse pas upload n'importe quoi, j'utilise les validators normal.... Quand j'upload la vidéo et l'image au bon format selon la restriction que j'ai mis aucun soucis ça fonctionne parfaitement. Par contre dès lors que mon champs est pas valide, par là j'essaye d'upload un pdf pour mon champs vidéo par exemple symfony2 me soulève une belle exception au lieu d'utiliser le message : Et l'autre problème du coup, c'est que je suis obligé de vider le cache de mon navigateur sinon mon appli est plantée. :( Je comprends pas pourquoi, et je bloque sur ça :) Mon entité video : (mon entité videoup et image est lié à celle ci) <?php// Remettre Assert// @Assert\Regex(pattern="/^([a-zA-Zâàäçéèëêïîôöùüû])+([a-zA-Z0-9.âàäçéèëêïîôöùüû-]||\')*$/")namespace Tim\VideothequeBundle\Entity;use Doctrine\ORM\Mapping as ORM;use Symfony\Component\HttpFoundation\File\UploadedFile;use Symfony\Component\Validator\Constraints as Assert;/** * Video * * @ORM\Table(name="video") * @ORM\Entity(repositoryClass="Tim\VideothequeBundle\Repository\VideoRepository") * @ORM\HasLifecycleCallbacks */class Video{ /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="description", type="text", nullable=false) * */ private $description; /** * @var string * * @ORM\Column(name="nom_video", type="string", length=255, nullable=false) * */ private $nomVideo; /** * @var string * * @ORM\Column(name="author", type="string", length=255, nullable=true) * */ private $author; /** * @var string * * @ORM\Column(name="description_short", type="text", nullable=false) * */ private $descriptionShort; /** * @var boolean * * @ORM\Column(name="active", type="boolean", nullable=true) */ private $active; /** * @ORM\ManyToMany(targetEntity="Tim\VideothequeBundle\Entity\Categorie", inversedBy="videos", cascade={"persist"}) * @ORM\JoinColumn(nullable=true) */ private $categories; /** * @ORM\ManyToMany(targetEntity="Tim\VideothequeBundle\Entity\Tag", inversedBy="videos", cascade={"persist"}) * @ORM\JoinColumn(nullable=true) */ private $tags; /** * @ORM\OneToOne(targetEntity="Tim\VideothequeBundle\Entity\Image", cascade={"persist", "remove"}) * @ORM\JoinColumn(nullable=true) * @Assert\Valid() * */ protected $image; /** * @ORM\OneToOne(targetEntity="Tim\VideothequeBundle\Entity\VideoUp", cascade={"persist", "remove"}) * @ORM\JoinColumn(nullable=false) * @Assert\Valid() * */ private $videoUp; Mon entité Image : <?phpnamespace Tim\VideothequeBundle\Entity;use Doctrine\ORM\Mapping as ORM;use Symfony\Component\HttpFoundation\File\UploadedFile;use Symfony\Component\Validator\Constraints as Assert;/** * Image * * @ORM\Table(name="image") * @ORM\Entity(repositoryClass="Tim\VideothequeBundle\Repository\ImageRepository") * @ORM\HasLifecycleCallBacks */class Image{ /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @Assert\Image( * mimeTypes = {"image/jpg", "image/jpeg", "image/png"}, * mimeTypesMessage = "Les images doivent être au format JPG, PNG." * ) */ protected $file; private $tempFilename; /** * @var string * * @ORM\Column(name="url", type="string", length=255, nullable=false) */ private $url; /** * @var string * * @ORM\Column(name="alt", type="string", length=255, nullable=true) */ private $alt; Mon entité videoup : <?phpnamespace Tim\VideothequeBundle\Entity;use Doctrine\ORM\Mapping as ORM;use Symfony\Component\HttpFoundation\File\UploadedFile;use Symfony\Component\Validator\Constraints as Assert;/** * VideoUp * * @ORM\Table(name="videoup") * @ORM\Entity(repositoryClass="Tim\VideothequeBundle\Repository\VideoUpRepository") * @ORM\HasLifecycleCallbacks */class VideoUp{ /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="extension", type="string", length=255) */ private $extension; /** * @Assert\File( * mimeTypes={"video/mp4"}, * mimeTypesMessage="Veuillez uploader une vidéo au format mp4 !" * ) */ private $file; private $tempFilename; Mon formtype : <?phpnamespace Tim\VideothequeBundle\Form;use Symfony\Component\Form\AbstractType;use Symfony\Component\Form\FormBuilderInterface;use Symfony\Component\OptionsResolver\OptionsResolverInterface;use Tim\VideothequeBundle\Form\ImageType;use Tim\VideothequeBundle\Form\VideoUpType;class VideoType extends AbstractType{ /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('nomVideo', 'text', array('required' => true)) ->add('description', 'textarea', array('required' => true)) ->add('descriptionShort', 'textarea', array('required' => true, 'label' => 'Résumé')) ->add('active', 'checkbox', array('required' => false)) ->add('categories', 'entity', array( 'class' => 'TimVideothequeBundle:Categorie', 'property' => 'libelle', 'multiple' => true, 'expanded' => true, 'required' => false, )) ->add('tags', 'entity', array( 'class' => 'TimVideothequeBundle:Tag', 'property' => 'libelle', 'multiple' => true, 'expanded' => true, 'required' => false, )) ->add('videoUp', new VideoUpType()) ->add('image', new ImageType()) ; } /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Tim\VideothequeBundle\Entity\Video' )); } /** * @return string */ public function getName() { return 'tim_videothequebundle_video'; }} Et enfin mon action dans le controller : public function ajouterAction() { $User = $this->container->get('security.context')->getToken()->getUser(); $Video = new Video(); $Video->setAuthor($User->getUsername()); $form = $this->createForm(new VideoType, $Video); $request = $this->get('request'); if($request->getMethod() == 'POST') { $form->handleRequest($request); if($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($Video); $em->flush(); return $this->redirect($this->generateUrl('tim_videotheque_accueil')); } else { $this->get('session')->getFlashBag()->add('notice', $form->getErrors()); } } return $this->render('TimVideothequeBundle:Videotheque:ajoutervideo.html.twig', array( 'form' => $form->createView(), )); } Merci d'avance Note : J'ai pas mis le code entier des entités c'est normal, si besoin demandez moi Modifié le 21 août 20159 a par Cara62
Posté(e) le 21 août 20159 a Auteur Je reprécise, L'upload en lui même fonctionne parfaitement. C'est juste avec le validator que ça fonctionne pas... <?phpnamespace Tim\VideothequeBundle\Entity;use Doctrine\ORM\Mapping as ORM;use Symfony\Component\HttpFoundation\File\UploadedFile;use Symfony\Component\Validator\Constraints as Assert;/** * Image * * @ORM\Table(name="image") * @ORM\Entity(repositoryClass="Tim\VideothequeBundle\Repository\ImageRepository") * @ORM\HasLifecycleCallBacks */class Image{ /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @Assert\Image( * mimeTypes = {"image/jpg", "image/jpeg", "image/png"}, * mimeTypesMessage = "Les images doivent être au format JPG, PNG." * ) */ protected $file; private $tempFilename; /** * @var string * * @ORM\Column(name="url", type="string", length=255, nullable=false) */ private $url; /** * @var string * * @ORM\Column(name="alt", type="string", length=255, nullable=true) */ private $alt; public function getFile() { return $this->file; } public function setFile(UploadedFile $file) { $this->file = $file; if (null !== $this->url) { $this->tempFilename = $this->url; $this->url = null; $this->alt = null; } } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * @ORM\PrePersist() * @ORM\PreUpdate() */ public function preUpload() { if (null === $this->file) { return; } $this->url = $this->file->guessExtension(); //var_dump($this->url); //die; $this->alt = $this->file->getClientOriginalName(); } /** * @ORM\PostPersist() * @ORM\PostUpdate() */ public function upload() { if (null === $this->file) { return; } if (null !== $this->tempFilename) { $oldFile = $this->getUploadRootDir().'/'.$this->id.'.'.$this->tempFilename; if (file_exists($oldFile)) { unlink($oldFile); } } $this->file->move( $this->getUploadRootDir(), $this->id.'.'.$this->url ); } /** * @ORM\PreRemove() */ public function preRemoveUpload() { $this->tempFilename = $this->getUploadRootDir().'/'.$this->id.'.'.$this->url; } /** * @ORM\PostRemove() */ public function removeUpload() { if (file_exists($this->tempFilename)) { unlink($this->tempFilename); } } public function getUploadDir() { return 'bundles/timvideotheque/images'; } public function getUploadRootDir() { return __DIR__.'/../../../../web/'.$this->getUploadDir(); } public function getWebPath() { return $this->getuploadDir().'/'.$this->getId().'.'.$this->getUrl(); } /** * Set url * * @param string $url * @return Image */ public function setUrl($url) { $this->url = $url; return $this; } /** * Get url * * @return string */ public function getUrl() { return $this->url; } /** * Set alt * * @param string $alt * @return Image */ public function setAlt($alt) { $this->alt = $alt; return $this; } /** * Get alt * * @return string */ public function getAlt() { return $this->alt; } /* public function __sleep(){ $ref = new \ReflectionClass(__CLASS__); $props = $ref->getProperties(\ReflectionProperty::IS_PROTECTED); $serialize_fields = array(); foreach ($props as $prop) { $serialize_fields[] = $prop->name; } return $serialize_fields;} }*/ Voici l'exemple de mon entité Image avec les fonctions upload etc... Le var_dump dégueulasse de "$this" dans mon action d'ajout vidéo : sachant qu'apparemment au niveau de l'action dans mon controller l'exception est soulevée à partir de "$form->handleRequest($request)", il rentre même pas dans ma condition pour valider le formulaire. Modifié le 21 août 20159 a par Cara62
Posté(e) le 24 août 20159 a Auteur Bon j'arrive vraiment pas à trouver la solution, même en ajoutant ma contrainte directement dans le formType au lieu de l'entité j'ai la même exception..... phoque
Posté(e) le 7 septembre 20159 a Salut tu as trouvé une solution ?? Le soucie est que ton $file est n'est pas protected il me semble. Je n'ai pas eu ce problème la mais peux etre que tu doit ajouter a ton entity ceci : class Image implements \Serializable et public function serialize(){ return serialize(array( //tes champs $this->id, $this->file, $this->url, $this->tempFilename, $this->alt ));}public function unserialize($serialized){ list ( //tes champs $this->id, $this->file, $this->url, $this->tempFilename, $this->alt ) = unserialize($serialized);} J'espere que ca t'aideras :) Modifié le 15 septembre 20159 a par maximeK
Posté(e) le 10 septembre 20159 a Auteur Pour te répondre, on m'avait proposé cette solution sur le fofo du sdz, et ça ne résout pas le problème :( Le pire pour un autre projet de site ebook je vais avoir le même problème... :/ Modifié le 10 septembre 20159 a par Cara62
Posté(e) le 15 septembre 20159 a Si tu met tout tes fields en protected avec la fonction __sleep() sa marche toujours pas ? car \ReflectionProperty::IS_PROTECTED ne prend que les champs protected
Posté(e) le 16 septembre 20159 a Auteur Salut, j'ai essayé avec toutes les propriétés en protected, mais non ça change rien. Je me demande de plus en plus si ça vient pas de mon Apache...
Posté(e) le 21 septembre 20159 a As-tu essayer a tout hasard de passer par un bundle genre celui ci : http://knpbundles.com/dustin10/VichUploaderBundle ou http://knpbundles.com/sonata-project/SonataMediaBundle Peux-etre que ca te permettras de resoudre contourner ton probleme
Posté(e) le 22 septembre 20159 a Auteur As-tu essayer a tout hasard de passer par un bundle genre celui ci : http://knpbundles.com/dustin10/VichUploaderBundle ou http://knpbundles.com/sonata-project/SonataMediaBundle Peux-etre que ca te permettras de resoudre contourner ton probleme Ah non c'est vrai pas du tout pensé à ça... En même temps utiliser un bundle alors qu'à la base quelques lignes de codes suffisent... Bref, j'utiliserai pour mon autre projet je verrai bien merci
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.