Извлечение простых данных о продукте из номенклатуры предложения на основе настраиваемого продукта
В моем модуле я хочу сделать некоторые вещи, если товар в корзине имеет пользовательский атрибут "пакет услуг".
Таким образом, используя /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
Или мое решение будет считаться достойным способом решения проблем?
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
}
}