Cara62 Posted August 21, 2015 Share Posted August 21, 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 Link to comment Share on other sites More sharing options...
Cara62 Posted August 21, 2015 Author Share Posted August 21, 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. Link to comment Share on other sites More sharing options...
Cara62 Posted August 24, 2015 Author Share Posted August 24, 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 Link to comment Share on other sites More sharing options...
maximeK Posted September 7, 2015 Share Posted September 7, 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 :) Link to comment Share on other sites More sharing options...
Cara62 Posted September 10, 2015 Author Share Posted September 10, 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... :/ Link to comment Share on other sites More sharing options...
maximeK Posted September 15, 2015 Share Posted September 15, 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 Link to comment Share on other sites More sharing options...
Cara62 Posted September 16, 2015 Author Share Posted September 16, 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... Link to comment Share on other sites More sharing options...
maximeK Posted September 21, 2015 Share Posted September 21, 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 Link to comment Share on other sites More sharing options...
Cara62 Posted September 22, 2015 Author Share Posted September 22, 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 Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.