我有一个Shopware 6插件,它当前使用布尔配置reviewSkipModeration值,可以自动发布通过该插件提交的任何 comments :

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>无</id>
                    <name>无</name>
                    <name lang="de-DE">无</name>
                </option>
                <option>
                    <id>0</id>
                    <name>0颗星</name>
                    <name lang="de-DE">0颗星</name>
                </option>
                <option>
                    <id>1</id>
                    <name>1颗星</name>
                    <name lang="de-DE">1 Stern</name>
                </option>
                <option>
                    <id>2</id>
                    <name>2颗星</name>
                    <name lang="de-DE">2 Sterne</name>
                </option>
                <option>
                    <id>3</id>
                    <name>3颗星</name>
                    <name lang="de-DE">3 Sterne</name>
                </option>
                <option>
                    <id>4</id>
                    <name>4颗星</name>
                    <name lang="de-DE">4 Sterne</name>
                </option>
                <option>
                    <id>5</id>
                    <name>5星</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,
            ];

我想将布尔配置功能迁移到新版本,方法是将to avoid changing the default behavior for existing users during an update迁移到具有以下选项的多选配置.我如何才能使用从config.xml到控制器的"无"呢?我是否可以像在控制器中访问"0"一样访问"无"选项?:

  • 0颗星
  • 1颗星
  • 2颗星
  • 3颗星
  • 4颗星
  • 5星

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

  • false maps to 无
  • true maps to 0颗星

我的插件更新函数如下所示:

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

但我不确定如何处理映射.如有任何帮助,我们不胜感激!

推荐答案

如果我理解正确的话,您应该从更改更新方法开始,您可以判断旧的bool配置是真是假,然后将其映射到相应的新多选配置

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

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

之后,如果您使用的是PHP8,则可以使用简单的[Switch][1]或[Match][2]来 Select 不同的选项

$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;
 }

我想这对你可能真的很管用,如果不管用,我们可以一起集思广益,找出一个解决方案 [1]:https://www.php.net/manual/fr/control-structures.switch.php [2]:https://www.php.net/manual/en/control-structures.match.php

Php相关问答推荐

添加自定义Metabox到WooCommerce管理订单,启用HPOS

如何发送woocommerce订单跟踪码与短信

如何在不指定symfony列的情况下从数据库中获取行数组

从WooCommerce购物车和 checkout 页面自定义发货标签

使用WordPress wp_mail()的邮箱标题无效

在没有symfony应用程序的情况下使用安全Bundle 包时,缺少配置构建器类

基于不用于变体的产品属性隐藏多个WooCommerce发货方式

通过DO LAMP进行身份验证并从邮箱发送邮箱的最简单方式是什么

闭包绑定$This和垃圾收集器

Sylius php -如何将购物车传递到小枝模板(Sylius模板事件)

如果为布尔值,则 for each 循环重新启动

Regex|PHP捕获json字符串中的每个非法双引号

调用模型[App\Models\Employee]上未定义的关系[title]

Font Awesome 加载图标未显示在 WooCommerce 管理员列表中

单个产品页面 WooCommerce 订阅价格字符串的更改

在 WordPress 中将自定义帖子类型永久链接设置为 root

在WooCommerce购物车和 checkout 页面中更改总计文本

PHP preg_replace括号和方括号内的所有逗号

如何通过路由传递变量

使用 v-for 的存储链接中的 Img src 在 Laravel vuejs 中不起作用