2016-01-22 2 views
1

Идея состоит в том, чтобы добавить файл (фотографию) пользователю или другому объекту. Я решил, что этот файл может иметь свой собственный носитель.Невозможно вставить форму файла в другую форму в Symfony 2.8

Как объяснено в симфони книге, я создал функцию добавления файла в сущности СМИ:

<?php 

namespace AdminBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\HttpFoundation\File\UploadedFile; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* Media 
* 
* @ORM\Table(name="Media", indexes={@ORM\Index(name="fk_Media_Cat_Media1_idx", columns={"Cat_Media_ID"})}) 
* @ORM\Entity 
*/ 
class Media 
{ 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="Libelle", type="string", length=45, nullable=true) 
    */ 
    private $libelle; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="ID", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var \AdminBundle\Entity\CatMedia 
    * 
    * @ORM\ManyToOne(targetEntity="AdminBundle\Entity\CatMedia") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="Cat_Media_ID", referencedColumnName="ID") 
    * }) 
    */ 
    private $catMedia; 


    /** 
    * @ORM\Column(type="string") 
    * 
    * 
    * @Assert\File(mimeTypes={ "application/image" }) 
    */ 
    private $file; 



    /** 
    * Set libelle 
    * 
    * @param string $libelle 
    * @return Media 
    */ 
    public function setLibelle($libelle) 
    { 
     $this->libelle = $libelle; 

     return $this; 
    } 

    /** 
    * Get libelle 
    * 
    * @return string 
    */ 
    public function getLibelle() 
    { 
     return $this->libelle; 
    } 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set catMedia 
    * 
    * @param \AdminBundle\Entity\CatMedia $catMedia 
    * @return Media 
    */ 
    public function setCatMedia(\AdminBundle\Entity\CatMedia $catMedia = null) 
    { 
     $this->catMedia = $catMedia; 

     return $this; 
    } 

    /** 
    * Get catMedia 
    * 
    * @return \AdminBundle\Entity\CatMedia 
    */ 
    public function getCatMedia() 
    { 
     return $this->catMedia; 
    } 



    public function setfile($file) 
    { 
     $this->file = $file; 

     return $this; 
    } 


    public function getFile() 
    { 
     return $this->file; 
    } 


} 

Затем я создал медиа FormType с загрузкой файла:

<?php 

namespace AdminBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Form\Extension\Core\Type\FileType; 

class MediaType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('libelle') 
      ->add('catmedia','entity', array('class'=>'AdminBundle:CatMedia', 
       'property'=>'libelle')) 
      ->add('file', FileType::class, array('label' => 'Image (Png or jpg file)')) 
     ; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AdminBundle\Entity\Media' 
     )); 
    } 
} 

И теперь , я хочу вставить эту форму в свою форму:

<?php 

namespace AdminBundle\Form; 

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

class UtilisateurType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('nom') 
      ->add('prenom') 
      ->add('societe') 
      ->add('mail') 
      ->add('tel') 
      ->add('password') 
      ->add('catutilisateur','entity', array('class'=>'AdminBundle:CatUtilisateur', 
       'property'=>'libelle')) 
      ->add('media','entity', array('class'=>'AdminBundle:Media')) 



     ; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AdminBundle\Entity\Utilisateur' 
     )); 
    } 
} 

Но в моем новом представлении пользователя это res ии:

enter image description here

некоторые детали: - я нахожусь в Symfony 2.8 - я использовал загрузку Symfony в эту часть (http://symfony.com/doc/2.8/cookbook/controller/upload_file.html) Я знаю, что я могу использовать VichUploaderBundle, но я хочу, чтобы узнать первым.

Заранее благодарим за вашу помощь. Надеюсь, я был достаточно ясным, и мой плохой английский не создаст слишком много проблем с пониманием.

Редактировать: я пытаюсь создать службу MediaType.

в моем медиа FormType, я добавил:

private $mediaService; 

public function __construct(MediaService $mediaService) 
{ 
    $this->mediaService = $mediaService; 
} 

(как описано в книге симфони)

И в моем приложение/Config/services.yml:

admin.form.mediatype: 
    class: AdminBundle\Form\MediaType 

    tags: 
     - { name: form.type } 

В моей Utilisateur FormType, i add:

->add('media', MediaType::class) 

Теперь у меня есть ошибки:

Catchable Fatal Error: Argument 1 passed to AdminBundle\Form\MediaType::__construct() must be an instance of AdminBundle\Form\MediaService, none given, called in /var/www/erdf/app/cache/dev/appDevDebugProjectContainer.php on line 294 and defined 

ответ

0

поле типа "entity" только позволяет получать из уже существующих объектов в базе данных. Прямо там, вы хотите использовать тип формы MediaType, который вы определили. Для этого:

1) Определите свой MediaType как услугу. Например, с помощью YML:

services: 
     app.form.media: 
      class: AdminBundle\Form\MediaType 
      public: false 
      tags: 
       - { name: form.type } 

2) Заменить

->add('media','entity', array('class'=>'AdminBundle:Media')) 

по:

->add('media', MediaType::class) 

И это должно быть немного лучше уже. Теперь вы можете настроить отображение своей формы через темы формы (отметьте the documentation for defining custom FormTypes)

+0

Эй! thx для вашей помощи :) ok У меня есть ошибка: «Не удалось загрузить тип« media »». Я редактировал свое сообщение с подробностями. – MeursaultF

+0

Я тоже отредактировал; попробуйте 'MediaType :: class' вместо' 'media''.Об ошибке «service» вам не нужно создавать новый класс, вам просто нужно взять свой MediaType и определить его в you services.yml. Я снова отредактирую. – Terenoth

+0

Я отредактировал часть сервиса, чтобы включить определение сервиса в YML. Как вы можете видеть, я объявил 'AdminBundle \ Form \ MediaType' как службу, и я поместил тег' form.type', чтобы Symfony понял, что вы определили новый тип поля. Для получения дополнительной информации о Service Container см. Здесь: http://symfony.com/doc/current/book/service_container.html – Terenoth

Смежные вопросы