php Shopware 6插件:由于已删除配置项,更新后配置值不正确

ix0qys7i  于 2023-09-29  发布在  PHP
关注(0)|答案(1)|浏览(108)

我有一个处理自动发布评论的配置值的插件(reviewModeration)。在1.6.3版本中,我添加了一个新的配置键autoPublishStars。此外,我想在1.6.4版本中完全删除reviewModeration
config.xml

<input-field type="bool">
            <name>reviewSkipModeration</name>
            <label>Accept reviews automatically</label>
            <label lang="de-DE">Bewertungen automatisch freigeschaltet</label>
            <defaultValue>true</defaultValue>
        </input-field>
        <input-field type="single-select">
            <name>autoPublishStars</name>
            <label>Auto Publish review with stars</label>
            <label lang="de-DE">Sterne vorausgewählt</label>
            <defaultValue>0</defaultValue>
            <options>
                <option>
                    <id>None</id>
                    <name>None</name>
                    <name lang="de-DE">Keine</name>
                </option>                
                <option>
                    <id>0</id>
                    <name>0 Star</name>
                    <name lang="de-DE">0 Stern</name>
                </option>
                <option>
                    <id>1</id>
                    <name>1 Star</name>
                    <name lang="de-DE">1 Stern</name>
                </option>
                <option>
                    <id>2</id>
                    <name>2 Stars</name>
                    <name lang="de-DE">2 Sterne</name>
                </option>
                <option>
                    <id>3</id>
                    <name>3 Stars</name>
                    <name lang="de-DE">3 Sterne</name>
                </option>
                <option>
                    <id>4</id>
                    <name>4 Stars</name>
                    <name lang="de-DE">4 Sterne</name>
                </option>
                <option>
                    <id>5</id>
                    <name>5 Stars</name>
                    <name lang="de-DE">5 Sterne</name>
                </option>
            </options>
        </input-field>

update函数包含将旧配置迁移到新配置的逻辑:

public function update(UpdateContext $context): void {
        parent::update($context);
        
        // Get the currently installed version
        $version = $context->getCurrentPluginVersion(); 

        // Only update config if on version 1.6.3 or higher
        if (version_compare($version, '1.6.3', '>=')) {
            // Get config service from the container
            $configService = $this->container->get('Shopware\Core\System\SystemConfig\SystemConfigService');       
        
            // Get the current value of the configuration
            $previousConfigVal  = $configService->getBool('SwagPlugin.config.reviewModeration');
            $newConfigVal = $previousConfigVal ? '0' : 'None';
               
            // Set the specified value as default
            $configService->set('SwagPlugin.config.autoPublishStars', $newConfigVal);     
        }
    }

当从1.6.2 -> 1.6.3更新时,这工作正常。然而,当从1.6.3 -> 1.6.4更新时,由于旧的密钥reviewModeration不再存在,因此它将autoPublishStars设置为None值,而不管autoPublishStars的先前值:

  • 用户在v1.6.2中启用了reviewModeration(true)
  • 更新到v1.6.3将true迁移到新密钥autoPublishStars
  • 更新到v1.6.4检查旧密钥reviewModerationautoPublishStars获取false,反转值
  • v1.6.4将autoPublishStars设置为false,即使在v1.6.3中为true

当我在不同的插件版本中重构配置键时,我该如何防止这种不正确的切换?我只想在第一次更新时读取旧密钥,而不是在后续更新时。第一个更新版本可以是v1.7.8(不一定是1.6.3),例如当用户从1.1.1更新到1.7.8时。
感谢您的帮助!

kokeuurv

kokeuurv1#

public function update(UpdateContext $context): void {
    parent::update($context);

    // Get the currently installed version
    $version = $context->getCurrentPluginVersion();

    // Get config service from the container
    $configService = $this->container->get('Shopware\Core\System\SystemConfig\SystemConfigService');

    // Check if the migration has already been performed
    $migrationFlag = $configService->get('SwagPlugin.config.migrationFlag');

    if (version_compare($version, '1.6.3', '>=') && !$migrationFlag) {
        // Perform the migration only if on version 1.6.3 or higher
        $previousConfigVal  = $configService->getBool('SwagPlugin.config.reviewModeration');
        $newConfigVal = $previousConfigVal ? '0' : 'None';

        // Set the specified value as default
        $configService->set('SwagPlugin.config.autoPublishStars', $newConfigVal);

        // Set the migration flag to indicate that the migration has been performed
        $configService->set('SwagPlugin.config.migrationFlag', true);
    }
}

使用这种方法,迁移将仅在第一次更新到1.6.3或更高版本时执行,后续更新不会再次触发迁移。
请记住根据您的特定用例和插件结构调整版本号和配置密钥。

相关问题