Shopware 6插件:布尔配置转单选配置的迁移与逻辑修改
Shopware 6插件1.7.2→1.7.3升级实现方案
一、配置定义修改
替换原有布尔配置reviewSkipModeration为单选配置autoPublishStars,修改插件的src/Resources/config/config.xml:
<card> <title>评论设置</title> <elements> <single-select-field> <name>autoPublishStars</name> <label>自动发布评论星级</label> <defaultValue>0</defaultValue> <!-- 继承原默认true的行为:自动发布所有评论 --> <options> <option> <value>none</value> <label>None(不自动发布任何评论)</label> </option> <option> <value>0</value> <label>0星及以上(自动发布所有评论)</label> </option> <option> <value>1</value> <label>1星及以上</label> </option> <option> <value>2</value> <label>2星及以上</label> </option> <option> <value>3</value> <label>3星及以上</label> </option> <option> <value>4</value> <label>4星及以上</label> </option> <option> <value>5</value> <label>5星及以上</label> </option> </options> </single-select-field> </elements> </card>
同时更新自定义配置类(若有),移除旧配置的 getter 方法,新增新配置的方法:
// src/System/Config/Configuration.php class Configuration extends AbstractConfiguration { public function getAutoPublishStars(): string { // 默认值设为0,保证新安装用户行为和原默认一致 return $this->get('autoPublishStars', '0'); } }
二、插件升级时的配置数据映射
在插件主类Plugin.php的update方法中实现旧配置到新配置的迁移,确保现有用户更新后行为不变:
public function update(UpdateContext $context): void { parent::update($context); // 仅针对1.7.3以下版本的升级操作 if (version_compare($context->getCurrentPluginVersion(), '1.7.3', '<')) { $configRepo = $this->container->get('system_config.repository'); $context = $context->getContext(); // 查询所有店铺的旧配置 $oldConfigCriteria = (new Criteria())->addFilter( new EqualsFilter('configurationKey', 'YourPluginAlias.config.reviewSkipModeration') ); $oldConfigs = $configRepo->search($oldConfigCriteria, $context); foreach ($oldConfigs as $oldConfig) { $oldValue = $oldConfig->get('configurationValue'); // 映射规则:旧false→None(值为none),旧true→0 Stars(值为0) $newValue = $oldValue ? '0' : 'none'; // 插入新配置 $configRepo->upsert([ [ 'salesChannelId' => $oldConfig->get('salesChannelId'), 'configurationKey' => 'YourPluginAlias.config.autoPublishStars', 'configurationValue' => $newValue, ] ], $context); // 删除旧配置 $configRepo->delete([$oldConfig->getId()], $context); } } }
注意:替换YourPluginAlias为你插件的实际别名(即composer.json中的extra.shopware.plugin.name值)
三、控制器逻辑调整
移除原有基于reviewSkipModeration的判断逻辑,替换为新配置的星级判断,同时实现需求中“像访问0一样访问None选项”的处理:
// 控制器中处理评论状态的代码段 use Shopware\Core\Content\Product\Aggregate\ProductReview\ProductReviewEntity; // 获取新配置值 $autoPublishStars = $this->configuration->getAutoPublishStars(); $shouldAutoPublish = false; // 处理None选项:值为none时不自动发布,其他情况判断星级 if ($autoPublishStars !== 'none') { $reviewRating = $productReview->getRating(); // 假设评论实体的星级字段为rating(值1-5) // 0代表所有星级自动发布,其余值判断评论星级是否≥配置值 $shouldAutoPublish = $autoPublishStars === '0' || $reviewRating >= (int)$autoPublishStars; } // 设置评论状态 $productReview->setStatus( $shouldAutoPublish ? ProductReviewEntity::STATUS_APPROVED : ProductReviewEntity::STATUS_PENDING );
四、额外注意事项
- 更新插件的
composer.json版本号为1.7.3 - 在
CHANGELOG.md中记录本次配置变更和功能调整 - 测试两种升级场景:旧版本用户升级、新用户安装,确保行为符合预期
内容的提问来源于stack exchange,提问作者mlodhi
相关产品推荐
相关产品推荐

