Mengapa saya tidak dapat memuat produk berdasarkan SKU menggunakan loadBySku ()?

27

Ringkasan

Saya ingin memuat produk dengan SKU, ada banyak artikel, posting blog, hasil stack overflow, dll. Yang ingin saya ketahui adalah - mengapa harus begitu sulit memuat produk dengan 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');

Tentu saja, saya berharap terlalu banyak dari Magento pada saat ini simplecara melakukan sesuatu (sederhana adalah konsep yang Magento jelas tidak akrab dengan)

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

Jawaban:

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

Ini karena metodenya Mage_Catalog_Model_Product::loadBySkutidak ada. Pasti ada metode yang dipanggil loadBySkudi kelas Mage_Catalog_Model_Productagar kamu bisa menggunakannya, kecuali itu adalah metode sihir.

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

Di atas termasuk salah ketik. Seharusnya seperti di bawah ini. Anda perlu menetapkan Mage::getModel()->load()pengembalian apa $productsebelum melakukan hal-hal dengan objek produk.

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

Perhatikan bahwa dengan loadByAttribute, Anda tidak mendapatkan objek terkait seperti stok dan galeri media. Lihat Mage_Catalog_Model_Abstract::loadByAttributeuntuk info lebih lanjut.

musicliftsme
sumber
1
Kesalahan ketik telah diperbaiki;) Saya hanya mencoba memahami mengapa fitur dasar di Magento sangat rumit. Jika itu berkaitan dengan perubahan arsitektur, akan berguna untuk mempelajari hal ini. Jumlah waktu yang terbuang untuk mendapatkan perubahan fungsional kecil dan sederhana yang lengkap adalah hal yang bodoh - saya mendapatkan modul yang dapat digunakan kembali, tetapi terkadang tidak semuanya dapat digunakan kembali.
ash
Apakah Anda mengerti cara pemuatan produk bekerja? Awalnya saya merasakan hal yang sama, tetapi membaik.
musicliftsme
3
Saya memahaminya, kadang-kadang saya menemukan Magento mundur dibandingkan dengan pola.
ash
$ product = Mage :: getModel ('catalog / product') -> loadByAttribute ('sku', $ sku); ini bekerja untuk saya :) terima kasih !!!
jruzafa
@ jruzafa, perhatikan loadByAttribute()bahwa Anda tidak mendapatkan semua data produk terkait. Akan ada hal-hal yang hilang seperti stok dan objek media.
musicliftsme
21

Saya menguji waktu eksekusi untuk berbagai metode yang saya lihat memuat produk dengan SKU. Ini yang paling efisien:

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

Tes:

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

Hasil pengujian (dalam detik):

time1: 0.024642
time2: 0.079715
time3: 0.007891
Ted
sumber
patokan ini tidak mencukupi, kemungkinan variasi hanya dalam sekali jalan adalah tinggi. Cache di dalam DB bisa berdampak besar pada hasil di sini
Flyingmana
1

Untuk memuat produk dengan SKU di magento Anda dapat menggunakan kode berikut:

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

Saya menggunakan ini setiap kali dan bekerja dengan sempurna. Jika Anda ingin memuat banyak produk, coba ini

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

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

Brian
sumber
0

Seperti Sudah Diskusikan, Ini karena metodenya Mage_Catalog_Model_Product::loadBySkutidak ada. Harus ada metode yang dipanggil loadBySkudi kelas Mage_Catalog_Model_Productagar Anda dapat menggunakannya.

Anda juga dapat menggunakan loadByAttribute()metode untuk mendapatkan detail produk dengan 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;

Anda juga dapat melihat artikel ini untuk detail lebih lanjut https://www.ipragmatech.com/ultimate-magento-developer-guide-get-product-details-using-restapi-magento-1-x/

Javed Usmani
sumber
0

Waspadalah terhadap $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);!
Ini dapat bekerja 99% dari kasus, tetapi ini akan menghasilkan pemuatan atribut stock_itemkarena Varien_Objectalih-alih Mage_CatalogInventory_Model_Stock_Itemmetode seperti Mage_CatalogInventory_Model_Observer::checkQuoteItemQtyitu akan memanggil $stockItem instanceof Mage_CatalogInventory_Model_Stock_Itemyang akan membuang pengecualian!

Jadi cara terbaik adalah:

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