如何在 Symfony 中构建嵌套表单
How to build nested forms in Symfony
我正在使用 EasyAdmin 为一个实体 (Processes) 创建一个控制器,它与另一个实体 (Sections) 相关(一对多关系)与另一个实体(子部分)有关系(也一个-对多).
在 Processes 的“新”形式中,我有一个类型为 EasyAdmin Collection 的字段来添加部分,但是由于这些部分有小节,我需要在 Sections 中为小节添加另一个相等的字段...与小节具有相同的行为。 EasyAdmin 集合类型的字段(单击“添加项目”时,会显示该其他实体的迷你表单)。
主窗体用于创建流程,“部分”字段用于向该流程添加部分,在部分内,我需要另一个按钮(如 EasyAdmin 中的按钮)来为其创建更多子部分部分。
这是进程的主要形式:
这就是 Collection type 字段与创建 Sections 的字段的样子:
这是流程控制器:(我为名为“SeccionType”的部分创建了一个自定义字段)
namespace App\Controller\Admin;
use App\Entity\Proceso;
use App\Form\Type\SeccionType;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
class ProcesoCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Proceso::class;
}
public function configureFields(string $pageName): iterable
{
yield TextField::new('nombre');
yield TextEditorField::new('descripcion');
yield CollectionField::new('secciones') // <--- This is Sections field with the custom Symfony formType
->setEntryType(SeccionType::class)
->setFormTypeOptions(['block_prefix' => 'secciones_form',])
->addCssClass('actividadesFld');
yield BooleanField::new('estado')->renderAsSwitch(false);
}
}
这是自定义字段的class SeccionType
namespace App\Form\Type;
use App\Entity\Seccion;
use App\Entity\Proceso;
use App\Entity\Subseccion;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormTypeInterface;
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
use Symfony\Component\Validator\Constraints\NotNull;
class SeccionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name')
->add('description')
->add('order')
->add('tag')
// ->add('proccess')
->add('subSection', CollectionType::class, ['entry_type' => ..?]);
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Seccion::class,
]);
}
}
任何帮助或建议,我将感激不尽
您似乎没有添加 allow-add => true option to your CollectionType in SeccionType.php, as well as prototype => true. You should also probably create a SubSeccionType to give in the entry-type 选项。这应该是一个好的开始。
我正在使用 EasyAdmin 为一个实体 (Processes) 创建一个控制器,它与另一个实体 (Sections) 相关(一对多关系)与另一个实体(子部分)有关系(也一个-对多).
在 Processes 的“新”形式中,我有一个类型为 EasyAdmin Collection 的字段来添加部分,但是由于这些部分有小节,我需要在 Sections 中为小节添加另一个相等的字段...与小节具有相同的行为。 EasyAdmin 集合类型的字段(单击“添加项目”时,会显示该其他实体的迷你表单)。
主窗体用于创建流程,“部分”字段用于向该流程添加部分,在部分内,我需要另一个按钮(如 EasyAdmin 中的按钮)来为其创建更多子部分部分。
这是进程的主要形式:
这就是 Collection type 字段与创建 Sections 的字段的样子:
这是流程控制器:(我为名为“SeccionType”的部分创建了一个自定义字段)
namespace App\Controller\Admin;
use App\Entity\Proceso;
use App\Form\Type\SeccionType;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
class ProcesoCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Proceso::class;
}
public function configureFields(string $pageName): iterable
{
yield TextField::new('nombre');
yield TextEditorField::new('descripcion');
yield CollectionField::new('secciones') // <--- This is Sections field with the custom Symfony formType
->setEntryType(SeccionType::class)
->setFormTypeOptions(['block_prefix' => 'secciones_form',])
->addCssClass('actividadesFld');
yield BooleanField::new('estado')->renderAsSwitch(false);
}
}
这是自定义字段的class SeccionType
namespace App\Form\Type;
use App\Entity\Seccion;
use App\Entity\Proceso;
use App\Entity\Subseccion;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormTypeInterface;
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
use Symfony\Component\Validator\Constraints\NotNull;
class SeccionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name')
->add('description')
->add('order')
->add('tag')
// ->add('proccess')
->add('subSection', CollectionType::class, ['entry_type' => ..?]);
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Seccion::class,
]);
}
}
任何帮助或建议,我将感激不尽
您似乎没有添加 allow-add => true option to your CollectionType in SeccionType.php, as well as prototype => true. You should also probably create a SubSeccionType to give in the entry-type 选项。这应该是一个好的开始。