這是我想要做的:
我有一個經典的 Folder 物體,它包含 OneToMany 關系中的 Sku 物體作為 ArrayCollection。到現在為止還挺好。
我希望 FolderType 能夠在其中動態創建任意數量的 Sku。為此,我遵循 Symfony 快速跟蹤方法在 javascript 中生成原型。效果很好。
現在,在這種檔案夾形式中,“skus”是物體的陣列集合。在 SkuType 中,我有要上傳的檔案。以下是表格(檔案夾和 Sku):
$builder
->add('norlogReference', TextType::class, [
'label' => 'Référence du dossier'
])
->add('skus', CollectionType::class, [
'entry_type' => SkuType::class,
'entry_options' => ['label' => false],
'allow_add' => true,
'allow_delete' => true,
'prototype' => 'skus'
]);
至于 SkuType,這是我的上傳欄位:
->add('picture_1', FileType::class, [
'label' => 'Image 1 du produit',
'mapped' => false,
'required' => false,
'attr' => ['accept' => 'image/*']
])
->add('picture_2', FileType::class, [
'label' => 'Image 2 du produit',
'mapped' => false,
'required' => false,
'attr' => ['accept' => 'image/*']
])
這是接收表單的控制器:
/**
* @Route("/new", name="folder_new")
*/
public function new(Request $request): Response
{
$entityManager = $this->getDoctrine()->getManager();
$norlogFolder = new NorlogFolder();
$form = $this->createForm(NorlogFolderType::class, $norlogFolder);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
foreach ($norlogFolder->getSkus() as $sku) {
I want to get both file objects here, pass them in handleUploadedFile(), and use $sku->setPicture1() and setPicture2 with the $newfileName returned by the private method.
$sku->setFolder($norlogFolder);
$sku->setSKU($norlogFolder->getNorlogReference() . '-' . $sku->getSKU());
}
$entityManager->persist($norlogFolder);
$entityManager->flush();
return $this->redirectToRoute('folder_edit', ['id' => $norlogFolder->getId()]);
}
return $this->render('folder/new.html.twig', [
'form' => $form->createView(),
]);
}
以及我想用來處理檔案的小私有方法:
private function handleUploadedFile(UploadedFile $uploadedFile): string
{
$destination = $this->getParameter('kernel.project_dir').'/public/uploads/sku_medias';
$originalFilename = pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_FILENAME);
$newFilename = $originalFilename . '-' . uniqid() . '.' . $uploadedFile->guessExtension();
$uploadedFile->move(
$destination,
$newFilename
);
return $newFilename;
}
和檔案夾表單視圖:
{{ form_start(form, {
attr: {
class: 'sku-form'
}
}) }}
<div class="form-group">
{{ form_row(form.norlogReference, {
attr: {
placeholder: 'ex: XOTP-25',
class: 'sku-form-input'
}
}) }}
</div>
<div class="form-group sku-row skus" data-prototype="{{ form_widget(form.skus.vars.prototype)|e('html_attr') }}">
{% if form.skus|length > 0 %}
{% for sku in form.skus %}
<div hljs-string">">
<div hljs-string">">
<p hljs-number">3 text-center">Produit #{{ loop.index }}</p>
<a href="{{ path('sku_delete', {id: sku.vars.data.id}) }}"
hljs-string">"><i hljs-string">"></i></a>
</div>
<span hljs-string">">Voir</span>
<div hljs-number">12 sku-fields-bloc">
<div hljs-string">">
{{ form_row(sku.SKU, {
attr: {
placeholder: 'ex: XVF-25663',
class: 'sku-form-input'
}
}) }}
</div>
<div hljs-string">">
<div hljs-string">">
{{ form_label(sku.marque) }}
{{ form_widget(sku.marque, {
attr: {
class: 'sku-form-input'
}
}) }}
{{ form_label(sku.taille) }}
{{ form_widget(sku.taille, {
attr: {
class: 'sku-form-input'
}
}) }}
{{ form_label(sku.designation) }}
{{ form_widget(sku.designation, {
attr: {
class: 'sku-form-input'
}
}) }}
{{ form_label(sku.couleur) }}
{{ form_widget(sku.couleur, {
attr: {
class: 'sku-form-input'
}
}) }}
{{ form_label(sku.etat) }}
{{ form_widget(sku.etat, {
attr: {
class: 'sku-form-input'
}
}) }}
{{ form_label(sku.composition) }}
{{ form_widget(sku.composition, {
attr: {
class: 'sku-form-input'
}
}) }}
</div>
</div>
<div hljs-number">3">
{{ form_row(sku.picture_1, {
attr: {
placeholder: 'Image 1',
class: 'sku-form-input'
}
}) }}
</div>
<div hljs-number">3">
{{ form_row(sku.picture_2, {
attr: {
placeholder: 'Image 2',
class: 'sku-form-input'
}
}) }}
</div>
</div>
</div>
{% endfor %}
{% else %}
<div hljs-string">">
<div hljs-number">12 mt-4">
<p hljs-number">3 bg-info">Pas encore de {{ form_label(form.skus) }} ajoutés</p>
{{ form_widget(form.skus) }}
</div>
</div>
{% endif %}
</div>
<div hljs-string">">
<div hljs-number">4">
<button type="button" hljs-number">100 mt-2 mb-2 add_item_link"
data-collection-holder-hljs-string">">
Ajouter Sku
</button>
</div>
<div hljs-number">4">
<button type="submit"
hljs-number">100 mt-2 mb-2">{{ button_label|default('Enregistrer') }}</button>
</div>
<div hljs-number">4">
<a href="{{ path('folder_list') }}"
hljs-number">100 mt-2 mb-2">Retour liste</a>
</div>
</div>
{{ form_end(form) }}
所以問題是:如何通過 Sku 在控制器端獲取這些 picture_1 和 2 個物件(而不是我已經擁有的路徑),以便像往常一樣處理檔案?
我試過 :
- $request->files->get() (result = null,我在表單中有正確的enctype)
- $sku->getPicture_1()(結果 = 臨時 linux 路徑,但是否有一種簡單的方法可以從中檢索檔案,并且在每個作業系統上?)
- 試圖從 sku 回圈內部訪問 $form (result = nada)
- $request->get('picture_1') 和 ->getData()
- 我忘記了各種奇怪的嘗試,但什么也沒給我
我可能會錯過一些明顯的東西,但我不能再正確思考這個專案了。請暫時不要介意必要的重構 =) Ty !
uj5u.com熱心網友回復:
你的picuter_1和picture_2是mapped: false。這意味著,你必須使用->getData()(或可能->getNormData())上的每個SkuType或您的NorlogFolderType
而不是通過SKU的物體集合,遍歷SKU formtypes回圈并獲得直接從資料'picture_1'和'picture_2'場
if ($form->isSubmitted() && $form->isValid())
{
if ($form->has('skus'))
{
foreach ($form->get('skus') as $skuForm)
{
// always check if field named 'picture_1' is there
if ($skuForm->has('picture_1'))
{
/** @var \Symfony\Component\HttpFoundation\File\UploadedFile $firstPic */
$firstPic = $skuForm->get('picture_1')->getData();
//todo: maybe check if null
$picOne = $this->handleUploadedFile($firstPic);
}
// do the same with picture_2 (and others if any)
}
}
}
uj5u.com熱心網友回復:
使用'mapped' => false,您需要像這樣處理上傳的集合:
if ($form->isSubmitted() && $form->isValid()) {
foreach ($form->get('skus') as $formChild)
{
// Get the unmapped picture fields
$uploadedPicture1 = $formChild->get('picture_1')->getData();
$uploadedPicture2 = $formChild->get('picture_2')->getData();
// Get the sku
$sku = $formChild->getData();
// Upload the pictures
$picture1Filename = $this->handleUploadedFile($uploadedPicture1);
$picture2Filename = $this->handleUploadedFile($uploadedPicture2);
// Set the new filenames onto the sku
$sku->setPicture1($picture1Filename);
$sku->setPicture2($picture2Filename);
// Your original code
$sku->setFolder($norlogFolder);
$sku->setSKU($norlogFolder->getNorlogReference() . '-' . $sku->getSKU());
}
}
$entityManager->persist($norlogFolder);
$entityManager->flush();
return $this->redirectToRoute('folder_edit', ['id' => $norlogFolder->getId()]);
}
編輯:請檢查圖片是否實際上傳,如其他答案。:-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/322533.html
