Получите просто простые продукты, заказанные из цитаты при приобретении продуктов
-
16-10-2019 - |
Вопрос
У меня есть наблюдатель, прикрепленный к sales_order_place_before, и от этого события я получаю элементы заказа, используя
$event = $observer->getEvent();
$order = $event->getOrder();
$items = $order->getQuote()->getAllItems();
Когда я регистрирую эти элементы в предании, так что я получаю вдвое больше продуктов. То есть я получаю настраиваемый и простой продукт
foreach($items as $item){
$product = $item;
$sku = $product->getSku();
$name = $product->getName();
}
Если я изменю $ veems, чтобы быть $items = $order->getQuote()->getAllVisibleItems();
Тогда я могу получить только настраиваемые продукты, но я хочу получить только простые продукты.
Мой вопрос: как я могу получить только простые продукты от заказа.
Решение
Я думаю, что не существует прямых методов исключения конфигурации, поскольку логика в Magento заключается в том, что настраиваемым является «основной» продукт, в котором цена находится. Связанный простой продукт может иметь неправильную цену, настроенную. В любом случае, если вы хотите получить эти элементы, а не конфигурации, лучше всего использовать getAllItems()
Метод, а затем после этого выбивайте конфигурации:
$event = $observer->getEvent();
$order = $event->getOrder();
$items = $order->getQuote()->getAllItems();
$itemsExcludingConfigurables = array();
foreach ($items as $item) {
if ($item->getTypeId() != 'configurable') {
$itemsExcludingConfigurables[] = $item;
}
}
Другие советы
Это не так просто, потому что в одном предмет цитат может быть более одного детей (сгруппированные, предметы комплекта).
Поэтому я предлагаю что -то вроде:
$returnItems = array();
foreach($order->getQuote()->getAllVisibleItems() as $item){
if($item->getHasChildren()) {
foreach($item->getChildrenItems() as $child) {
$returnItems[] = $child;
}
} else {
$returnItems[] = $item;
}
}