Как перезаписать данные коллекции в родительском классе, все еще возвращая метод родительского класса в Magento2? - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь перезаписать блок в модуле magento / sales в Magento2, чтобы перезаписать новую коллекцию. Ниже приведен оригинальный модуль продаж ядра. Я использую Magento 2.2.4.

protected function _prepareCollection()
{
    $attributes = $this->_catalogConfig->getProductAttributes();
    /* @var $collection \Magento\Catalog\Model\ResourceModel\Product\Collection */
    $collection = $this->_productFactory->create()->getCollection();
    $collection->setStore(
        $this->getStore()
    )->addAttributeToSelect(
        $attributes
    )->addAttributeToSelect(
        'sku'
    )->addStoreFilter()->addAttributeToFilter(
        'type_id',
        $this->_salesConfig->getAvailableProductTypes()
    )->addAttributeToSelect(
        'gift_message_available'
    );

    $this->setCollection($collection);
    return parent::_prepareCollection();
}

Я пытаюсь добиться того, чтобы $ this-> setCollection ($ collection) установил другую коллекцию на основе разных условий. , Ниже моя перезапись для этого.

protected function _prepareCollection()
{
    $attributes = $this->_catalogConfig->getProductAttributes();
    $collection = $this->_productFactory->create()->getCollection();
    $collection->setStore(
        $this->getStore()
    )->addAttributeToSelect(
        $attributes
    )->addAttributeToSelect(
        'sku'
    )->addStoreFilter()->addAttributeToFilter(
        'type_id',
        $this->_salesConfig->getAvailableProductTypes()
    )->addAttributeToSelect(
        'gift_message_available'
    );

    $customerGroupId = $this->getCustomerGroupId();

    if ($customerGroupId == '1') {
        $this->debug_to_console('I am Trade.');
        $tradeCollection = $this->getTradeCollection($collection);
        $this->setCollection($tradeCollection);
    }

    if ($customerGroupId == '3') {
        $this->debug_to_console('I am Retail.');
        $retailCollection = $this->getRetailCollection($collection);
        $this->setCollection($retailCollection);
    }

    return parent::_prepareCollection();
}

Я хочу установить коллекцию на основе различных групп клиентов, а $ tradeCollection и $ retailCollection фактически устанавливают коллекцию правильно. Если я использую return $ this, он покажет правильную коллекцию, но если я использую return parent :: _ prepareCollection (), он все равно возвращает исходную коллекцию.

Однако у parent :: _ prepareCollection () есть фильтрация и сортировать functin с коллекцией, поэтому я должен использовать parent :: _ prepareCollection () вместо использования return $ this, потому что return $ this не имеет фильтрации и сортировки.

Итак, как мне использовать правильные collection, которые являются $ retailCollection и $ tradeCollection, и возвращают их обратно в parent :: _ prepareCollection (), так что он будет отображаться с правильной коллекцией с функцией фильтрации и сортировки?

...