14

複数のファイルを POST リクエスト (Ajax なし) でアップロードしたい。次のようなタイプ ファイルで Symfony 2 のフォーム コレクション フィールドを使用できますか。

エンティティ内のコード:

public $pictures;

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

フォーム クラスのコード:

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

小枝のコード:

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

試してみましたが、うまくいかないようです。エラーは表示されていませんが、入力ファイルも表示されていません。何か案は?

4

4 に答える 4

5

入力タイプを実際にレンダリングするには、コレクションの 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>

スクリプト:

<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>

これは単なるアイデアです。必要に応じて、まだやるべきことがたくさんあります。これが探していたものではない場合は、回避策として追加ボタンのクリックを呼び出すことができます。

于 2013-05-27T22:03:13.723 に答える
4

複数の入力フィールドを表示したい場合、いいえ、機能しません。コレクション型では、フィールドをレンダリングする前にデータを提供する必要があります。私はすでにそれを試してみましたが、別のエンティティ (ファイルなど) を作成し、ターゲット エンティティに関係を追加することになりました。

例:

class File
{
    // properties

    public $file; // this holds an UploadedFile object

    // getters, setters
}

ファイルの種類:

....

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

製品:

class Product
{
    // properties

    private $images; // ManyToMany relationship

    // setters, getters
}

製品タイプ:

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

製品コントローラ:

public function someAction()
{
    ...

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

}

このソリューションはやり過ぎで、余分なテーブルが作成される可能性があることはわかっていますが、機能します。

于 2015-05-17T20:07:18.043 に答える
2

コレクション内のウィジェットのタイプを指定する必要があります

以下を見てください: 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,
  ),
));

さらに読むために、私はお勧めします

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

また、エンティティのコンストラクターのように初期化すると空になるため、このコレクションに sth を追加して表示する必要があります。

于 2012-09-13T18:39:31.257 に答える
0

フォーム クラスのコードは正しいですが、フォーム フィールドの名前も変更する必要があります。あなたのケースにfull_nameあるはずです。form[pictures][]

実際、sf2.3 ではフォーム フィールド名の変更ができなくなったようですが、sf2.4 では再び可能になります。

https://github.com/bamarni/symfony/commit/35639824e864ed8d4a4cc0d8360f2c73ae08b507#commitcomment-3627879

于 2013-07-13T14:57:45.567 に答える