Cara62 Posté(e) le 21 août 2015 Partager Posté(e) le 21 août 2015 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cara62 Posté(e) le 21 août 2015 Auteur Partager Posté(e) le 21 août 2015 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cara62 Posté(e) le 24 août 2015 Auteur Partager Posté(e) le 24 août 2015 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
maximeK Posté(e) le 7 septembre 2015 Partager Posté(e) le 7 septembre 2015 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 :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cara62 Posté(e) le 10 septembre 2015 Auteur Partager Posté(e) le 10 septembre 2015 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... :/ Lien vers le commentaire Partager sur d’autres sites More sharing options...
maximeK Posté(e) le 15 septembre 2015 Partager Posté(e) le 15 septembre 2015 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cara62 Posté(e) le 16 septembre 2015 Auteur Partager Posté(e) le 16 septembre 2015 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... Lien vers le commentaire Partager sur d’autres sites More sharing options...
maximeK Posté(e) le 21 septembre 2015 Partager Posté(e) le 21 septembre 2015 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cara62 Posté(e) le 22 septembre 2015 Auteur Partager Posté(e) le 22 septembre 2015 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.