symfony Shopware 6插件:如何删除和迁移布尔配置到多选配置

7tofc5zh  于 7个月前  发布在  PWA
关注(0)|答案(1)|浏览(98)

我有一个Shopware 6插件,目前使用布尔配置reviewSkipModeration值,自动发布通过插件提交的任何评论:
config.xml

<input-field type="bool">
  <name>reviewSkipModeration</name>
  <label>Accept reviews automatically</label>
  <defaultValue>true</defaultValue>
</input-field>

该插件的当前版本是1.7.2。在新版本1.7.3中,我想删除reviewSkipModeration布尔配置并添加新的autoPublishStars多选配置:
config.xml

<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">None</name>
                </option>
                <option>
                    <id>0</id>
                    <name>0 Stars</name>
                    <name lang="de-DE">0 Stars</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>

当前的逻辑是在一个控制器中实现的。当我想为新版本删除if (!$this->config->getReviewSkipModeration()) {...}时,应该在控制器中做哪些更改?:

$commentStatus = true;
            
            if($reviewPoints < $this->config->getAutoPublishStars()){
                $commentStatus = !$commentStatus;
            }
            
            if (!$this->config->getReviewSkipModeration()) {
                $commentStatus = false;
            }

            $create = [
                'productId' => $sArticleId,
                'customerId' => $customer->getCustomerId(),
                'salesChannelId' => $salesChannelContext->getSalesChannel()->getId(),
                'languageId' => $salesChannelContext->getContext()->getLanguageId(),
                'externalUser' => $this->anonymizeName($isAnon, $customer),
                'externalEmail' => $orderNumberAsEmail,
                'title' => $commentHeadline,
                'content' => $commentContent,
                'points' => $reviewPoints,
                'status' => $commentStatus,
            ];

我想将布尔配置功能迁移到新版本,以避免在更新期间更改现有用户的默认行为,以使用以下选项进行多选配置。如何将“None”从Roll.xml使用到控制器?我可以像在控制器中访问“0”一样访问“None”选项吗?:

  • 没有一
  • 0星
  • 1颗星星
  • 2星
  • 3星
  • 4星
  • 5星

在我的更新方法中,我如何正确迁移数据,以便:

  • 假Map到无
  • 真实Map0星

我的更新功能的插件看起来像:

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

但我不知道如何处理Map。任何帮助是感激!

nukf8bse

nukf8bse1#

如果我理解正确的话,你应该从改变你的更新方法开始,你可以检查旧的bool配置是真还是假,然后将其Map到相应的新的多选配置

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

    $previousConfigVal = $this->config->getReviewSkipModeration();
    $newConfigVal = $previousConfigVal ? 0 : 'None';
 
    $this->config->setAutoPublishStars($newConfigVal);
}

如果你使用的是PHP 8,那么在这之后你可以使用一个简单的[switch][1]或[match][2]来实现不同的选项

$autoPublishStars = $this->config->getAutoPublishStars();
switch ($autoPublishStars) {
    case 'None':
        $commentStatus = false;
        break;
    case '0':
        $commentStatus = false;
        break;
    case '1':
        $commentStatus = ($reviewPoints >= 1);
        break;
    case '2':
        $commentStatus = ($reviewPoints >= 2);
        break;
    case '3':
        $commentStatus = ($reviewPoints >= 3);
        break;
    case '4':
        $commentStatus = ($reviewPoints >= 4);
        break;
    case '5':
        $commentStatus = ($reviewPoints >= 5);
        break;
    default:
        $commentStatus = true;
 }

我想这可能真的对你有用,如果它没有,我们可以一起头脑 Storm 一个解决方案[1]:https://www.php.net/manual/fr/control-structures.switch.php [2]:https://www.php.net/manual/en/control-structures.match.php

相关问题