首页 > 解决方案 > 如何从 Sylius 管理后端的表单中删除字段?

问题描述

我正在开发一个 Sylius 应用程序,并希望在管理后端删除一个表单。

在这种特殊情况下,字段on_hand(在ProductVariant创建和更新上下文中)不应该可用。(因为我们直接从供应商处获取该信息并自动将其导入数据库。)我已经找到了正确的模板 ( /vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle/Resources/views/ProductVariant/Tab/_inventory.html.twig),在我的应用程序中创建了一个副本并从视图中删除了该字段。但它仍然是表单对象。我找不到任何形式的。它似乎是生成的,但我没有看到这一代发生在哪里以及如何从表单生成中排除这个字段。

如何删除字段on_hand并删除它?

Sylius 提供的一般情况下如何处理此类情况并从表单中查找和删除字段?


文档文章“自定义表单”说:

你可以:

  • 添加全新的字段,
  • 修改现有字段,使其成为必需字段,更改其 HTML 类,更改标签等,
  • 删除未使用的字段。

...并显示,“如果您打算添加新字段”该怎么做。但它没有解释如何删除字段——而且它似乎比添加要复杂一些。


到目前为止我尝试了什么:

final class ProductVariantTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            // ->add(...)
            // ...
            ->remove('onHand')
        ;
    }
    public static function getExtendedTypes(): iterable
    {
        return [BaseProductVariantType::class];
    }
}

但这个remove(...)电话似乎被忽略了。

标签: symfony4symfony-formssyliusform-fields

解决方案


编码

final class ProductVariantTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            // ->add(...)
            // ...
            ->remove('onHand')
        ;
    }
    public static function getExtendedTypes(): iterable
    {
        return [BaseProductVariantType::class];
    }
}

是正确的,它也没有被忽视。问题是,在这个地方/时间点Form尚未完成:该字段onHand不存在,因此尝试删除它不会有任何效果,因为它是稍后添加的。诀窍是推迟ProductVariantTypeExtension. 通过设置priority

/config/services.yaml

...
parameters:
    ...
    services:
        ...
            App\Form\Extension\ProductVariantTypeExtension:
                tags:
                    - { name: 'form.type_extension', extended_type: 'Sylius\Bundle\ProductBundle\Form\Type\ProductVariantType', priority: -1 }

推荐阅读