使用 Symfony Forms 时,如何呈现一种实体类型但具有多种输入类型的输入

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

我很难制作一个表单来编辑实体“设置”的现有子集。 这个想法是在一个模板中仅呈现一组确定的“设置”,每个设置都有其自定义输入类型,至少在模板级别更改小部件。

设置实体如下所示:

应用\实体\Setting.php

<?php

namespace App\Entity;

use App\Repository\SettingRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Uid\Ulid;

#[ORM\Entity(repositoryClass: SettingRepository::class)]
class Setting
{
    #[ORM\Id]
    #[ORM\Column(type: 'ulid', unique: true)]
    #[ORM\GeneratedValue(strategy: 'CUSTOM')]
    #[ORM\CustomIdGenerator(class: 'doctrine.ulid_generator')]
    private ?Ulid $id = null;

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

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

    #[ORM\Column(type: Types::TEXT, nullable: true)]
    private ?string $value = null;

    public function getId(): ?Ulid
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getSlug(): ?string
    {
        return $this->slug;
    }

    public function setSlug(string $slug): self
    {
        $this->slug = $slug;

        return $this;
    }

    public function getValue(): ?string
    {
        return $this->value;
    }

    public function setValue(?string $value): self
    {
        $this->value = $value;

        return $this;
    }
}

表格类型:

应用程序\表单\SettingGeneralType.php

<?php

namespace App\Form;

use App\Entity\Setting;
use App\Form\SettingType;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SettingGeneralType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('name')
            ->add('value')
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => Setting::class,
        ]);
    }
}

对于需要采用以下形式的“集合”,我可以提供以下数据:

id 名字 价值 蛞蝓
应用名称 应用名称 应用程序名称
应用程序标志 应用程序徽标
应用说明 应用程序描述
维护模式 应用程序维护
默认日期和时间格式 d.m.Y H:i 应用程序日期时间格式
PHP bin 路径 pathToPhp.bin app_php_bin_path
默认颜色模式 汽车 app_theme_default

字符串、选项(下拉菜单)、布尔值(复选框)之间的值类型有所不同。

我可以在模板中手动格式化不同的表单小部件以适应所需的值,但我找不到任何解决方案来如何仅渲染一个小集合,每个集合都有自己来自该实体的“输入”。

我唯一的想法是使用“CollectionType”,因为它可以呈现一组简单的表单,我可以在模板中呈现并在提交时处理,但我无法让它过滤我想要以这些表单呈现的实体,因为我不这样做想要渲染每个设置...

这是我的第一个问题,所以如果我错过了什么,请不要讨厌:)

php symfony symfony-forms symfony6
1个回答
0
投票

您好,您要做的事情称为嵌入式表单,要实现您所需要的功能,您必须创建一个自定义 FormType 来输入您需要的内容,然后您可以在 formBuilder 中使用该自定义 formType,请在此处查看普通表单的文档在此处查看以及这里的嵌入集合表格检查这里

您的代码必须类似于:

class CustomType extends AbstractType
{
     public function buildForm(FormBuilderInterface $builder, array $options): void
     {
         $builder->add('name')
                 ->add('description');
     }

      public function configureOptions(OptionsResolver $resolver): void
      {
          $resolver->setDefaults([
          'data_class' => Custom::class,
      ]);
   }
}

然后在您的构建器中使用 customType :

$builder->add('settings', CollectionType::class, [
        'entry_type' => CustomType::class,
    ]);
© www.soinside.com 2019 - 2024. All rights reserved.