可以使用Shopware 6的标签体系来给产品属性值添加标签。我们可以将每个产品属性映射到Shopware 6标签,并将标签附加到相应的属性值。这样使得按照标签进行过滤和查找变得更加简单方便。
以下是相应代码示例。
首先解析标签数据并将其映射到属性。需要实现一个自定义的标签映射类,该类必须实现Shopware\Core\Framework\DataAbstractionLayer\EntityExtensionInterface接口。在自定义类中重写“extendFields”,在自定义实体中添加字段,并且通过该字段将标签映射到属性:
public function extendFields(FieldCollection $collection): void
{
$collection->add(
(new OneToManyAssociationField(
'tags',
TagDefinition::class,
'property_id',
'id'
))->addFlags(new CascadeDelete())
);
}
接下来在数据上传之前,将标签和属性值进行匹配。需要通过扩展“ProductListingResult”,实现过滤功能,并通过“product_listing.result”事件传递。使用以下代码来实现:
[
['addTagsToProduct', EventPriorities::POST_QUERY]
]
];
}
public function addTagsToProduct(ProductListingResultEvent $event): void
{
$result = $event->getResult();
$ids = array_column($result->getEntities(), 'id');
$criteria = new Criteria($ids);
$criteria->addAssociation('tags');
/** @var EntityCollection $products */
$products = $this->productRepository->search($criteria, $result->getContext())->getEntities();
foreach ($products as $product) {
if (!$product->getTags()) {
continue;
}
foreach ($result->getEntities() as &$entity) {
if ($entity['id'] === $product->getId()) {
$tags = $product->getTags()->map(function (TagEntity $tag) {
return $tag->getName();
});
$entity['_tags'] = $tags->getElements();
break;
}
}
}
$event->setResult($result);
}
在前端显示筛选器时,使用Vue.js动态生成属性列表和标签过滤器,用Vue.js组件实现呈现,并使用以下代码从API获取数据:
methods: {
async fetchData() {
this.isLoading = true;
const propertyGroupResponse = await this.propertyGroupRepository.search(new Criteria(), this.context);
this.propertyGroups = propertyGroupResponse.getEntities();
const criteria = new Criteria();
criteria.addAssociation('options');
const propertyResponse = await this.propertyRepository.search(criteria, this.context);
this.propertyList = propertyResponse.getEntities();
this.properties = this.propertyList.reduce((acc, property) => {
const option = property.options.first();
const groupId = option.groupId;
if (!acc[groupId]) {
acc[groupId] = {
group: propertyGroupResponse.get(productGroup => {
return product