2

我正在开发我的第一个 Shopware 6 管理插件,它需要扩展现有的 Shopware 插件 - 自定义产品。

我想在已经存在的实体之间添加一个关系 - TemplateExclusion 和 TemplateOptionDefinition。当我从 UI 中选择我的选项时,TemplateExclusion 实体将被保存在数据库中,没有任何问题。

当我保存模板实体(TemplateExclusion 的父级)时,我的“excluded_option_id”将被 TemplateOptionDefinition 实体中的第一个可能选项覆盖。

我注意到这发生在“mergeVersion”上。此外,当我尝试在启用调试模式和探查器的情况下保存模板实体时,我在保存过程中遇到错误,合并时“excludedOptionId”为空白,这是不正确的。

探查器中的错误

按照文档,我首先进行了迁移:

class Migration1643023742TemplateExclusionRelation extends MigrationStep
{
    public function getCreationTimestamp(): int
    {
        return 1643023742;
    }

    public function update(Connection $connection): void
    {
        $connection->executeStatement('ALTER TABLE `swag_customized_products_template_exclusion` ADD COLUMN `excluded_option_id` BINARY(16) AFTER `template_version_id`;');
        $connection->executeStatement('ALTER TABLE `swag_customized_products_template_exclusion` ADD COLUMN `excluded_option_version_id` BINARY(16) AFTER `excluded_option_id`;');
        $connection->executeStatement('ALTER TABLE `swag_customized_products_template_exclusion` ADD CONSTRAINT `fk.swag_cupr_template_exclusion.excluded_option_id` FOREIGN KEY (`excluded_option_id`, `excluded_option_version_id`)
        REFERENCES `swag_customized_products_template_option` (`id`, `version_id`) ON DELETE CASCADE ON UPDATE CASCADE;');
    }

然后我做了一个实体扩展,在哪里定义新字段。

class TemplateExclusionExtension extends EntityExtension
{
    public function extendFields(FieldCollection $collection): void
    {
        $collection->add(
            (new FkField('excluded_option_id', 'excludedOptionId', TemplateOptionDefinition::class))
                ->addFlags(new Required(), new ApiAware())
        );

        $collection->add(
            (new ManyToOneAssociationField('excludedOption', 'excluded_option_id', TemplateOptionDefinition::class))
                ->addFlags(new ApiAware())
        );

        $collection->add(
            (new ReferenceVersionField(TemplateOptionDefinition::class, 'excluded_option_version_id'))
                ->addFlags(new Required(), new ApiAware()),
        );
    }

    public function getDefinitionClass(): string
    {
        return TemplateExclusionDefinition::class;
    }
}

解决了:

我这边的定义是错误的:

public function extendFields(FieldCollection $collection): void
    {
        $collection->add(
            (new FkField('excluded_option_id', 'excludedOptionId', TemplateOptionDefinition::class))
                ->addFlags(new Required(), new ApiAware())
        );

        $collection->add(
            (new OneToOneAssociationField(
                EasyExtendCustomizedProducts::TEMPLATE_EXCLUSION_EXCLUDED_OPTION_EXTENSION,
                'excluded_option_id',
                'id',
                TemplateOptionDefinition::class,
                false
            ))->addFlags(new CascadeDelete(), new ApiAware())
        );
    }

    public function getDefinitionClass(): string
    {
        return TemplateExclusionDefinition::class;
    }
4

0 回答 0