我正在用 Symfony 5 做一個應用程式,但有一個問題我找不到解決方案,我不知道。
我想制作一種物體“人”的形式。一個人可以在他的家人中添加另一個人。
因此,在我的物體中,我對 Person 進行了多對多自參考。
class Person
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=50)
*/
private $name;
/**
* @ORM\Column(type="string", length=50)
*/
private $firstname;
/**
* @ORM\Column(type="string", length=255)
*/
private $birthdaydate;
/**
* @ORM\Column(type="string", length=255)
*/
private $gender;
/**
* @ManyToMany(targetEntity="Person")
* @JoinTable(name="family",
* joinColumns={@JoinColumn(name="person__id", referencedColumnName="person__id")},
* inverseJoinColumns={@JoinColumn(name="family_id", referencedColumnName="person__id")}
* )
*/
private $myFamily;
現在,我想制作一個表單,我可以在其中添加新的 Person,在一個人中。我做了一個 CollectionType,就像 symfony 說的那樣,但是當我想將它列印到頁面時,由于無限回圈而超時。
這是導致問題的“allow_add”。
我需要“allow_add”回傳的原型變數在前面添加新欄位。
class PersonType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name', TextType::class, ['attr' => ['class' => 'form_textfield']])
->add('firstname')
->add('birthdayDate', TextType::class, ['attr' => ['class' => 'form_datetime']])
->add('gender', GenderType::class)
->add('submit', SubmitType::class)
->add('myFamily', CollectionType::class, array('entry_type' => PersonType::class, 'mapped' => false, 'allow_add' => true, 'by_reference' => false, 'allow_delete' => true));
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Person::class,
]);
}
}
這是我的表格,但沒有什么有趣的,當我解決這個問題時,我會添加必要的js。
{% extends 'base.html.twig' %}
{% block title %}Hello PersonController!
{% endblock %}
{% block body %}
{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.firstname) }}
{{ form_row(form.birthdayDate) }}
{{ form_row(form.gender) }}
{{ form_row(form.myFamily) }}
<button type="button" class="add_item_link" data-collection-holder-class="tags">Add a tag</but
{{ form_end(form) }}
{% endblock %}
提前謝謝大家。
uj5u.com熱心網友回復:
存在無限回圈,因為 myFamily 屬性參考了一個 Person 物體,該物體本身參考了一個 myFamily 屬性......
為簡單起見,管理一個人的家庭的一種方法是創建一個單獨的家庭物體。從 Person 的角度來看,與家庭的 ManyToOne 關系似乎更加連貫。之后,您可以使用 PersonFormType 中的 EntityType:class 添加 Person 的家庭。
這是 EntityType 的檔案:https : //symfony.com/doc/current/reference/forms/types/entity.html
uj5u.com熱心網友回復:
Dylan Kas 的回答很好,只是增加了一個新形式,很好。
人形
class PersonType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name', TextType::class, ['attr' => ['class' => 'form_textfield']])
->add('firstname')
->add('birthdayDate', TextType::class, ['attr' => ['class' => 'form_datetime']])
->add('gender', GenderType::class)
->add('submit', SubmitType::class)
->add('myFamily', CollectionType::class, array('entry_type' => ChildType::class, 'by_reference' => false, 'allow_add' => true, 'allow_delete' => true));
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Person::class,
]);
}
}
孩子,由 myFamily 參考:
class ChildType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name', TextType::class, ['attr' => ['class' => 'form_textfield']])
->add('firstname')
->add('birthdayDate', TextType::class, ['attr' => ['class' => 'form_datetime']])
->add('gender', GenderType::class)
->add('submit', SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Person::class,
]);
}
}
和觀點:
{% block body %}
{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.firstname) }}
{{ form_row(form.birthdayDate) }}
{{ form_row(form.gender) }}
<button type="button" class="add_item_link" data-collection-holder-class="myFamily">Add a tag</button>
<ul class="myFamily" data-index="{{ form.myFamily|length > 0 ? form.myFamily|last.vars.name 1 : 0 }}" data-prototype="{{ form_widget(form.myFamily.vars.prototype)|e('html_attr') }}"></ul>
{{ form_end(form) }}
{% endblock %}
與 js 相關聯
const addFormToCollection = (e) => {
const collectionHolder = document.querySelector(
"." e.currentTarget.dataset.collectionHolderClass
);
const item = document.createElement("li");
item.innerHTML = collectionHolder.dataset.prototype.replace(
/__name__/g,
collectionHolder.dataset.index
);
collectionHolder.appendChild(item);
collectionHolder.dataset.index ;
};
document
.querySelectorAll(".add_item_link")
.forEach((btn) => btn.addEventListener("click", addFormToCollection));
它仍然需要一些作業,也許我可以使子表單擴展人形。前臺也需要一些作業。但是下一個面臨這個問題的人將在這里找到解決方案。
我仍然在問自己,如果我需要一個包含自身相同形式的表單,包括自身相同的表單等等,我該怎么辦……該表單是可遞回的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/371973.html
