浏览文章
文章信息
Magento2 custom product sorting with pagenation most viewed,best sold,newst,last
12931
主要程序:
di.xml依赖中注入插件:
... <type name="Magento\Catalog\Model\Config\Source\ListSort"> <plugin name="Aiweline_ProductSorting::system_config_source_list_sort" type="Aiweline\ProductSorting\Plugin\Model\Config\Source\ListSort" /> </type> ...插件类:
<?php /** * @DESC | 文件描述 * * @Author 秋枫雁飞/Aiweline * @Email aiweline@qq.com * @Company 成都潮派元素科技 * */ namespace Aiweline\ProductSorting\Plugin\Product\ProductList; use Aiweline\ProductSorting\Helper\Data; use Magento\Framework\App\ResourceConnection; use Magento\Framework\DB\Select; class Toolbar { private $_subQueryApplied = false; private $_collection = null; private $_conn = null; /** * Constructor * * @param \Magento\Framework\App\ResourceConnection $resource */ public function __construct(ResourceConnection $resource) { $this->_conn = $resource->getConnection('catalog'); } /** * @DESC | 环绕 设置集合 * * @Author 秋枫雁飞/Aiweline * @Email aiweline@qq.com * @Company 成都潮派元素科技 * * @参数区 * @param \Magento\Catalog\Block\Product\ProductList\Toolbar $subject * @param \Closure $proceed * @param $collection * @return mixed */ public function aroundSetCollection( \Magento\Catalog\Block\Product\ProductList\Toolbar $subject, \Closure $proceed, $collection ) { $this->_collection = $collection; $currentOrder = $subject->getCurrentOrder(); // 判断当前排序 if ($currentOrder) { /**@var $subject_collection \Magento\Catalog\Model\ResourceModel\Product\Collection */ $directionReverse = $this->getCurrentDirectionReverse($subject); switch ($currentOrder) { case 'newest': $collection->getSelect()->reset(Select::ORDER)->order('created_at ' . $directionReverse); $collection->setPageSize($subject->getLimit())->setCurPage($subject->getCurrentPage()); break; case 'mostviewed': $reportEventTable = $collection->getResource()->getTable('report_event'); $subSelect = $this->_conn->select()->from( ['report_event_table' => $reportEventTable], 'COUNT(report_event_table.event_id)' )->where( 'report_event_table.object_id = e.entity_id' ); $collection->getSelect()->reset(Select::ORDER)->columns( ['views' => $subSelect] )->order( 'views ' . $directionReverse ); $collection->setPageSize($subject->getLimit())->setCurPage($subject->getCurrentPage()); break; case 'bestseller': $reportEventTable = $collection->getResource()->getTable('sales_order_item'); $subSelect = $this->_conn->select()->from( ['order_item' => $reportEventTable], 'COUNT(order_item.product_id)' )->where( 'order_item.product_id = e.entity_id' ); $collection->getSelect()->reset(Select::ORDER)->columns( ['ordered' => $subSelect] )->order( 'ordered ' . $directionReverse ); $collection->setPageSize($subject->getLimit())->setCurPage($subject->getCurrentPage()); break; default: break; } } return $proceed($collection); } /** * @param \Magento\Catalog\Block\Product\ProductList\Toolbar $subject * @return string */ function getCurrentDirectionReverse(\Magento\Catalog\Block\Product\ProductList\Toolbar $subject): string { if ($subject->getCurrentDirection() == 'desc') return 'asc'; return 'desc'; } }