gpt4 book ai didi

collections - 根据 final_price 获取 Magento 2 集合

转载 作者:行者123 更新时间:2023-12-04 02:40:15 25 4
gpt4 key购买 nike

我有以下代码来获取 Magento 2 产品系列:

<?php namespace Qxs\Related\Block;

class Related extends \Magento\Framework\View\Element\Template
{
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
\Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
\Magento\Catalog\Model\Product\Visibility $productVisibility,
\Magento\Framework\Registry $registry,
array $data = []
)
{
$this->_productCollectionFactory = $productCollectionFactory;
$this->productStatus = $productStatus;
$this->productVisibility = $productVisibility;
$this->_registry = $registry;
parent::__construct($context, $data);
}

public function getProductCollection()
{
try {

$product = $this->_registry->registry('current_product');

$range_percentage = 35;
$price_temp = round($product->getFinalPrice() / 100 * $range_percentage);
$price_from = $product->getFinalPrice() - $price_temp;
$price_to = $product->getFinalPrice() + $price_temp;

$categories = $product->getCategoryIds();

$collection = $this->_productCollectionFactory->create();
$collection->addAttributeToSelect('*')
->addCategoriesFilter(['in' => $categories])
->addPriceDataFieldFilter('%s >= %s', ['min_price', $price_from])
->addPriceDataFieldFilter('%s <= %s', ['min_price', $price_to])
->addMinimalPrice()
->addAttributeToFilter('entity_id', ['neq' => $product->getId()])
->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()])
->setVisibility($this->productVisibility->getVisibleInSiteIds())
->setPageSize(5);

return $collection;

} catch (\Exception $e) {

var_dump($e->getMessage());
}
}
}

上面的代码更新了一个工作示例

它将返回带有 addtofieldfilter 'price' 的结果,但它不适用于 final_price 属性。我需要根据 final_price 进行排序,因为可配置产品没有价格。代码返回:无效的属性名称。

如何在 final_price 属性中过滤价格范围?

谢谢,

最佳答案

final_price 是价格索引表的一部分,因此您不能像处理字段和属性那样使用它。您需要加入价格索引才能根据 final_price 进行筛选和排序。幸运的是,Magento 添加了一些漂亮的功能供我们在产品系列上使用; addPriceDataFieldFilter()addFinalPrice()

解决方案

为了能够实现您上面描述的逻辑,您需要将代码更改为如下所示:

$collection = $this->_productCollectionFactory->create();
$collection->addAttributeToSelect('*')
->addCategoriesFilter(['in' => $categories])
->addPriceDataFieldFilter('%s >= %s', ['final_price', $price_from])
->addPriceDataFieldFilter('%s <= %s', ['final_price', $price_to])
->addFinalPrice()
->addAttributeToFilter('entity_id', ['neq' => $product->getId()])
->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()])
->setVisibility($this->productVisibility->getVisibleInSiteIds())
->setPageSize(5);

注意函数的顺序。您必须始终在所有 addPriceDataFieldFilter() 之后调用 addFinalPrice(),否则将不会应用过滤器。

奖金

如果想按final_price排序,可以在addFinalPrice()之后添加如下代码:

$collection->getSelect()->order('price_index.final_price ASC');

引用资料

https://github.com/magento/magento2/blob/2.2.9/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php#L1465 https://github.com/magento/magento2/blob/2.2.9/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php#L2265

关于collections - 根据 final_price 获取 Magento 2 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49084751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com