我有一个名为“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"
]);
}
需要按属性及其具体参数对目录产品集合进行排序
要在 Magento 2.4.6 中按特定属性及其参数对目录产品集合进行排序,您可以按照以下步骤操作:
创建块或助手:如果您在模块中工作,请创建块或助手类来处理排序逻辑。
注入必要的类:注入必要的类,如
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
以检索产品集合。
检索产品集合: 使用
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
类检索产品集合。
应用排序: 在集合对象上使用
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
下找到属性代码。