symfony4 - 如何从 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(...)
电话似乎被忽略了。
解决方案
编码
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 }
推荐阅读
- c# - C# uwp 应用程序未在发布模式下构建
- list - 球拍/方案 - 用非平面列表中的另一个元素替换项目
- html - 使用溢出时的预期结果不同:滚动
- react-native - React Native Paper 中的卡片列表
- sql - SQL Server 唯一约束是“静默”还是引发异常?
- google-chrome - Chrome浏览器缓存问题
- python - 从 html 表中抓取数据
- python - 代码完成后打开 Tkinter 窗口
- bash - 通过 xargs 到 `tag` 命令行工具的管道路径
- html - 为什么 XPath 在使用 not(svg) 时选择带有 svg 子节点的节点