Perché non riesco a caricare un prodotto per SKU usando loadBySku ()?


27

Sinossi

Volevo caricare un prodotto per SKU, ci sono molti articoli, post di blog, risultati di overflow dello stack, ecc. Tutto quello che voglio sapere è: perché deve essere così difficile caricare un prodotto per SKU?

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

Certo, mi aspetto troppo da Magento a questo punto un simplemodo di fare qualcosa (semplice è un concetto con cui Magento chiaramente non ha familiarità)

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

Risposte:


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

Questo perché il metodo Mage_Catalog_Model_Product::loadBySkunon esiste. Ci deve essere un metodo chiamato loadBySkunella classe Mage_Catalog_Model_Productper poterlo usare, a meno che non sia un metodo magico.

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

Quanto sopra include errori di battitura. Dovrebbe essere come sotto. Devi assegnare ciò a cui Mage::getModel()->load()ritorna $productprima di fare cose con l'oggetto prodotto.

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

Si noti che con loadByAttributenon si ottengono oggetti correlati come la galleria supporti e supporti. Vedi Mage_Catalog_Model_Abstract::loadByAttributeper maggiori informazioni.


1
Gli errori di battitura sono stati corretti;) Sto solo cercando di capire perché le funzionalità di base in Magento sono così complicate. Se ha a che fare con i cambiamenti dell'architettura, sarebbe utile conoscerli. La quantità di tempo sprecata nel tentativo di completare piccoli e semplici cambiamenti funzionali è stupida: ottengo moduli riutilizzabili è la strada giusta, ma a volte non tutto può essere riutilizzabile.
cenere

Capisci come funziona il caricamento del prodotto? All'inizio mi sentivo allo stesso modo, ma migliora.
musicliftsme,

3
Lo capisco, a volte trovo che Magento sia arretrato rispetto agli schemi.
cenere

$ product = Mage :: getModel ('catalogue / product') -> loadByAttribute ('sku', $ sku); funziona per me :) grazie !!!
jruzafa,

@jruzafa, nota loadByAttribute()che non ottieni tutti i dati relativi ai prodotti. Mancheranno cose come gli oggetti stock e multimediali.
musicliftsme,

21

Ho testato i tempi di esecuzione dei vari metodi che ho visto per caricare un prodotto tramite SKU. Questo è il più efficiente:

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

test:

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

Risultati del test (in secondi):

time1: 0.024642
time2: 0.079715
time3: 0.007891

questo benchmark è insufficiente, le possibili variazioni in una sola corsa sono troppo alte. Anche la cache all'interno del DB potrebbe avere un grande impatto sui risultati qui
Flyingmana,

1

Per caricare il prodotto tramite SKU in magento è possibile utilizzare il seguente codice:

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

L'ho usato ogni volta e funziona perfettamente. Se vuoi caricare più prodotti, prova questo

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

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


0

Come già discusso, questo è perché il metodo Mage_Catalog_Model_Product::loadBySkunon esiste. È necessario un metodo chiamato loadBySkunella classe Mage_Catalog_Model_Productper poterlo utilizzare.

Puoi anche usare i loadByAttribute()metodi per ottenere i dettagli dei prodotti da 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;

Puoi anche dare un'occhiata a questo articolo per maggiori dettagli. https://www.ipragmatech.com/ultimate-magento-developer-guide-get-product-details-using-restapi-magento-1-x/


0

Attenzione $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);!
Può funzionare il 99% dei casi, ma ciò comporterà il caricamento dell'attributo, in stock_itemquanto Varien_Objectinvece Mage_CatalogInventory_Model_Stock_Itemsu metodi come Mage_CatalogInventory_Model_Observer::checkQuoteItemQtychiamerà $stockItem instanceof Mage_CatalogInventory_Model_Stock_Itemche genererebbe un'eccezione!

Quindi il modo migliore è:

$product = Mage::getModel('catalog/product');
$product->setStoreId($storeId)->load($product->getIdBySku($sku));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.