从官方文档https://developer.shopware.com/docs/guides/plugins/plugins/storefront/add-custom-sorting-product-listing.html很清楚如何在PLP上添加新的自定义排序与商店软件。 但如何实现按照参考价格排序呢?该值不存储在数据库中,而是动态计算的,因此无法在
$myCustomSorting->setFields()
处提供字段参数。
例如,我们有两种产品,总价为
10.00
和15.00
,这些产品的销售单位分别为0.5
和0.9
(每包m2)。我们希望根据每平方米参考价格10 / 0.5 = 20.00
和15 / 0.9 = 16.67
对产品进行排序。
最终通过以下解决方案解决了问题:
Shopware\Core\Content\Product\DataAbstractionLayer\CheapestPrice\CheapestPriceField
:class UnitPriceField extends CheapestPriceField
{
protected function getAccessorBuilderClass(): ?string
{
return UnitPriceFieldAccessorBuilder::class;
}
}
UnitPriceFieldAccessorBuilder
类,该类也扩展 Shopware\Core\Content\Product\DataAbstractionLayer\CheapestPrice\CheapestPriceAccessorBuilder
并考虑 referenceUnit
和 purchaseUnit
值重新计算结果:class UnitPriceFieldAccessorBuilder extends CheapestPriceAccessorBuilder
{
public function buildAccessor(string $root, Field $field, Context $context, string $accessor): ?string
{
$price = parent::buildAccessor($root, $field, $context, 'cheapestPrice');
return $price . ' * IFNULL(`product`.`reference_unit`, 1) / IFNULL(`product`.`purchase_unit`, 1)';
}
}
Shopware\Core\Content\Product\SalesChannel\SalesChannelProductDefinition
类以添加新字段:class SalesChannelProductDefinition extends ShopwareSalesChannelProductDefinition
{
protected function defineFields(): FieldCollection
{
$fields = parent::defineFields();
$fields->add(
(new UnitPriceField('unit_price', 'unitPrice'))
->addFlags(new Runtime())
);
return $fields;
}
}
product_sorting
/price-asc
的 price-desc
表以使用字段 product.unitPrice
而不是 product.cheapestPrice
。或者,只需在此处添加新的排序行即可。