2014-02-07 40 views
1

如何仅使用一个文件小部件上传多个图像?目前,我已经禁用了图像映射(否则它会尝试映射到对象的值,但它会在视图中抱怨,因为它是一个数组),但我不知道如何让它们返回到服务中。图像数组。什么是最好的解决方案?Symfony 2.4多文件上传

Service类

/** 
* Service 
* 
* @ORM\Table(name="services") 
* @ORM\Entity 
* @Gedmo\TranslationEntity(class="xxx\SiteBundle\Entity\ServiceTranslation") 
*/ 
class Service 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @Gedmo\Translatable 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="price", type="decimal", scale=2) 
    */ 
    private $price; 

    /** 
    * @var string 
    * 
    * @Gedmo\Slug(fields={"name"}) 
    * @ORM\Column(name="slug", type="string", length=128) 
    */ 
    private $slug; 

    /** 
    * @var string 
    * 
    * @Gedmo\Translatable 
    * @ORM\Column(name="description", type="text") 
    */ 
    private $description; 

    /** 
    * @ORM\OneToMany(
    *  targetEntity="xxx\SiteBundle\Entity\ServiceTranslation", 
    * mappedBy="object", 
    * cascade={"persist", "remove"} 
    *) 
    */ 
    private $translations; 

    /** 
    * @ORM\OneToMany(
    *  targetEntity="xxx\SiteBundle\Entity\Image", mappedBy="service", 
    *  cascade={"persist", "remove"} 
    *) 
    */ 
    private $images; 

    public function __construct() 
    { 
     $this->translations = new ArrayCollection(); 
     $this->images = new ArrayCollection(); 
    } 

    // everything else 

} 

Image类:

/** 
    * Image class. 
    * 
    * @ORM\Table(name="images") 
    * @ORM\Entity 
    * @Gedmo\Uploadable(filenameGenerator="SHA1", allowOverwrite=true, appendNumber=true) 
    */ 
    class Image 
    { 
     /** 
     * @ORM\Id 
     * @ORM\Column(type="integer") 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     private $id; 

     /** 
     * @ORM\Column(type="string", length=255) 
     * @Gedmo\UploadableFileName 
     */ 
     private $name; 

     /** 
     * @ORM\Column(type="string", length=255, nullable=true) 
     * @Gedmo\UploadableFilePath 
     */ 
     private $path; 

     /** 
     * @var 
     */ 
     private $file; 

     /** 
     * @ORM\ManyToOne(targetEntity="xxx\SiteBundle\Entity\Service", inversedBy="images") 
     * @ORM\JoinColumn(name="service_id", referencedColumnName="id") 
     * 
     */ 
     private $service; 

     // everything else 
} 

服务形式类型:

$builder 
    ->add('translations', 'a2lix_translations_gedmo', array(
     'translatable_class' => 'xxx\SiteBundle\Entity\Service', 
     'label' => false, 
     'fields' => array(
      'name' => array(), 
      'price' => array(
       'locale_options' => array(
        'lt' => array(
         'display' => false, 
        ), 
       ), 
      ), 
      'description' => array(), 
     ), 
    )) 
    ->add('images', 'file', array(
     'data_class' => 'xxx\SiteBundle\Entity\Image', 
     'required' => false, 
     'attr' => array(
      'accept' => 'image/*', 
      'multiple' => 'multiple', 
     ), 
     'mapped' => false, 
    )) 
; 

控制器

if ($form->isValid()) { 

    $uploadableManager = $this->get('stof_doctrine_extensions.uploadable.manager'); 

    foreach ($service->getImages() as $image) { 
     $uploadableManager->markEntityToUpload(
      $image, 
      $image->getFile() 
     ); 
    } 

    $em = $this->getDoctrine()->getManager(); 
    $em->persist($service); 
    $em->flush(); 

回答

1

好吧,看来我得到它的工作。

$files = $request->files->get($form->getName()); 
foreach ($files['images'] as $imageData) { 
    $image = new Image(); 

    $uploadableManager->markEntityToUpload(
     $image, 
     $imageData 
    ); 

    $em->persist($image); 
} 

是的,这看起来不那么好,但工程..

+0

谢谢你的帮助...我建议给你的控制器上要做的更多细节。 –

0

一个额外的细节,以节省其他一些时间:你应该设置属性多个作为选项的布尔值文件字段代替人工设置为一个“ATTR”:

->add('images', 'file', array(
    'data_class' => 'xxx\SiteBundle\Entity\Image', 
    'required' => false, 
    'attr' => array(
     'accept' => 'image/*' 
    ), 
    'multiple' => true, 
    'mapped' => false, 
)) 

这种变化确保$文件[“图像”]是在阵列中的任何情况下,因为当我仅选择1个图像,所述Ø bject返回时没有数组,我无法用foreach迭代它。