Php 如何在Symfony表单中动态禁用除提交按钮之外的每个字段

Php 如何在Symfony表单中动态禁用除提交按钮之外的每个字段,php,forms,symfony,twig,Php,Forms,Symfony,Twig,据我所知,Symfony中表单的最佳实践是尽可能多地重用代码(这可能是一般的最佳实践)。 我已经设置了一系列操作来编辑或创建实体,两个操作都使用相同的表单类和相同的细枝模板。现在我必须为该实体制作一个删除表单 我希望重用用于创建或编辑实体的模板,但这次将禁用每个字段。这样,用户将看到实体的内容,但不会被编辑字段的能力所迷惑(必须清楚,通过单击提交按钮,所有内容都将被删除,而不是保存) 现在是表单类: // AppBundle/Controller/DeleteEntityController.p

据我所知,Symfony中表单的最佳实践是尽可能多地重用代码(这可能是一般的最佳实践)。 我已经设置了一系列操作来编辑或创建实体,两个操作都使用相同的表单类和相同的细枝模板。现在我必须为该实体制作一个删除表单

我希望重用用于创建或编辑实体的模板,但这次将禁用每个字段。这样,用户将看到实体的内容,但不会被编辑字段的能力所迷惑(必须清楚,通过单击提交按钮,所有内容都将被删除,而不是保存)

现在是表单类:

// AppBundle/Controller/DeleteEntityController.php
// ...
class TermType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('term', TextType::class, array('label' => 'Term'));
        $builder->add('definition', TextareaType::class, array('label' => 'Definition'));
        $builder->add('visibility_status', ChoiceType::class, array(
                'label' => 'Visibility',
                'choices' => array(
                    'Visible' => true,
                    'Invisible' => false
                ),
            ));
        $builder->add('page', EntityType::class, array(
                'label' => 'Page',
                'class' => 'AppBundle:Page',
                'query_builder' => function (PageRepository $er) {
                        return $er->getPageByType('Glossary');
                },
                'choice_label' => 'title'
            ));
        $builder->add('submit', SubmitType::class, array(
            'label' => 'Submit'
        ));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Term::class,
        ));
    }
}
我尝试的第一件事是调用表单并将disabled设置为true(
$form=$this->createForm(TermType::class,$term,array('disabled'=>true));
),但该选项禁用所有内容,包括提交按钮。 因此,我明确启用了submit按钮,认为它会覆盖传递给
createForm
的选项:

// AppBundle/Form/TermType.php
// ...
$builder->add('submit', SubmitType::class, array(
            'label' => 'Submit',
            'disabled' => false
        ));
// ...
但它不起作用。我能想到的唯一替代方法是传递一个自定义选项,并在每个字段中设置
disabled
选项,但提交按钮除外。大致如下:

// AppBundle/Controller/DeleteEntityController.php
// ...
$form = $this->createForm(TermType::class, $term, array('is_delete_form' => true));
// ...


在这种情况下,最佳做法是什么?我应该禁用模板内的字段,还是应该从表单类中执行?这是一个好问题,您的解决方案也是合理的。请记住,如果使用其他选项,最好在configureOptions函数中为其设置默认值:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => Term::class,
        // Additional option default should be defined here
    ));
}

但是,如果您正在搜索最佳实践:Symfony的建议是将按钮与表单类或控制器分离(如果您在控制器中定义表单)。它为开发人员提供了更大的灵活性,并使表单的处理更加容易。您可以在这里找到Symfony architect对此的看法:。

您的问题很有趣,您是否只想使用一个表单来设置编辑、创建和删除视图。就我而言,我使用生成类的crud来获得一些时间。您可以直接获得该类的编辑/创建/删除表单、函数和视图,以后可以根据需要进行定制

您可以从他们使用的方法中获得灵感,一旦crud生成,您只能获得一种形式:

您可以在此处轻松地生成它:


这并不能真正回答您的问题,但下次可能会有所帮助;)

我同意。不要在FormType类中呈现submit(或任何其他)按钮。取而代之的是,在你有更多控制权的模板中呈现。我为没有阅读那个页面感到羞愧。我最终在模板中移动了提交按钮;从控制器发送到模板的参数“action”设置正确的标签和类。目前这是最好的解决方案。然而,对于某些表单字段的使用方式,我仍然觉得有点虚假。例如:当我使用ChoiceType时,我可以选择它是显示为select还是radiobox。不过,这种选择在form类中混合了一些表示和逻辑。Hi@paratassi,如果您在form类中为form字段或表单定义一些属性,这是完全正确的,几乎没有任何方法可以完全分离逻辑并与form Bundle一起显示。然而,我相信表单包的思想和设计模式已经非常陈旧,开发人员不需要一直坚持下去。任何像React这样的现代前端框架都将在前端为您提供相同的代码重用性和更大的灵活性,而在后端,Symfony具有Params转换器和验证器功能,这些功能或多或少实现了表单绑定的功能。
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => Term::class,
        // Additional option default should be defined here
    ));
}