Shopware中按参考价格排序

问题描述 投票:0回答:1

从官方文档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
对产品进行排序。

sorting shopware
1个回答
0
投票

最终通过以下解决方案解决了问题:

  • 创建新的 UnitPrice 字段类,该类扩展
    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;
    }
}
  • 更新 url-keys
    product_sorting
    /
    price-asc
    price-desc
    表以使用字段
    product.unitPrice
    而不是
    product.cheapestPrice
    。或者,只需在此处添加新的排序行即可。
© www.soinside.com 2019 - 2024. All rights reserved.