我有一个处理自动发布评论的配置值的插件(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检查旧密钥
reviewModeration
,autoPublishStars
获取false,反转值 - v1.6.4将
autoPublishStars
设置为false,即使在v1.6.3中为true
当我在不同的插件版本中重构配置键时,我该如何防止这种不正确的切换?我只想在第一次更新时读取旧密钥,而不是在后续更新时。第一个更新版本可以是v1.7.8(不一定是1.6.3),例如当用户从1.1.1更新到1.7.8时。
感谢您的帮助!
1条答案
按热度按时间kokeuurv1#
使用这种方法,迁移将仅在第一次更新到1.6.3或更高版本时执行,后续更新不会再次触发迁移。
请记住根据您的特定用例和插件结构调整版本号和配置密钥。