$item->getsku() и $item->getProduct()->getsku() возвращают разные значения. Почему?


Редактировать: первоначально этот вопрос касался только объектов sales/order, но я обнаружил идентичную проблему и с объектами sales/quote, поэтому я редактирую его, чтобы включить это.

Я также добавил TL;DR внизу, что может быть более понятным для некоторых людей.


Я пытаюсь получить информацию о товарах из заказа/предложения, но обнаружил, что использование $item->getSku() не очень интуитивно понятно.

Он всегда возвращает дочерний артикул, даже если я запуск его внутри цикла getAllVisibleItems() (в отличие от просто getAllItems()).

Артикул, который он возвращает, отличается от $item->getProduct()->getSku().

При вызове внутри getAllVisibleItems() Я ожидал бы, что $item->getSku() вернет артикул родительского продукта, а не дочерний артикул (потому что родитель - это тот, который виден ).

Редактировать: Я обнаружил еще более проблемную проблему. Когда я зацикливаюсь на коллекции sales/quote вместо sales/order, вызов $item->getProduct()->getSku() даже не возвращает правильный (родительский) артикул. Это все еще возвращает неправильный артикул дочернего уровня. Чтобы получить правильный артикул родительского уровня, мне нужно фактически полностью загрузить продукт (см. Второй блок кода ниже).

Почему это происходит?

Вот мой код:

Для коллекций продаж/заказов:

<?php

$order = Mage::getModel("sales/order")->loadByIncrementId("123456");

foreach($order->getAllVisibleItems() as $orderItem) {
    echo "Item SKU =>    " . $orderItem->getSku();
    echo "Product SKU => " . $orderItem->getProduct()->getSku();
}

foreach($order->getAllItems() as $orderItem) {
    echo "Item SKU =>    " . $orderItem->getSku();
    echo "Product SKU => " . $orderItem->getProduct()->getSku();
}

// Output

getAllVisibleItems:
Item SKU    => SHOE1-SIZE5 // Parent product - misleading item SKU
Product SKU => SHOE1

Item SKU    => SHOE2-SIZE4 // Parent product - misleading item SKU
Product SKU => SHOE2       

getAllItems:
Item SKU    => SHOE1-SIZE5 // Parent product - misleading item SKU
Product SKU => SHOE1       

Item SKU    => SHOE1-SIZE5 // Child product - correct item SKU
Product SKU => SHOE1-SIZE5

Item SKU    => SHOE2-SIZE4 // Parent product - misleading item SKU
Product SKU => SHOE2

Item SKU    => SHOE2-SIZE4 // Child product - correct item SKU
Product SKU => SHOE2-SIZE4

Для коллекций продаж/предложений:

$quote = Mage::getModel("sales/quote")->load("98765");

foreach($quote->getAllVisibleItems() as $quoteItem) {
    echo "Item SKU                 => " . $quoteItem->getSku();
    echo "Product SKU              => " . $quoteItem->getProduct()->getSku();
    echo "Fully Loaded Product SKU => " . Mage::getModel("catalog/product")->load($quoteItem->getProduct()->getId())->getSku();
}

foreach($quote->getAllItems() as $quoteItem) {
    echo "Item SKU                 => " . $quoteItem->getSku();
    echo "Product SKU              => " . $quoteItem->getProduct()->getSku();
    echo "Fully Loaded Product SKU => " . Mage::getModel("catalog/product")->load($quoteItem->getProduct()->getId())->getSku();
}

// Output

getAllVisibleItems:
Item SKU                 => SHOE1-SIZE5 // The child SKU (wrong)
Product SKU              => SHOE1-SIZE5 // Different behaviour than sales/order object
Fully Loaded Product SKU => SHOE1       // The parent SKU (correct)

Item SKU                 => SHOE2-SIZE4 // The child SKU (wrong)
Product SKU              => SHOE2-SIZE4 // Different behaviour than sales/order object
Fully Loaded Product SKU => SHOE2       // The parent SKU (correct)

getAllItems:
Item SKU                 => SHOE1-SIZE5 // Parent product - misleading item SKU
Product SKU              => SHOE1-SIZE5 // Misleading
Fully Loaded Product SKU => SHOE2       // Correct

Item SKU                 => SHOE1-SIZE5 // Child product - correct item SKU
Product SKU              => SHOE1-SIZE5 // Correct
Fully Loaded Product SKU => SHOE1-SIZE5 // Correct

Item SKU                 => SHOE2-SIZE4 // Parent product - misleading item SKU
Product SKU              => SHOE2-SIZE4 // Misleading
Fully Loaded Product SKU => SHOE2       // Correct

Item SKU                 => SHOE2-SIZE4 // Child product - correct item SKU
Product SKU              => SHOE2-SIZE4 // Correct
Fully Loaded Product SKU => SHOE2-SIZE4 // Correct

TL;ДР

TL;DR этого поста: Эти два артикула получаются разными. Почему?

$cartItems = Mage::getSingleton('checkout/cart')->getQuote()->getAllVisibleItems();

foreach ($cartItems as $cartItem) {

    // These two SKUs are different. Why?
    echo $cartItem->getProduct()->getSku();
    echo Mage::getModel("catalog/product")->load($cartItem->getProduct()->getId())->getSku();

}
Author: WackGet, 2016-07-05

1 answers

Я думаю, что это намеренное поведение (см. https://github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/core/Mage/Catalog/Model/Product/Type/Configurable.php#L832) , возможно, в целях демонстрации, но я согласен с вами: для модных товаров это в основном неправильное ожидаемое поведение.

Это очень легко обойти, хотя: просто позвоните

 $item->getProduct()->getData('sku')

Вместо $item->getProduct()->getSku(). Вам определенно следует избегать перезагрузки товара во время корзины и заказа операций, так как в этом нет необходимости и это может привести к проблемам с производительностью.

 5
Author: fmrng, 2016-07-06 06:34:03