问题描述
我正在开发 Sylius 应用程序,想删除后台管理中的表单。
在这种特殊情况下,字段 on_hand
(在 Productvariant
创建和更新上下文中)不应该可用。 (因为我们直接从供应商那里获取该信息并自动将其导入数据库。)我已经找到了正确的模板 (/vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle/Resources/views/Productvariant/Tab/_inventory.html.twig
),在我的应用程序中创建了一个副本并从视图中删除了该字段。但它仍然在表单对象中。我无法以任何形式找到它。好像是生成的,但是没看到这个生成在哪里,怎么从表单生成中排除这个字段。
一般如何处理此类情况以及如何从 Sylius 提供的表单中查找和删除字段?
文档文章“Customizing Forms”说:
您可以:
...并显示要做什么,“如果您打算添加新字段”。但它没有解释,如何删除字段——而且似乎比添加要复杂一些。
到目前为止我尝试过的:
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 }