如何从 Sylius 管理后端的表单中删除字段?

问题描述

我正在开发 Sylius 应用程序,想删除后台管理中的表单。

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

如何删除字段on_hand并将其删除

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


文档文章Customizing Forms”说:

您可以:

  • 添加全新的字段,
  • 修改现有字段,使其成为必需,更改其 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(...) 调用似乎被忽略了。

解决方法

代码

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 }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...