Dlaczego nie mogę załadować produktu według SKU za pomocą loadBySku ()?

27

Streszczenie

Chciałem załadować produkt według SKU. Jest wiele artykułów, postów na blogu, wyniki przepełnienia stosu itp. Chcę tylko wiedzieć - dlaczego ładowanie produktu przez SKU musi być tak trudne?

// This method does not work (Of all, I expect this to work)
$product = Mage::getModel('catalog/product')->loadBySku($sku);

// These do not work either
$product = Mage::getModel('catalog/product')->loadByAttribute($sku, 'sku');
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);

// This does not work
$product = Mage::getModel('catalog/product')->load($sku, 'sku');

Oczywiście, w tej chwili oczekuję od Magento zbyt wiele simplesposobu na zrobienie czegoś (prosta to koncepcja, której Magento najwyraźniej nie zna)

// This works:
$product = Mage::getModel('catalog/product');
$product->load($product->getIdBySku($sku));
popiół
źródło

Odpowiedzi:

56
// This method does not work (Of all, I expect this to work)
$product = Mage::getModel('catalog/product')->loadBySku($sku);

Wynika to z faktu, że metoda Mage_Catalog_Model_Product::loadBySkunie istnieje. Musi istnieć metoda wywoływana loadBySkuw klasie, Mage_Catalog_Model_Productabyś mógł z niej korzystać, chyba że jest to jakaś magiczna metoda.

// These do not work either
$product->getModel('catalog/product')->loadByAttribute($sku, 'sku');
$product->getModel('catalog/product')->loadByAttribute('sku', $sku);

Powyższe obejmuje literówki. Powinno być jak poniżej. Musisz przypisać to, co Mage::getModel()->load()powróci, $productzanim zrobisz rzeczy z obiektem produktu.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);

Zauważ, że dzięki loadByAttributenie otrzymujesz powiązanych obiektów, takich jak magazyn i galeria multimediów. Zobacz Mage_Catalog_Model_Abstract::loadByAttributewięcej informacji.

musicliftsme
źródło
1
Literówki zostały poprawione;) Próbuję tylko zrozumieć, dlaczego podstawowe funkcje Magento są tak skomplikowane. Jeśli ma to związek ze zmianami architektury, warto się o nich dowiedzieć. Czas tracony na próbę ukończenia Małe i proste zmiany funkcjonalne są głupie - dostaję moduły wielokrotnego użytku, ale czasami nie wszystko może być wielokrotnego użytku.
popiół
Rozumiesz jednak, jak działa ładowanie produktu? Na początku czułem się tak samo, ale jest coraz lepiej.
musicliftsme
3
Rozumiem to, czasami okazuje się, że Magento jest odwrotnie w stosunku do wzorów.
popiół
$ product = Mage :: getModel ('catalog / product') -> loadByAttribute ('sku', $ sku); to działa dla mnie :) dzięki !!!
jruzafa
@jruzafa, pamiętaj loadByAttribute(), że nie otrzymujesz wszystkich powiązanych danych produktu. Będzie brakowało takich rzeczy jak akcje i media.
musicliftsme
21

Testowałem czas wykonania dla różnych metod ładowania produktu przez SKU. Jest to najbardziej wydajny:

$product = Mage::getModel('catalog/product');
$product->load($product->getIdBySku($data['sku']));

Testy:

$time_start = microtime();
$product1 = Mage::getModel('catalog/product')->loadByAttribute('sku', $data['sku']);
$time_end = microtime();
$time1 = $time_end - $time_start;

$time_start = microtime();
$product2 = Mage::getSingleton('catalog/product')->getCollection()
            ->addAttributeToFilter('sku', $data['sku'])
            ->addAttributeToSelect('*')
            ->getFirstItem();
        // do a full product load, otherwise you might get some errors related to stock item
        $product2->load($product2->getId());
$time_end = microtime();
$time2 = $time_end - $time_start;

$time_start = microtime();
$product3 = Mage::getModel('catalog/product');
$product3->load($product3->getIdBySku($data['sku']));
$time_end = microtime();
$time3 = $time_end - $time_start;

echo "<pre>time1: $time1\ntime2: $time2\ntime3: $time3</pre>";

Wyniki testu (w sekundach):

time1: 0.024642
time2: 0.079715
time3: 0.007891
Przetrząsać
źródło
ten test porównawczy jest niewystarczający, możliwe różnice w jednym przebiegu są zbyt wysokie. Również pamięć podręczna w DB może mieć duży wpływ na wyniki tutaj
Flyingmana
1

Aby załadować produkt według SKU w magento, możesz użyć następującego kodu:

$_sku = 'leathershoes';
$_product = Mage::getModel('catalog/product')->loadByAttribute('sku',$_sku);
print $_product->getName(); // display product name

Używałem tego za każdym razem i działa idealnie. Jeśli chcesz załadować wiele produktów, spróbuj tego

$productSku = array('234', '267', '4523', 'Leather shoes', 'skin care'); // insert product SKU here
$attributes = Mage::getSingleton('catalog/config')->getProductAttributes();
$collection = Mage::getModel('catalog/product')
                ->getCollection()                
                ->addAttributeToFilter('sku', array('in' => $productSku))
                ->addAttributeToSelect($attributes);

Źródło referencyjne http://magentoexplorer.com/how-load-product-by-sku-or-id-in-magento

Brian
źródło
0

Jak już omówiono, Mage_Catalog_Model_Product::loadBySkudzieje się tak, ponieważ metoda nie istnieje. Abyś mógł z niej skorzystać, musi być wywołana metoda loadBySkuw klasie Mage_Catalog_Model_Product.

Możesz także użyć loadByAttribute()metod, aby uzyskać szczegółowe informacje o produktach przez sku.

    $sku  =  $this->getRequest()->getParam('SKU');
    $catalogMageObj = Mage::getModel('catalog/product');
    $products = $catalogMageObj->loadByAttribute('sku', $sku);

    // get the products details which you want
    $data = array(
    'id' => $products->getEntityId(),
    'sku' => $products->getSku(),
    'name' => $products->getName(),
    'attribute_set_id' => (int)$products->getAttributeSetId(),
    'price' => $products->getPrice(),
    'status' => $products->getStatus(),
    'visibility' => $products->getVisibility(),
    'type_id' => $products->getTypeId(),
    'created_at' => $products->getCreatedAt(),
    'updated_at' => $products->getUpdatedAt(),
    'product_links' => $productstypes, 
    'custom_attributes'  => $custom_attributes
);

// return the response as array
return $data;

Więcej informacji znajdziesz w tym artykule. https://www.ipragmatech.com/ultimate-magento-developer-guide-get-product-details-using-restapi-magento-1-x/

Javed Usmani
źródło
0

Uwaga $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);!
Może działać w 99% przypadków, ale spowoduje to załadowanie atrybutu, stock_itemponieważ Varien_Objectzamiast Mage_CatalogInventory_Model_Stock_Itemtego wywołane Mage_CatalogInventory_Model_Observer::checkQuoteItemQtyzostaną takie metody , $stockItem instanceof Mage_CatalogInventory_Model_Stock_Itemktóre spowodują wyjątek!

Więc najlepszym sposobem jest:

$product = Mage::getModel('catalog/product');
$product->setStoreId($storeId)->load($product->getIdBySku($sku));
Shadowbob
źródło