Извлечение простых данных о продукте из номенклатуры предложения на основе настраиваемого продукта


В моем модуле я хочу сделать некоторые вещи, если товар в корзине имеет пользовательский атрибут "пакет услуг".

Таким образом, используя /etc/catalog_attributes.xml Я раскрыл свойство

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/catalog_attributes.xsd">
    <group name="quote_item">
        <attribute name="servicepack"/>
    </group>
</config>

Затем я добавил свою логику.

/** @var /Magento\Quote\Model\Quote $quote */
$quoteItems = $quote->getItems();
foreach($quoteItems as $cartItem){

    $product = $cartItem->getProduct(); //This is the configurable product
    $simpleId= $product->getIdBySku($product->getSku());

    /** @var ProductRepositoryInterface $this->productRepository */
    $simpleProduct = $this->productRepository->getById($simpleId); //Seems overkill?

    if($simpleProduct->getData('servicepack') == 123){ //This property is only on the simple product
        // do stuff
    }
}

Я сомневаюсь, что это правильный способ справиться с этой ситуацией.

То, что меня смущает:
$cartItem - это настраиваемый продукт. Мой атрибут "пакет услуг" установлен только для простого продукта. Так что мне нужно получить простые данные о продукте. Я решил эту проблему, получив простой идентификатор продукта и получив простой продукт из ProductRepository.

Однако это кажется неэффективным, поскольку вызывает запрос бд для каждого продукта.

Вопрос: Возможно ли получить простые данные о продукте без запроса к базе данных?
Например: $product->getSimpleObject($product->getSku()); //Returns the $simpleProduct

Или мое решение будет считаться достойным способом решения проблем?

Author: nbjohan, 2016-12-23

1 answers

Вопрос немного устарел, но, поскольку я столкнулся с проблемой и сейчас на Magento 2.3.5, я хочу ответить на него.

Это легко, но не очевидно. Вам нужно использовать $quote->getItemsCollection(); вместо $quote->getItems();. Это даст вам объект коллекции с родительскими И дочерними продуктами. Если вам нужно рассмотреть только простые продукты, измените свой код следующим образом:

/** @var /Magento\Quote\Model\Quote $quote */
$quoteItems = $quote->getItemsCollection();
foreach($quoteItems as $cartItem){

    if($cartItem->getProductType() !== 'simple') {
        continue;
    }
                        }
    if($cartItem->getData('servicepack') == 123){ //This property is only on the simple product
        // do stuff
    }
}
 1
Author: EssGee, 2020-06-09 10:19:24