OroPlatform:覆盖核心实体表单构建器
Posted
技术标签:
【中文标题】OroPlatform:覆盖核心实体表单构建器【英文标题】:OroPlatform: Override core entity form builder 【发布时间】:2021-05-23 22:39:45 【问题描述】:上下文
我正在尝试更改核心实体之一上一个字段的表单类型:Business Unit
默认的表单域是TextField
,我想把它改成ChoiceType
。
这是我通过迁移创建的业务单位实体的自定义字段:
$table->addColumn('periodicite', 'string', [
'oro_options' => [
'extend' => ['owner' => ExtendScope::OWNER_CUSTOM],
'entity' => ['label' => 'Périodicité'],
],
]);
问题
我在 Oro 文档中看到 entity_config.yml
可以解决我的问题。我试图把这些行放在上面,但它不起作用:
entity_config:
business_unit:
entity:
items:
periodicite:
form:
type: Symfony\Component\Form\Extension\Core\Type\ChoiceType
options:
choices:
Mensuel: Mensuel
Trimestriel: Trimestriel
placeholder: false
required: true
label: "Périodicite"
我也尝试创建一个新的迁移来更改我的自定义字段上的字段类型,但它不起作用
<?php
namespace Baltimore\Bundle\AppBundle\Migrations\Schema\v1_1;
use Doctrine\DBAL\Schema\Schema;
use Oro\Bundle\EntityConfigBundle\Migration\UpdateEntityConfigFieldValueQuery;
use Oro\Bundle\EntityExtendBundle\EntityConfig\ExtendScope;
use Oro\Bundle\EntityExtendBundle\Migration\Extension\ExtendExtension;
use Oro\Bundle\EntityExtendBundle\Migration\Extension\ExtendExtensionAwareInterface;
use Oro\Bundle\MigrationBundle\Migration\Migration;
use Oro\Bundle\MigrationBundle\Migration\QueryBag;
use Oro\Bundle\OrganizationBundle\Entity\BusinessUnit;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
class UpdateBusinessUnitField implements Migration, ExtendExtensionAwareInterface
/** @var ExtendExtension */
protected $extendExtension;
/**
* @inheritdoc
*/
public function setExtendExtension(ExtendExtension $extendExtension)
$this->extendExtension = $extendExtension;
public function up(Schema $schema, QueryBag $queries)
$queries->addQuery(
new UpdateEntityConfigFieldValueQuery(
BusinessUnit::class,
'periodicite',
'form',
'form_type',
ChoiceType::class
)
);
$queries->addQuery(
new UpdateEntityConfigFieldValueQuery(
BusinessUnit::class,
'periodicite',
'form',
'form_options',
[
'choices' => [
'Mensuel' => 'Mensuel',
'Trimestriel' => 'Trimestriel',
'Annuel' => 'Annuel',
],
]
)
);
【问题讨论】:
【参考方案1】:我在我的迁移文件中找到了一个使用 changeColumn
方法的解决方案,它就像一个魅力。
顺便说一下,这些属性也适用于addColumn
方法。
public function up(Schema $schema, QueryBag $queries)
$table = $schema->getTable('oro_business_unit');
$table->changeColumn('periodicite', [
'oro_options' => [
'extend' => ['owner' => ExtendScope::OWNER_CUSTOM],
'entity' => ['label' => 'Périodicité'],
'form' => [
'form_type' => ChoiceType::class,
'form_options' => [
'choices' => [
'Mensuel' => 'Mensuel',
'Trimestriel' => 'Trimestriel',
'Semestriel' => 'Semestriel',
'Annuel' => 'Annuel'
]
]
],
],
]);
【讨论】:
【参考方案2】:我不知道使用 YAML 文件覆盖实体配置元数据的可能性。如果有 - 请在 cmets 中分享您用于实现它的文档。
但可以肯定的是,您可以使用架构迁移来管理相同的内容,如下例所示:
class UpdateOpportunityRelationFormType implements Migration
/**
* @inheritdoc
*/
public function up(Schema $schema, QueryBag $queries)
$queries->addQuery(
new UpdateEntityConfigFieldValueQuery(
Quote::class,
'opportunity',
'form',
'form_type',
OpportunitySelectType::class
)
);
$queries->addQuery(
new UpdateEntityConfigFieldValueQuery(
Quote::class,
'opportunity',
'form',
'form_options',
['attr' => ['readonly' => true]]
)
);
【讨论】:
谢谢!但是我尝试进行新的迁移,但它不起作用。我没有错误,我的业务单位表格仍然相同。我已经用我的新迁移更新了我原来的问题,因为我不能把它放在这个评论中.. 运行上述迁移的结果是什么?另外,请注意,要应用迁移,您必须按照本指南 doc.oroinc.com/backend/setup/upgrade-to-new-version 运行oro:platform:update
命令。并确保迁移列在 oro:platform:update 的输出中。
这是完全重新安装的输出:>Baltimore\Bundle\AppBundle\Migrations\Schema\v1_0\AddColumnsToBusinessUnit > Baltimore\Bundle\AppBundle\Migrations\Schema\v1_1\UpdateBusinessUnitField
您可以看到两个迁移都已运行。但是当我去/organization/business_unit/create
时,什么都没有改变,我的表格还是一样的。
这意味着那里的表单类型是手动呈现的,而不是使用实体元数据。在这种情况下,您可以使用表单类型扩展名覆盖它。 symfony.com/doc/4.4/form/create_form_type_extension.html
如果要更改表单,则无需覆盖实体。正如我之前所说,表单类型扩展是要走的路。以上是关于OroPlatform:覆盖核心实体表单构建器的主要内容,如果未能解决你的问题,请参考以下文章
OroPlatform:覆盖 oro_datetime_widget 选项