我想用POST请求上传多个文件(没有Ajax).我可以将Symfony 2的表单集合字段与类型文件一起使用,如下所示:
实体代码:
public $pictures;
public function __construct()
{
$this->pictures = new \Doctrine\Common\Collections\ArrayCollection();
}
Run Code Online (Sandbox Code Playgroud)
表格类代码:
$builder->add('pictures', 'collection', array(
'type' => 'file',
'required' => false,
'attr' => array(
'multiple' => 'multiple'
)
));
Run Code Online (Sandbox Code Playgroud)
Twig中的代码:
{% for picture in form.pictures %}
<td>
{{ form_widget(picture) }}
</td>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我试过了,但似乎没有用.它没有显示任何错误,但它也没有显示输入文件.有任何想法吗?
要实际呈现输入类型,您需要将集合中的allow_add选项设置为true,并使用集合的表单原型,javascript和按钮来添加文件字段.
基于文档的示例(集合 - 添加和删除)
表格:
<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>
Run Code Online (Sandbox Code Playgroud)
剧本:
<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>
Run Code Online (Sandbox Code Playgroud)
这只是一个想法,根据您的需要还有很多工作要做.如果这不是您想要的,也许您可以调用添加按钮单击作为解决方法.
如果要显示多个输入字段,则不起作用.集合类型要求您在渲染字段之前提供一些数据.我已经尝试过,然后创建了一个单独的实体(例如File)并添加了与我的目标实体的关系.
例:
class File
{
// properties
public $file; // this holds an UploadedFile object
// getters, setters
}
Run Code Online (Sandbox Code Playgroud)
文件类型:
....
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', 'file', [
'required' => false
])
;
}
Run Code Online (Sandbox Code Playgroud)
产品:
class Product
{
// properties
private $images; // ManyToMany relationship
// setters, getters
}
Run Code Online (Sandbox Code Playgroud)
产品类别:
->add('images', 'collection', [
'type' => 'YOUR_FILE_TYPE_NAME',
'by_reference' => false,
'required' => false
])
Run Code Online (Sandbox Code Playgroud)
产品控制器:
public function someAction()
{
...
$image = new File();
$product->addImage($image);
}
Run Code Online (Sandbox Code Playgroud)
我知道这个解决方案可能会过度使用并创建额外的表,但它可以工作.
您需要指定集合中小部件的类型
看看: 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,
),
));
Run Code Online (Sandbox Code Playgroud)
为了进一步阅读,我建议
http://symfony.com/doc/2.0/reference/forms/types/file.html
此外,您还需要将某些内容添加到此集合中以显示,因为在初始化时它将为空,就像在实体的构造函数中一样。
归档时间: |
|
查看次数: |
12162 次 |
最近记录: |