Warum kann ich ein Produkt nicht mit loadBySku () nach Artikelnummer laden?

27

Zusammenfassung

Ich wollte ein Produkt von einer SKU laden. Es gibt viele Artikel, Blog-Beiträge, Stapelüberlaufergebnisse usw. Ich möchte nur wissen, warum es so schwierig sein muss, ein Produkt von einer SKU zu laden.

// 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');

Natürlich erwarte ich zu diesem Zeitpunkt viel zu viel von Magento, um simpleetwas zu tun (einfach ist ein Konzept, mit dem Magento offensichtlich nicht vertraut ist).

// This works:
$product = Mage::getModel('catalog/product');
$product->load($product->getIdBySku($sku));
Asche
quelle

Antworten:

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

Dies liegt daran, dass die Methode Mage_Catalog_Model_Product::loadBySkunicht vorhanden ist. Es muss eine Methode loadBySkuin der Klasse vorhanden sein, die aufgerufen wird, Mage_Catalog_Model_Productdamit Sie sie verwenden können, es sei denn, es handelt sich um eine magische Methode.

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

Das obige schließt Tippfehler ein. Es sollte wie unten sein. Sie müssen zuweisen, was Mage::getModel()->load()zurückgegeben wird, $productbevor Sie mit dem Produktobjekt arbeiten.

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

Beachten Sie, dass Sie mit loadByAttributekeine verwandten Objekte wie den Bestand und die Mediengalerie erhalten. Siehe Mage_Catalog_Model_Abstract::loadByAttributefür weitere Informationen.

musicliftsme
quelle
1
Tippfehler wurden korrigiert;) Ich versuche nur zu verstehen, warum die grundlegenden Funktionen in Magento so kompliziert sind. Wenn es sich um Architekturänderungen handelt, ist es hilfreich, sich über diese zu informieren. Die Menge an Zeit, die verschwendet wird, um kleine und einfache Funktionsänderungen abzuschließen, ist dumm - ich bekomme übrigens wiederverwendbare Module, aber manchmal kann nicht alles wiederverwendbar sein.
Asche
Verstehen Sie, wie das Laden des Produkts funktioniert? Anfangs ging es mir genauso, aber es wird besser.
musicliftsme
3
Ich verstehe es, ich finde manchmal, dass Magento im Vergleich zu Mustern rückwärts ist.
Asche
$ product = Mage :: getModel ('catalog / product') -> loadByAttribute ('sku', $ sku); es funktioniert bei mir :) danke !!!
Jruzafa
@jruzafa, beachten loadByAttribute()Sie, dass Sie nicht alle zugehörigen Produktdaten erhalten. Es werden Dinge wie der Bestand und die Medienobjekte fehlen.
musicliftsme
21

Ich habe die Ausführungszeit für die verschiedenen Methoden getestet, die ich gesehen habe, um ein Produkt von der SKU zu laden. Dies ist die effizienteste:

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

Tests:

$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>";

Testergebnisse (in Sekunden):

time1: 0.024642
time2: 0.079715
time3: 0.007891
Ted
quelle
Dieser Benchmark ist unzureichend, mögliche Abweichungen in nur einem Lauf sind zu hoch. Auch der Cache in der DB könnte hier einen großen Einfluss auf die Ergebnisse haben
Flyingmana
1

Um ein Produkt nach Artikelnummer in Magento zu laden, können Sie den folgenden Code verwenden:

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

Ich habe das immer benutzt und es funktioniert perfekt. Wenn Sie mehrere Produkte laden möchten, versuchen Sie dies

$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);

Referenzquelle http://magentoexplorer.com/how-load-product-by-sku-or-id-in-magento

Brian
quelle
0

Wie bereits erläutert, liegt dies daran, dass die Methode Mage_Catalog_Model_Product::loadBySkunicht vorhanden ist. Es muss eine Methode loadBySkuin der Klasse vorhanden sein, die aufgerufen wird, Mage_Catalog_Model_Productdamit Sie sie verwenden können.

Sie können auch loadByAttribute()Methoden verwenden, um die Produktdetails per SKU abzurufen.

    $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;

Sie können auch einen Blick auf diesen Artikel werfen, um weitere Einzelheiten zu erfahren. https://www.ipragmatech.com/ultimate-magento-developer-guide-get-product-details-using-restapi-magento-1-x/

Javed Usmani
quelle
0

Vorsicht $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);!
Möglicherweise funktionieren 99% der Fälle, aber dies führt dazu, dass das Attribut stock_itemgeladen wird, Varien_Objectanstatt Mage_CatalogInventory_Model_Stock_Itemdass Methoden, wie Mage_CatalogInventory_Model_Observer::checkQuoteItemQtysie aufgerufen werden $stockItem instanceof Mage_CatalogInventory_Model_Stock_Item, eine Ausnahme auslösen würden!

Der beste Weg ist also:

$product = Mage::getModel('catalog/product');
$product->setStoreId($storeId)->load($product->getIdBySku($sku));
Shadowbob
quelle