我已经创建了一个执行CRUD(创建、读取、更新、删除)的自定义插件.在编辑页面中,除sw-media-field以外的所有字段都已保存.当我 Select 一个媒体文件时,它会显示,但当单击保存时,它会恢复到旧文件(如果没有任何文件,则为无).

新实体名称为‘CERTIFICATE’,列名为media_id.这里可能有什么错误,以至于只更新了media_id列?

CertificateDefinition class:

<?php declare(strict_types=1);

namespace Certificate\Entity;

use Shopware\Core\Checkout\Customer\CustomerDefinition;
use Shopware\Core\Content\Category\CategoryDefinition;
use Shopware\Core\Content\Media\MediaDefinition;
use Shopware\Core\Framework\DataAbstractionLayer\EntityDefinition;
use Shopware\Core\Framework\DataAbstractionLayer\Field\BoolField;
use Shopware\Core\Framework\DataAbstractionLayer\Field\FkField;
use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\PrimaryKey;
use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\Required;
use Shopware\Core\Framework\DataAbstractionLayer\Field\IdField;
use Shopware\Core\Framework\DataAbstractionLayer\Field\ManyToOneAssociationField;
use Shopware\Core\Framework\DataAbstractionLayer\Field\StringField;
use Shopware\Core\Framework\DataAbstractionLayer\FieldCollection;

class CertificateDefinition extends EntityDefinition
{
    public const ENTITY_NAME = 'certificate';

    public function getEntityName(): string
    {
        return self::ENTITY_NAME;
    }

    public function getEntityClass(): string
    {
        return CertificateEntity::class;
    }

    public function getCollectionClass(): string
    {
        return CertificateCollection::class;
    }

    protected function defineFields(): FieldCollection
    {
        return new FieldCollection(
            [
                (new IdField('id', 'id'))->addFlags(new Required(), new PrimaryKey()),
                (new StringField('name', 'name'))->addFlags(new Required()),
                (new StringField('file_name', 'fileName'))->addFlags(new Required()),
                (new BoolField('active', 'active'))->addFlags(new Required()),

                (new FkField('media_id', 'media', MediaDefinition::class))->addFlags(new Required()),
                (new ManyToOneAssociationField('media', 'media_id', MediaDefinition::class, 'id', true)),
            ]
        );
    }
}

detail.html.twig:

<sw-page class="certificate-detail">
    <template slot="smart-bar-actions">
        <sw-button :routerLink="{ name: 'webconia.certificate.list' }">
            {{ $t('certificate.detail.backButtonText') }}
        </sw-button>

        <sw-button-process :isLoading="isLoading"
                           :processSuccess="processSuccess"
                           variant="primary"
                           @process-finish="saveFinish"
                           @click="onClickSave">
            {{ $t('certificate.detail.saveButtonText') }}
        </sw-button-process>
    </template>
    <template slot="content">
        <sw-card-view>
            <sw-card v-if="certificate">
                <sw-field :label="$t('certificate.list.name')" v-model="certificate.name"
                          validation="required"></sw-field>
                <sw-field :label="$t('certificate.list.fileName')" v-model="certificate.fileName"
                          validation="required"></sw-field>
                <sw-switch-field :label="$t('certificate.detail.active')" v-model="certificate.active" size="medium"
                          validation="required"></sw-switch-field>

                <sw-media-field
                        :media-id="certificate.media.id"
                        fileAccept="application/pdf"
                        label="PDF upload"
                        @media-id-change="onMediaIdChange"
                        >
                </sw-media-field>
                <div>{{ certificate.media.fileName|json_encode }}{{ certificate.media.id|json_encode }}</div>

            </sw-card>
        </sw-card-view>
    </template>
</sw-page>

index.js:

import template from './certificate-detail.html.twig';
const { EntityCollection, Criteria } = Shopware.Data;

Shopware.Component.register('webconia-certificate-detail', {
    template,

    inject: [
        'repositoryFactory'
    ],

    metaInfo() {
        return {
            title: this.$createTitle()
        };
    },

    data() {
        return {
            repository: null,
            mediaReopsitory: null,
            isLoading: null,
            processSuccess: null,
            certificate: null
        };
    },

    created() {
        this.repository = this.repositoryFactory.create('certificate');
        this.mediaReopsitory = this.repositoryFactory.create('media');
        this.getCertificate();
    },
    methods: {
        onMediaIdChange(mediaId) {
            const mediaRepository = this.repositoryFactory.create('media');
            mediaRepository.get(mediaId, Shopware.Context.api).then((media) => {
                this.certificate.media = media;
                // this.certificate.mediaId = mediaId;
            });
        },
        getCertificate() {
            this.repository
                .get(this.$route.params.id, Shopware.Context.api, new Criteria().addAssociation('media'))
                .then((entity) => {
                    this.certificate = entity;
                });
        },
        onClickSave() {
            this.isLoading = true;
            // Save certificate
            this.repository
                .save(this.certificate, Shopware.Context.api)
                .then(() => {
                    this.getCertificate();
                    this.isLoading = false;
                    this.processSuccess = true
                }).catch((exception) => {
                this.isLoading = false;
                this.createNotificationError({
                    title: this.$tc('certificate.detail.errorTitle'),
                    message: exception
                });
            });
        },
        saveFinish() {
            this.processSuccess = false;
        },
    }
});

推荐答案

FkField人中的propertyName人不应该与协会的propertyName人相同.将其更改为定义中唯一的值,如mediaId.

(new FkField('media_id', 'mediaId', MediaDefinition::class))->addFlags(new Required()),
(new ManyToOneAssociationField('media', 'media_id', MediaDefinition::class, 'id', true)),

您还必须将新的mediaId属性的getter和setter添加到实体类中.

然后,您可以通过直接设置外键字段来关联现有媒体实体,如下所示:

onMediaIdChange(mediaId) {
    this.certificate.mediaId = mediaId;
},

或者更简单,只需将其用作sw-media-field的模型绑定,甚至不需要更改处理程序:

<sw-media-field v-model="certificate.mediaId" />

Php相关问答推荐

在AJX请求中使用简写后,FormData出现非法调用错误

如何在Woocommerce中禁用机器人添加到推车?

在ShipStation for WooCommerce中使用自定义订单项目元数据

WooCommerce/WordPress:简单的产品属性显示

将一个按钮添加到WooCommerce产品的管理视图中,该按钮链接到一个自定义的WebHook,并在末尾附加产品ID

在WooCommerce获取所有具有全球产品属性品牌的简单产品

模式 bootstrap 未显示

PHP按另一个二维数组的排序顺序对二维数组进行排序

隐藏WooCommerce管理子菜单;主页;来自store 经理

扩展 WooCommerce 类触发未捕获错误:未找到WC_Coupon类

Wordpress,配置一周第一天选项

我不明白为什么我收到未定义的数组键异常错误 - Laravel 9 PHP 8

正则表达式将文本替换为标签 html 以字符开头

我的功能以舒适的方式显示数组 struct

根据WooCommerce中选定的变体重量更改输入数量步值

在WooCommerce可变产品中显示所选变体的自定义字段

同一页面上多个组件的 Livewire 分页问题

如何修复正则表达式以在换行符后查找非数值

Laravel 10 单元测试看不到来自 Artisan Command 的数据库更改

Laravel 从嵌套数组的第二级获取最后一项