FilePond というプラグインを使用して、VichUploaderBundle で画像をアップロードする際の見栄えを良くしています。したがって、バンドルのデフォルトの form_row テンプレートを回避するために、カスタム テンプレートを作成しました。
//template/forms/upload_image.html.twig
{% block _image_file_row %}
<input type="file" class="filepond-initialise" name="image[file][file]" required="required" accept=".gif, .jpg, .png">
{% endblock %}
次に、ページにテンプレートをレンダリングします。
{% form_theme form 'forms/upload_image.html.twig' %}
{{ form_start(form) }}
{{ form_row(form.file) }}
<h3>Tags</h3>
<ul class="tags list-inline" data-prototype="{{ form_widget(form.tags.vars.prototype.name)|e('html_attr') }}">
{% for tag in form.tags %}
<li>{{ form_row(tag.name) }}</li>
{% endfor %}
</ul>
<button class="btn btn-success btn-block" type="submit">Upload</button>
<input type="hidden" name="token" value="{{ csrf_token('image-upload') }}">
{{ form_end(form, {'render_rest': false}) }}
そして、これはコントローラーのアクションです:
public function upload(Request $request):Response
{
$image = new Image();
$form = $this->createForm(ImageType::class, $image);
$token = $request->request->get('token');
$form->handleRequest($request);
if ($form->isSubmitted() && $this->isCsrfTokenValid('image-upload', $token)) {
dump($image);
dump($form->getData());
$this->em->persist($image);
$this->em->flush();
return $this->redirectToRoute('admin_image_index');
}
return $this->render('admin/image/upload.html.twig', array(
'form' => $form->createView()
));
}
フォーム送信でファイル入力の内容が送信されていないように見える問題。name プロパティ null のエラーが発生します。
An exception occurred while executing 'INSERT INTO image (name, updated_at) VALUES (?, ?)' with params [null, "2019-05-14 22:42:18"]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null
以下のように $image 変数と $form-getData() をダンプします。
Image {#496 ▼
-id: null
-file: null
-name: null
-updatedAt: DateTime @1557873995 {#497 ▼
date: 2019-05-14 22:46:35.496026 UTC (+00:00)
}
-tags: ArrayCollection {#498 ▼
-elements: array:3 [▼
0 => Tag {#901 ▼
-id: null
-name: "sport"
-images: ArrayCollection {#902 ▶}
}
1 => Tag {#878 ▼
-id: null
-name: "nature"
-images: ArrayCollection {#905 ▶}
}
2 => Tag {#906 ▼
-id: null
-name: "fashion"
-images: ArrayCollection {#908 ▶}
}
]
}
}
タグ入力は正常に機能していますが、問題はファイル入力にあることを意味します。
ImageType.php のビルダーは次のとおりです。残りはデフォルトです。
$builder
->add('file', VichImageType::class)
->add('tags', CollectionType::class, [
'entry_type' => TagType::class,
'entry_options' => ['label' => false],
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
])
;