Shopware 6.6自定义CMS Resolver拖拽后数据不显示问题求助
Shopware 6.6自定义CMS Resolver拖拽后数据不显示问题
问题概述
自定义CMS Resolver在Shopware 6.5中运行正常,升级至6.6后,拖拽自定义CMS Element时,Resolver返回的内容数据无法显示,控制台抛出TypeError: _filter_asset is not a function错误。即使复制Shopware官方标准CMS Resolver代码并修改类型,问题依然存在。
控制台错误信息
app.js?1725361876:79 An error was captured in current module: TypeError: _filter_asset is not a function at Proxy.render (eval at AZ (app.js?1725361876:43:411), <anonymous>:50:14) at nj (app.js?1725361876:39:174753) at eO.fn (app.js?1725361876:39:210999) at eO.run (app.js?1725361876:39:161136) at X.e.update (app.js?1725361876:39:211402) at X (app.js?1725361876:39:211428) at Z (app.js?1725361876:39:209524) at W (app.js?1725361876:39:209299) at x (app.js?1725361876:39:206117) at eO.fn (app.js?1725361876:39:210450)
自定义Resolver代码(原演示版本)
class ProductTestCmsElementResolver extends AbstractCmsElementResolver { public function getType(): string { return 'product-test'; } public function collect(CmsSlotEntity $slot, ResolverContext $resolverContext): ?CriteriaCollection { return null; } public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void { $data = new ProductListingStruct(); $slot->setData($data); // 替换为演示数据 $demoProducts = [ [ 'id' => Uuid::randomHex(), 'name' => 'Demo Produkt 1', 'price' => '19.99', 'manufacturer' => 'Demo Hersteller 1', ], [ 'id' => Uuid::randomHex(), 'name' => 'Demo Produkt 2', 'price' => '29.99', 'manufacturer' => 'Demo Hersteller 2', ], [ 'id' => Uuid::randomHex(), 'name' => 'Demo Produkt 3', 'price' => '39.99', 'manufacturer' => 'Demo Hersteller 3', ], ]; $data->setListing($demoProducts); } }
问题分析与解决方案
1. 控制台错误的直接原因
_filter_asset是Shopware前端的资产过滤函数,6.6版本中该函数的调用方式发生了变更:
- 旧版本直接调用
_filter_asset() - 新版本需通过全局
$assets对象调用:$assets.filter()
检查你的自定义CMS Element的Vue模板,若存在类似_filter_asset(product.cover)的代码,替换为$assets.filter(product.cover)即可解决该函数报错问题。
2. Resolver数据结构适配问题
你的演示数据是普通数组,而ProductListingStruct的listing字段预期接收的是ProductEntity实例集合。前端模板可能尝试读取产品的cover等字段,因数据结构不匹配导致后续逻辑报错。
修改Resolver的enrich方法,构造符合Shopware标准的产品实体数据:
public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void { $data = new ProductListingStruct(); $slot->setData($data); $demoProducts = []; $currencyId = $resolverContext->getContext()->getCurrencyId(); foreach (range(1, 3) as $i) { // 创建标准ProductEntity实例 $product = new ProductEntity(); $product->setId(Uuid::randomHex()); $product->setName("Demo Produkt {$i}"); // 设置符合Shopware格式的价格数据 $product->setPrice([ [ 'gross' => 19.99 + ($i * 10), 'net' => 16.99 + ($i * 10), 'currencyId' => $currencyId ] ]); // 添加封面媒体实体,避免前端无数据报错 $cover = new MediaEntity(); $cover->setId(Uuid::randomHex()); $cover->setUrl("/demo-product-{$i}.jpg"); $product->setCover($cover); // 添加制造商实体 $manufacturer = new ManufacturerEntity(); $manufacturer->setName("Demo Hersteller {$i}"); $product->setManufacturer($manufacturer); $demoProducts[] = $product; } $data->setListing($demoProducts); }
3. 其他检查项
- 确认
service.xml中Resolver的注册标签shopware.cms.data_resolver配置正确,服务优先级未被覆盖 - 检查后台用户权限,确保可访问自定义CMS Element的相关数据
- 在前端Vue组件中打印
slot.data,验证Resolver是否正确传递数据
补充说明
Shopware 6.6对CMS模块的前端逻辑做了较多细节优化,部分未公开的变更集中在模板渲染和数据结构校验上,严格遵循官方实体结构传递数据可避免大部分兼容性问题。
内容的提问来源于stack exchange,提问作者BestItSebastianHöck
相关产品推荐
相关产品推荐

