<legend id='7Hfl1'><style id='7Hfl1'><dir id='7Hfl1'><q id='7Hfl1'></q></dir></style></legend>
    • <bdo id='7Hfl1'></bdo><ul id='7Hfl1'></ul>
  1. <small id='7Hfl1'></small><noframes id='7Hfl1'>

  2. <i id='7Hfl1'><tr id='7Hfl1'><dt id='7Hfl1'><q id='7Hfl1'><span id='7Hfl1'><b id='7Hfl1'><form id='7Hfl1'><ins id='7Hfl1'></ins><ul id='7Hfl1'></ul><sub id='7Hfl1'></sub></form><legend id='7Hfl1'></legend><bdo id='7Hfl1'><pre id='7Hfl1'><center id='7Hfl1'></center></pre></bdo></b><th id='7Hfl1'></th></span></q></dt></tr></i><div id='7Hfl1'><tfoot id='7Hfl1'></tfoot><dl id='7Hfl1'><fieldset id='7Hfl1'></fieldset></dl></div>
    <tfoot id='7Hfl1'></tfoot>

    1. 商店用品 6 |克隆 CmsElement 并将 null 作为数据

      时间:2023-10-20
    2. <legend id='bGfsk'><style id='bGfsk'><dir id='bGfsk'><q id='bGfsk'></q></dir></style></legend>
    3. <small id='bGfsk'></small><noframes id='bGfsk'>

          1. <tfoot id='bGfsk'></tfoot>
              <bdo id='bGfsk'></bdo><ul id='bGfsk'></ul>
                <tbody id='bGfsk'></tbody>

                <i id='bGfsk'><tr id='bGfsk'><dt id='bGfsk'><q id='bGfsk'><span id='bGfsk'><b id='bGfsk'><form id='bGfsk'><ins id='bGfsk'></ins><ul id='bGfsk'></ul><sub id='bGfsk'></sub></form><legend id='bGfsk'></legend><bdo id='bGfsk'><pre id='bGfsk'><center id='bGfsk'></center></pre></bdo></b><th id='bGfsk'></th></span></q></dt></tr></i><div id='bGfsk'><tfoot id='bGfsk'></tfoot><dl id='bGfsk'><fieldset id='bGfsk'></fieldset></dl></div>
                本文介绍了商店用品 6 |克隆 CmsElement 并将 null 作为数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                我尝试克隆内容元素 image-sliderimage-gallery(两者都会出现错误)以扩展它们.首先,我注册一个新的 CmsElement,就像原来的 only 将名称从 image-slider 更改为 image-slider-example

                I try to clone the content element image-slider or image-gallery (the error will come at both) to extend them. First I register a new CmsElement like the original only changes the name from image-slider to image-slider-example

                import './component';
                import './config';
                import './preview';
                
                Shopware.Service('cmsService').registerCmsElement({
                    name: 'image-slider-example',
                    label: 'sw-cms.elements.imageSlider.label',
                    component: 'sw-cms-el-image-slider',
                    configComponent: 'sw-cms-el-config-image-slider',
                    previewComponent: 'sw-cms-el-preview-image-slider',
                    defaultConfig: {
                        sliderItems: {
                            source: 'static',
                            value: [],
                            required: true,
                            entity: {
                                name: 'media'
                            }
                        },
                        displayMode: {
                            source: 'static',
                            value: 'standard'
                        },
                        minHeight: {
                            source: 'static',
                            value: '300px'
                        },
                        verticalAlign: {
                            source: 'static',
                            value: null
                        }
                    },
                    enrich: function enrich(elem, data) {
                        if (Object.keys(data).length < 1) {
                            return;
                        }
                
                        Object.keys(elem.config).forEach((configKey) => {
                            const entity = elem.config[configKey].entity;
                
                            if (!entity) {
                                return;
                            }
                
                            const entityKey = entity.name;
                            if (!data[`entity-${entityKey}`]) {
                                return;
                            }
                
                            elem.data[configKey] = [];
                            elem.config[configKey].value.forEach((sliderItem) => {
                                elem.data[configKey].push({
                                    newTab: sliderItem.newTab,
                                    url: sliderItem.url,
                                    media: data[`entity-${entityKey}`].get(sliderItem.mediaId)
                                });
                            });
                        });
                    }
                });
                
                

                现在它向我展示了购物体验中的新元素,我可以在其中使用它.

                Now It shows me the new element in the Shopping Experience, where I can use it.

                之后,我为店面创建 cms-element-image-slider-example.html.twig 文件,该文件将由 Shopware 加载.

                After that I create for the storefront the cms-element-image-slider-example.html.twig file, which will be loaded by Shopware.

                {% sw_extends '@Storefront/storefront/element/cms-element-image-slider.html.twig' %}
                
                {% block element_image_slider_alignment %}
                    <pre>
                        {{ dump(element) }}
                    </pre>
                    {{ parent() }}
                {% endblock %}
                

                现在我扩展了我从中克隆的原始店面元素,并添加了一个 dump 以查看所有数据.但是我有一个问题, element.datanull 但应该存储所有图像.

                Now I extend the original storefront element from which I was cloning and add a dump to see all data. But there I have the issue, that the element.data are null but there should be all images stored.

                推荐答案

                你需要创建一个数据解析器,它应该如下所示:

                You need to create a data resolver which should look like:

                <?php declare(strict_types=1);
                
                namespace PluginNameCoreContentMediaCms;
                
                use ShopwareCoreContentCmsAggregateCmsSlotCmsSlotEntity;
                use ShopwareCoreContentCmsDataResolverCriteriaCollection;
                use ShopwareCoreContentCmsDataResolverElementAbstractCmsElementResolver;
                use ShopwareCoreContentCmsDataResolverElementElementDataCollection;
                use ShopwareCoreContentCmsDataResolverFieldConfig;
                use ShopwareCoreContentCmsDataResolverResolverContextEntityResolverContext;
                use ShopwareCoreContentCmsDataResolverResolverContextResolverContext;
                use ShopwareCoreContentCmsSalesChannelStructImageStruct;
                use ShopwareCoreContentMediaMediaDefinition;
                use ShopwareCoreContentMediaMediaEntity;
                use ShopwareCoreFrameworkDataAbstractionLayerSearchCriteria;
                
                class ImageCmsElementResolver extends AbstractCmsElementResolver
                {
                    public function getType(): string
                    {
                        return 'image';
                    }
                
                    public function collect(CmsSlotEntity $slot, ResolverContext $resolverContext): ?CriteriaCollection
                    {
                        $config = $slot->getFieldConfig();
                        $mediaConfig = $config->get('media');
                
                        if (!$mediaConfig || $mediaConfig->isMapped() || $mediaConfig->getValue() === null) {
                            return null;
                        }
                
                        $criteria = new Criteria([$mediaConfig->getValue()]);
                
                        $criteriaCollection = new CriteriaCollection();
                        $criteriaCollection->add('media_' . $slot->getUniqueIdentifier(), MediaDefinition::class, $criteria);
                
                        return $criteriaCollection;
                    }
                
                    public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
                    {
                        $config = $slot->getFieldConfig();
                        $image = new ImageStruct();
                        $slot->setData($image);
                
                        if ($urlConfig = $config->get('url')) {
                            if ($urlConfig->isStatic()) {
                                $image->setUrl($urlConfig->getValue());
                            }
                
                            if ($urlConfig->isMapped() && $resolverContext instanceof EntityResolverContext) {
                                $url = $this->resolveEntityValue($resolverContext->getEntity(), $urlConfig->getValue());
                                if ($url) {
                                    $image->setUrl($url);
                                }
                            }
                
                            if ($newTabConfig = $config->get('newTab')) {
                                $image->setNewTab($newTabConfig->getValue());
                            }
                        }
                
                        $mediaConfig = $config->get('media');
                        if ($mediaConfig && $mediaConfig->getValue()) {
                            $this->addMediaEntity($slot, $image, $result, $mediaConfig, $resolverContext);
                        }
                    }
                
                    private function addMediaEntity(CmsSlotEntity $slot, ImageStruct $image, ElementDataCollection $result, FieldConfig $config, ResolverContext $resolverContext): void
                    {
                        if ($config->isMapped() && $resolverContext instanceof EntityResolverContext) {
                            /** @var MediaEntity|null $media */
                            $media = $this->resolveEntityValue($resolverContext->getEntity(), $config->getValue());
                
                            if ($media !== null) {
                                $image->setMediaId($media->getUniqueIdentifier());
                                $image->setMedia($media);
                            }
                        }
                
                        if ($config->isStatic()) {
                            $image->setMediaId($config->getValue());
                
                            $searchResult = $result->get('media_' . $slot->getUniqueIdentifier());
                            if (!$searchResult) {
                                return;
                            }
                
                            /** @var MediaEntity|null $media */
                            $media = $searchResult->get($config->getValue());
                            if (!$media) {
                                return;
                            }
                
                            $image->setMedia($media);
                        }
                    }
                }
                

                如果您创建解析器,则需要在 src/Resources/config/services.xml

                If you create your Resolver, you need to register the resolver in your src/Resources/config/services.xml

                
                <?xml version="1.0" ?>
                
                <container xmlns="http://symfony.com/schema/dic/services"
                           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
                
                    <services>
                        <service id="PluginNameCoreContentMediaCmsImageCmsElementResolver">
                            <tag name="shopware.cms.data_resolver"/>
                        </service>
                    </services>
                </container>
                
                

                这篇关于商店用品 6 |克隆 CmsElement 并将 null 作为数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                上一篇:symfony 2 twig 访问数组 javascript 索引 下一篇:GRAV 子导航

                相关文章

              1. <small id='vYGJG'></small><noframes id='vYGJG'>

                    <bdo id='vYGJG'></bdo><ul id='vYGJG'></ul>
                1. <legend id='vYGJG'><style id='vYGJG'><dir id='vYGJG'><q id='vYGJG'></q></dir></style></legend>

                  1. <tfoot id='vYGJG'></tfoot>
                    <i id='vYGJG'><tr id='vYGJG'><dt id='vYGJG'><q id='vYGJG'><span id='vYGJG'><b id='vYGJG'><form id='vYGJG'><ins id='vYGJG'></ins><ul id='vYGJG'></ul><sub id='vYGJG'></sub></form><legend id='vYGJG'></legend><bdo id='vYGJG'><pre id='vYGJG'><center id='vYGJG'></center></pre></bdo></b><th id='vYGJG'></th></span></q></dt></tr></i><div id='vYGJG'><tfoot id='vYGJG'></tfoot><dl id='vYGJG'><fieldset id='vYGJG'></fieldset></dl></div>