Почему я не могу загрузить товар по SKU с помощью loadBySku ()?

27

конспект

Я хотел загрузить товар по SKU, есть много статей, сообщений в блоге, результаты переполнения стека и т. Д. Все, что я хочу знать, - почему так сложно загружать товар по 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');

Конечно, на данный момент я слишком многого ожидаю от Magento, simpleкак сделать что-то (простая концепция, с которой Magento явно не знакома)

// This works:
$product = Mage::getModel('catalog/product');
$product->load($product->getIdBySku($sku));
ясень
источник

Ответы:

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

Это потому, что метод Mage_Catalog_Model_Product::loadBySkuне существует. В loadBySkuэтом классе должен быть вызван метод, Mage_Catalog_Model_Productчтобы вы могли его использовать, если только это не какой-то магический метод.

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

Выше приведены опечатки. Это должно быть как ниже. Вам нужно назначить то, что Mage::getModel()->load()возвращается, $productпрежде чем делать вещи с объектом продукта.

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

Обратите внимание, что с loadByAttribute, вы не получите связанные объекты, такие как фондовая и медиа галерея. Смотрите Mage_Catalog_Model_Abstract::loadByAttributeдля получения дополнительной информации.

musicliftsme
источник
1
Опечатки были исправлены;) Я только пытаюсь понять, почему основные функции в Magento так сложны. Если это связано с изменениями архитектуры, было бы полезно узнать об этом. Тратить время на попытки выполнить небольшие и простые функциональные изменения глупо - я получаю многократно используемые модули, но иногда не все можно использовать повторно.
ясень
Вы понимаете, как работает загрузка товара? Сначала я чувствовал то же самое, но становится лучше.
musicliftsme
3
Я понимаю, я иногда нахожу, что Magento отстал по сравнению с моделями.
пепел
$ product = Mage :: getModel ('catalog / product') -> loadByAttribute ('sku', $ sku); это работает для меня :) спасибо !!!
jruzafa
@jruzafa, обратите внимание, loadByAttribute()что вы не получаете все данные о продукте. В нем будут отсутствовать такие вещи, как акции и медиа-объекты.
musicliftsme
21

Я проверил время выполнения для различных методов загрузки продукта по SKU. Это самое эффективное:

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

Испытания:

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

Результаты теста (в секундах):

time1: 0.024642
time2: 0.079715
time3: 0.007891
Тед
источник
этот критерий недостаточен, возможны вариации всего за один прогон. Также кеш внутри БД может оказать большое влияние на результаты здесь
Flyingmana
1

Для загрузки товара по артикулу в magento вы можете использовать следующий код:

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

Я использовал это каждый раз, и он отлично работает. Если вы хотите загрузить несколько продуктов, попробуйте это

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

Справочный источник http://magentoexplorer.com/how-load-product-by-sku-or-id-in-magento

Брайан
источник
0

Как уже обсуждали, это потому, что метод Mage_Catalog_Model_Product::loadBySkuне существует. В loadBySkuэтом классе должен быть вызван метод, Mage_Catalog_Model_Productчтобы вы могли его использовать.

Вы также можете использовать loadByAttribute()методы, чтобы получить подробную информацию о продукции по 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;

Вы также можете посмотреть эту статью для получения более подробной информации. https://www.ipragmatech.com/ultimate-magento-developer-guide-get-product-details-using-restapi-magento-1-x/

Джавед Усмани
источник
0

Остерегайтесь $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);!
Это может работать в 99% случаев, но это приведет к загрузке атрибута, stock_itemа Varien_Objectне к Mage_CatalogInventory_Model_Stock_Itemтаким методам, как Mage_CatalogInventory_Model_Observer::checkQuoteItemQtyон, $stockItem instanceof Mage_CatalogInventory_Model_Stock_Itemкоторый вызовет исключение!

Так что лучший способ это:

$product = Mage::getModel('catalog/product');
$product->setStoreId($storeId)->load($product->getIdBySku($sku));
Shadowbob
источник