You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shopware 6插件问题:新建条目需点击两次保存按钮

Shopware 6插件保存功能异常:新建条目需两次点击保存按钮分析

问题现象

开发Shopware 6插件时,新建系统条目需点击两次保存按钮才能完成保存操作,首次点击无预期效果。

相关代码

Twig模板中的保存按钮

<sw-button-process
    v-bind:isLoading="isLoading"
    v-bind:processSuccess="processSuccess"
    variant="primary"
    @process-finish="saveFinish"
    @click="onClickSave">
    {{ $t('plugin-entity.saveButtonText') }}
</sw-button-process>

保存逻辑方法

onClickSave() {
    this.isLoading = true;

    this.repository
            .save(this.blacklist, Shopware.Context.api)
            .then(() => {
                this.getBlacklist();
                this.isLoading = false;
                this.processSuccess = true;
            })
            .catch((exception) => {
                this.isLoading = false;
                this.createNotificationError({
                    title: this.$t('plugin-entity.errorTitle'),
                    message: exception
                });
            });
},

问题分析与解决方案

1. sw-button-process组件事件绑定错误

sw-button-process是Shopware内置的流程按钮组件,本身设计用于处理异步流程,不应直接绑定@click事件。直接绑定@click会干扰组件自身的状态管理逻辑,导致首次点击时组件未正确进入流程状态,需二次点击触发。

修复方案:
移除@click="onClickSave"绑定,改用组件的@process事件触发保存逻辑:

<sw-button-process
    v-bind:isLoading="isLoading"
    v-bind:processSuccess="processSuccess"
    variant="primary"
    @process="onClickSave"
    @process-finish="saveFinish">
    {{ $t('plugin-entity.saveButtonText') }}
</sw-button-process>

2. processSuccess状态未重置

在then回调中设置this.processSuccess = true后,未在saveFinish方法中重置为false。sw-button-process组件会依赖processSuccess状态判断流程是否完成,若状态未重置,后续点击会被组件忽略,需二次点击才能触发新的流程。

修复方案:
实现saveFinish方法重置状态:

saveFinish() {
    this.processSuccess = false;
}

3. 实体实例初始化问题

若this.blacklist是普通JavaScript对象而非通过Shopware仓库创建的实体实例,首次调用repository.save时可能无法正确触发持久化操作。Shopware的repository.save要求传入的是通过repository.create(Context)创建的实体对象,否则可能出现无响应或静默失败的情况。

修复方案:
确保新建条目时,this.blacklist是正确的实体实例:

// 在新建条目的初始化逻辑中
this.blacklist = this.repository.create(Shopware.Context.api);

4. 错误提示信息不规范

catch回调中直接传入exception作为错误信息,而Shopware的createNotificationError需要字符串类型的消息。若exception是Error对象,会导致提示信息异常,用户无法感知首次保存失败的原因,误以为未触发保存操作。

修复方案:
修改错误提示为exception.message:

.catch((exception) => {
    this.isLoading = false;
    this.createNotificationError({
        title: this.$t('plugin-entity.errorTitle'),
        message: exception.message || this.$t('plugin-entity.defaultErrorMessage')
    });
});

内容的提问来源于stack exchange,提问作者mlodhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:30:17