Symfony 表单管理 OneToManyToOne 关系(带有额外字段的ManyToMany)

问题描述 投票:0回答:1

也许你们中的一些人可以帮助我? 我正在努力构建我正在构建的表单。在我的应用程序中,用户可以创建名为“家庭”的群组并邀请其他用户加入该家庭。我想创建一个表单,以便家庭管理员可以管理属于其家庭成员的用户。

我可以在实体用户和家庭之间创建多对多关系,但我想存储有关该关系的额外信息,例如用户的角色、他/她进入家庭的日期...

因此,我有一个 Family 和一个 User 实体,它们与 FamilyMember 实体都具有 OneToMany 关系。以下是它们的主要属性:

Entity\User
#[ORM\Entity(repositoryClass: UserRepository::class)]
#[UniqueEntity(fields: ['email'], message: 'There is already an account with this email')]
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 180, unique: true)]
    private ?string $email = null;

    #[ORM\Column(length: 255)]
    private ?string $lastname = null;

    #[ORM\Column(length: 255)]
    private ?string $firstname = null;

    #[ORM\Column(length: 255)]
    private ?string $avatar = null;

    #[ORM\OneToMany(mappedBy: 'user', targetEntity: FamilyMember::class, orphanRemoval: true)]
    private Collection $familyMember;

    public function __construct()
        {
            $this->familyMember = new ArrayCollection();
        }
Entity\Family
#[ORM\Entity(repositoryClass: FamilyRepository::class)]
#[ORM\HasLifecycleCallbacks]
class Family
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 255)]
    private ?string $name = null;

    #[ORM\OneToMany(mappedBy: 'family', targetEntity: FamilyMember::class)]
        private Collection $familyMembers;
    
    public function __construct()
    {
        $this->familyMembers = new ArrayCollection();
    }
Entity\FamilyMember
#[ORM\Entity(repositoryClass: FamilyMemberRepository::class)]
class FamilyMember
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\ManyToOne(inversedBy: 'familyMember', fetch: "EAGER")]
    #[ORM\JoinColumn(nullable: false)]
    private ?User $user = null;

    #[ORM\ManyToOne(inversedBy: 'familyMemberBis')]
    #[ORM\JoinColumn(nullable: false)]
    private ?Family $family = null;

    #[ORM\Column]
    private array $role = [];
Controller\FamilyController
  #[Route('/compte/familles/{familyId}/gerer-membres', name: 'family_manage_members', requirements: ['familyId' => '\d+'])]
    public function manageFamilyMembers(int $familyId, Request $request): Response
    {
        $family = $this->familyRepository->find($familyId);
        // This is where I am supposed to call the form

有人可以帮我创建一个表单(使用表单类型)吗:

  • 属于家庭的所有用户的列表
  • 对于每个用户,都可以让他成为家庭管理员
  • 对于每个用户,都有一个将其排除在家庭之外的选项 我不希望能够以这种形式修改用户或家庭。

我尝试了不同版本的 FamilyType 和 FamilyMemberType,以及嵌入式集合,但它从未完全发挥作用。

symfony doctrine-orm many-to-many symfony-forms
1个回答
0
投票

这是我尝试的最后一个版本:

Controler\FamilyController
 #[Route('/compte/familles/{familyId}/gerer-membres', name: 'family_manage_members', requirements: ['familyId' => '\d+'])]
 public function manageFamilyMembers(int $familyId, Request $request): Response
    {
        $family = $this->familyRepository->find($familyId);
        $familyMembers = $family->getFamilyMembers();
        $forms = [];
        foreach ($familyMembers as $familyMember) {
          $form = $this->createForm(FamilyMemberType::class, $familyMember);
          $form->handleRequest($request);
          $forms[] = $form->createView();
        }
        return $this->renderForm('user/family-manage-members-form.html.twig', [
                'familyMemberForms' => $forms,
            ]);
}
class FamilyMemberType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('role', ChoiceType::class, [
                'label' => 'Rôle',
                'choices' => [
                    'Administrateur' => 'FAMILY_ADMIN',
                ],
                'multiple' => true,
                'expanded' => true
            ])
            ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => FamilyMember::class,
        ]);
    }
}
user/family-manage-members-form.html.twig
{% for form in familyMemberForms %}
    {{ form.vars.value.user.fullName}}
    {{ form_start(form) }}
    {{ form_widget(form) }}
    {{ form_end(form) }}
{% endfor %}
    <input type="submit" value="Enregistrer" class="btn btn-primary">

表单渲染的“外观”正是我想要的:有关用户的信息(其全名)+使他成为管理员的能力。 问题是我要么每个用户有一个提交按钮,要么最后有一个超出任何 HTML 的提交按钮。问题是有多种形式。 我无法添加按钮来从家庭中删除用户。

感谢您以任何方式帮助我!

© www.soinside.com 2019 - 2024. All rights reserved.