2012-09-13 15 views
16

Deseo cargar varios archivos con solicitud POST (sin Ajax). ¿Puedo utilizar el campo de recolección de formularios de Symfony 2 con el tipo de archivo como esto:Symfony 2 Campo de recopilación de formularios con tipo de archivo

Código de Entidad:

public $pictures; 

public function __construct() 
{ 
    $this->pictures = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

Código de Clase Forma:

$builder->add('pictures', 'collection', array(
     'type' => 'file', 
     'required' => false, 
     'attr' => array(
      'multiple' => 'multiple' 
     ) 
)); 

Código de la ramita:

{% for picture in form.pictures %} 
    <td> 
     {{ form_widget(picture) }} 
    </td> 
{% endfor %} 

Lo intenté, pero parece que no funciona. No muestra ningún error, pero tampoco muestra el archivo de entrada. ¿Algunas ideas?

Respuesta

3

es necesario especificar el tipo de widget en la colección

Mira el: http://symfony.com/doc/2.0/reference/forms/types/collection.html

$builder->add('pictures', 'collection', array(
    // each item in the array will be an "email" field 
    'type' => 'file', 
    // these options are passed to each "email" type 
    'options' => array(
    'required' => false, 
), 
)); 

Para la lectura adicional Sugiero

http://symfony.com/doc/2.0/reference/forms/types/file.html

También es necesario agregar junto con esta colección para mostrar porque estará vacía cuando se inicialice como en tu constructor de entidad.

+0

Gracias por su respuesta. Lo intenté cientos de veces, pero no funcionó. – Sukhrob

+0

Esto no crea un cuadro de selección de archivos donde es posible seleccionar varios archivos a la vez. – Rvanlaak

+0

Creo que necesita usar un paquete para manejar la carga múltiple. Porque de forma predeterminada creará múltiples cargas de archivos individuales. –

6

Para representar realmente tipos de entrada, deberá establecer la opción allow_add en la colección en true y usar el prototipo de formulario de la colección, javascript y un botón para agregar campos de archivo.

un ejemplo basado en la documentación (Collection- adding and removing)

La forma:

<form action="..." method="POST" {{ form_enctype(form) }}> 
{# ... #} 

{# store the prototype on the data-prototype attribute #} 
<ul id="image-container" class="collection-container" data-prototype="{{ form_widget(form.images.vars.prototype) | e }}"> 
{% for imageField in form.images%} 
    <li> 
     {{ form_widget(imageField) }} 
    </li> 
{% endfor %} 
</ul> 

<a href="#" class="collection-add" data-collection="image-container">Add image</a> 

</form> 

El guión:

<script type="text/javascript"> 
    var imageCount; 

    jQuery(document).ready(function() { 
    $(document).on('click', '.collection-add', function() { 
     var $collectionContainer = $('#' + $(this).data('collection')); 
     if(!imageCount){imageCount = $collectionContainer.children().length;} 
     var prototype = $collectionContainer.attr('data-prototype'); 
     var item = prototype.replace(/__name__/g, imageCount); 
     $collectionContainer.append(item); 
     imageCount++; 
    }); 
    }) 
</script> 

Esto es sólo una idea, todavía hay mucho que hacer en función en tus necesidades Si esto no era lo que estabas buscando, tal vez podrías llamar al botón agregar como una solución alternativa.

5

Si desea mostrar varios campos de entrada, no, no va a funcionar. Un tipo de colección requiere que proporcione algunos datos antes de representar los campos. Ya lo probé, y surgió creando una entidad separada (por ejemplo, Archivo) yy agregando una relación a mi entidad objetivo.

ejemplo:

class File 
{ 
    // properties 

    public $file; // this holds an UploadedFile object 

    // getters, setters 
} 

FileType:

.... 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('file', 'file', [ 
      'required' => false 
     ]) 
    ; 
} 

producto:

class Product 
{ 
    // properties 

    private $images; // ManyToMany relationship 

    // setters, getters 
} 

ProductType:

->add('images', 'collection', [ 
    'type' => 'YOUR_FILE_TYPE_NAME', 
    'by_reference' => false, 
    'required' => false 
]) 

controlador de producto:

public function someAction() 
{ 
    ... 

    $image = new File(); 
    $product->addImage($image); 

} 

sé que esta solución puede ser excesiva y crea tablas adicionales, pero funciona.