按属性及其特定参数对目录产品集合进行排序 Magento 2.4.6

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

我有一个名为“Promotion”的自定义属性(ID:489,代码:“special_attributes”),其中包括四个选项:Promo、Sale 等。我需要按“Sale”选项对目录产品集合进行排序,类似于产品按价格排序。例如,如果当前类别包含 15 个标记为“促销”的产品,则第一页应显示其中 12 个产品(根据分页设置),其余三个应显示在下一页的顶部。

之前,我尝试从代码的不同部分实现这种排序,但它只对当前分页页面上的产品进行排序,而不是整个集合。

我尝试为 Layer 类编写一个插件,但没有成功。也许这不是执行此任务的正确课程。任何关于在哪里以及如何实施这一点的指导将不胜感激。

/**
     * @param \Magento\Catalog\Model\Layer $subject
     * @param \Magento\Catalog\Model\Layer $result
     * @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
     */
    public function afterPrepareProductCollection($subject, $result, $collection)
    {
        if ($this->request->getFullActionName() !== 'catalog_category_view') {
            return;
        }

        $collection->getSelect()->reset(\Zend_Db_Select::ORDER);
        $this->joinAttribute('special_atributes', $collection);
        $this->sortCollectionByPromotionalAction($collection);

        return $this;
    }

    private function joinAttribute($attributeCode, $collection)
    {
        $fromPart = $collection->getSelect()->getPart(\Zend_Db_Select::FROM);
        if (array_key_exists($attributeCode, $fromPart)) {
            return false;
        }

        try {
            $attribute = $this->attrRepository->get(\Magento\Catalog\Api\Data\ProductAttributeInterface::ENTITY_TYPE_CODE, $attributeCode);

            if (!$attribute) {
                return false;
            }

            $collection->getSelect()->joinLeft(
                [$attributeCode => $attribute->getBackendTable()],
                "e.entity_id = {$attributeCode}.entity_id AND {$attributeCode}.attribute_id = {$attribute->getAttributeId()}",
                []
            );

            return true;
        } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
            return false;
        }
    }

    /**
     * @param \Magento\Framework\Data\Collection $collection
     * @return void
     */
    private function sortCollectionByPromotionalAction($collection)
    {
        $alias = 'is_actual_promotional_order';

        $expression = new \Zend_Db_Expr(
            "CASE
            WHEN FIND_IN_SET('5008', special_atributes.value) THEN 1
            ELSE 0
        END"
        );

        $collection->getSelect()->columns([
            $alias => $expression
        ]);

        $collection->getSelect()->order([
            "$alias DESC",
            "e.created_at DESC"
        ]);
    }

需要按属性及其具体参数对目录产品集合进行排序

php magento collections magento2
1个回答
0
投票

要在 Magento 2.4.6 中按特定属性及其参数对目录产品集合进行排序,您可以按照以下步骤操作:

  1. 创建块或助手:如果您在模块中工作,请创建块或助手类来处理排序逻辑。

  2. 注入必要的类:注入必要的类,如

    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
    以检索产品集合。

  3. 检索产品集合: 使用

    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
    类检索产品集合。

  4. 应用排序: 在集合对象上使用

    addAttributeToSort
    方法按所需属性及其参数进行排序。

这是一个示例代码片段:

<?php
namespace Vendor\Module\Block;

use Magento\Framework\View\Element\Template;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;

class ProductList extends Template
{
    protected $productCollectionFactory;

    public function __construct(
        Template\Context $context,
        CollectionFactory $productCollectionFactory,
        array $data = []
    ) {
        $this->productCollectionFactory = $productCollectionFactory;
        parent::__construct($context, $data);
    }

    public function getProductCollection()
    {
        $collection = $this->productCollectionFactory->create();
        $collection->addAttributeToSelect('*'); // Select all attributes
        $collection->addAttributeToSort('your_attribute_code', 'ASC'); // Change 'your_attribute_code' to the attribute code you want to sort by
        // You can also change 'ASC' to 'DESC' for descending order sorting
        return $collection;
    }
}

'your_attribute_code'
替换为您想要排序的实际属性代码。您可以在 Magento 管理面板的
Stores > Attributes > Product
下找到属性代码。

© www.soinside.com 2019 - 2024. All rights reserved.