I have rewrite catalog product resource collection Magento\Catalog\Model\ResourceModel\Product\Collection.
Class override successfully but functions override is not working.
Suppose, i want override setOrder()function. But it does not work. Always calling Core function instead of rewrite class function..
<?php namespace AmitBera\CoreRewrite\Model\Rewrite\Catalog\ResourceModel\Product; class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection { protected $appState; public function __construct( \Magento\Framework\Data\Collection\EntityFactory $entityFactory, \Psr\Log\LoggerInterface $logger, \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\App\ResourceConnection $resource, \Magento\Eav\Model\EntityFactory $eavEntityFactory, \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper, \Magento\Framework\Validator\UniversalFactory $universalFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\Module\Manager $moduleManager, \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory, \Magento\Catalog\Model\ResourceModel\Url $catalogUrl, \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, \Magento\Customer\Model\Session $customerSession, \Magento\Framework\Stdlib\DateTime $dateTime, \Magento\Framework\App\State $appState, \Magento\Customer\Api\GroupManagementInterface $groupManagement, \Magento\Framework\DB\Adapter\AdapterInterface $connection = null ) { parent::__construct( $entityFactory, $logger, $fetchStrategy, $eventManager, $eavConfig, $resource, $eavEntityFactory, $resourceHelper, $universalFactory, $storeManager, $moduleManager, $catalogProductFlatState, $scopeConfig, $productOptionFactory, $catalogUrl, $localeDate, $customerSession, $dateTime, $groupManagement, $connection ); $this->_appState = $appState; } public function setOrder($attribute, $dir = \Magento\Framework\DB\Select::SQL_DESC) { echo __METHOD__; exit; if ($attribute == 'price') { $this->addAttributeToSort($attribute, $dir); } else { parent::setOrder($attribute, $dir); } return $this; } }
module.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNameSpaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="AmitBera_CoreRewrite" setup_version="2.0.0"> <sequence> <module name="Magento_Catalog"/> <module name="Magento_CatalogSearch"/> <module name="Magento_Checkout"/> <module name="Magento_Sales"/> <module name="Magento_Quote"/> <module name="Magento_Vault"/> <module name="Magento_OfflineShipping"/> </sequence> </module> </config>
di.xml
<?xml version="1.0" encoding="UTF-8"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Catalog\Model\ResourceModel\Product\Collection" type="AmitBera\CoreRewrite\Model\Rewrite\Catalog\ResourceModel\Product\Collection" /> </config>
Whenever use
$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); /** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $productCollection */$productCollection = $objectManager->create('Magento\Catalog\Model\ResourceModel\Product\Collection');echo get_class($productCollection );
Result : AmitBera\CoreRewrite\Model\Rewrite\Catalog\ResourceModel\Product\Collection\Interceptor
Question:
i donot understand why i am not able to override function setorder()
Why
echo get_class($productCollection );
give Interceptor class
If you want to override the ( setOrder()) kindly use the plugin instead of overriding the model class
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Catalog\Model\ResourceModel\Product\Collection"> <plugin name="tesultchange" type="Test\Test\Model\Resultchange" sortOrder="10" /></type> </config>
Resultchange.php
use after or before
<?php namespace Test\Test\Model; class Resultchange { public function aftersetOrder() { //do your thing } }