Tại sao tôi không thể tải sản phẩm bằng SKU bằng loadBySku ()?


27

Tóm tắc

Tôi muốn tải một sản phẩm bằng SKU, có rất nhiều bài viết, bài đăng trên blog, kết quả tràn ngăn xếp, v.v. Tất cả những gì tôi muốn biết là - tại sao SKU lại quá khó để tải sản phẩm?

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

Tất nhiên, tôi đang mong đợi quá nhiều từ Magento vào thời điểm này một simplecách làm việc gì đó (đơn giản là một khái niệm Magento rõ ràng không quen thuộc)

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

Câu trả lời:


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

Điều này là do phương thức Mage_Catalog_Model_Product::loadBySkukhông tồn tại. Phải có một phương thức được gọi loadBySkutrong lớp Mage_Catalog_Model_Productđể bạn có thể sử dụng nó, trừ khi đó là một phương thức ma thuật.

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

Ở trên bao gồm lỗi chính tả. Nó sẽ giống như dưới đây. Bạn cần chỉ định những gì Mage::getModel()->load()trả về $producttrước khi thực hiện công cụ với đối tượng sản phẩm.

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

Lưu ý rằng với loadByAttribute, bạn không nhận được các đối tượng liên quan như thư viện chứng khoán và phương tiện truyền thông. Xem Mage_Catalog_Model_Abstract::loadByAttributeđể biết thêm.


1
Typose đã được sửa chữa;) Tôi chỉ cố gắng hiểu tại sao các tính năng cơ bản trong Magento lại phức tạp đến vậy. Nếu nó liên quan đến thay đổi kiến ​​trúc, sẽ rất hữu ích khi tìm hiểu về những điều này. Lượng thời gian lãng phí khi cố gắng hoàn thành các thay đổi chức năng nhỏ và đơn giản là ngu ngốc - Tôi nhận được các mô-đun có thể tái sử dụng là cách, nhưng đôi khi không phải mọi thứ đều có thể tái sử dụng.
tro

Bạn có hiểu làm thế nào tải sản phẩm làm việc, mặc dù? Tôi cảm thấy như vậy lúc đầu, nhưng nó trở nên tốt hơn.
nhạcliftsme

3
Tôi hiểu điều đó, đôi khi tôi thấy Magento ngược so với các mẫu.
tro

$ sản phẩm = Mage :: getModel ('danh mục / sản phẩm') -> loadByAttribution ('sku', $ sku); nó làm việc cho tôi :) cảm ơn !!!
jruzaha 24/2/2015

@jruzafa, lưu ý loadByAttribute()rằng bạn không nhận được tất cả dữ liệu sản phẩm liên quan. Nó sẽ thiếu những thứ như các đối tượng chứng khoán và phương tiện truyền thông.
nhạcliftsme

21

Tôi đã thử nghiệm thời gian thực hiện cho các phương pháp khác nhau mà tôi đã thấy để tải sản phẩm bằng SKU. Đây là hiệu quả nhất:

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

Các xét nghiệm:

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

Kết quả kiểm tra (tính bằng giây):

time1: 0.024642
time2: 0.079715
time3: 0.007891

điểm chuẩn này là không đủ, sự thay đổi có thể chỉ trong một lần chạy là cao. Ngoài ra, bộ đệm trong DB có thể có tác động lớn đến kết quả ở đây
Flyingmana

1

Để tải sản phẩm bằng SKU trong magento, bạn có thể sử dụng mã sau:

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

Tôi đã sử dụng điều này mọi lúc và nó hoạt động hoàn hảo. Nếu bạn muốn tải nhiều sản phẩm, hãy thử điều này

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

Nguồn tham khảo http://magentoexplorer.com/how-load-product-by-sku-or-id-in-magento


0

Như đã thảo luận, Điều này là do phương thức Mage_Catalog_Model_Product::loadBySkukhông tồn tại. Phải có một phương thức được gọi loadBySkutrong lớp Mage_Catalog_Model_Productđể bạn có thể sử dụng nó.

Bạn cũng có thể sử dụng loadByAttribute()các phương pháp để có được các chi tiết sản phẩm bằng 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;

Bạn cũng có thể xem bài viết này để biết thêm chi tiết. https://www.ipragmatech.com/ultimate-magento-developer-guide-get-product-details-USE-restapi-magento-1-x/


0

Coi chừng $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);!
Nó có thể làm việc 99% các trường hợp, nhưng điều này sẽ dẫn đến tải các thuộc tính stock_itemnhư Varien_Objectthay vì Mage_CatalogInventory_Model_Stock_Itemvân vân phương pháp như Mage_CatalogInventory_Model_Observer::checkQuoteItemQtynó sẽ gọi $stockItem instanceof Mage_CatalogInventory_Model_Stock_Itemđó sẽ ném một ngoại lệ!

Vì vậy, cách tốt nhất là:

$product = Mage::getModel('catalog/product');
$product->setStoreId($storeId)->load($product->getIdBySku($sku));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.