Por que não consigo carregar um produto por SKU usando loadBySku ()?

27

Sinopse

Eu queria carregar um produto por SKU, existem muitos artigos, postagens no blog, resultados de estouro de pilha, etc. Tudo o que quero saber é: por que tem que ser tão difícil carregar um produto por um 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');

Obviamente, estou esperando demais do Magento neste momento uma simplemaneira de fazer algo (simples é um conceito que o Magento claramente não está familiarizado)

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

Respostas:

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

Isso ocorre porque o método Mage_Catalog_Model_Product::loadBySkunão existe. Deve haver um método chamado loadBySkuna classe Mage_Catalog_Model_Productpara que você possa usá-lo, a menos que seja algum método mágico.

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

O texto acima inclui erros de digitação. Deve ser como abaixo. Você precisa atribuir o que Mage::getModel()->load()retorna $productantes de fazer as coisas com o objeto do produto.

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

Observe que loadByAttribute, com , você não obtém objetos relacionados, como o estoque e a galeria de mídia. Veja Mage_Catalog_Model_Abstract::loadByAttributepara mais informações.

musicliftsme
fonte
11
Os erros de digitação foram corrigidos;) Estou apenas tentando entender por que os recursos básicos do Magento são tão complicados. Se estiver relacionado às mudanças na arquitetura, seria útil aprender sobre elas. A quantidade de tempo desperdiçada tentando concluir Pequenas e simples mudanças funcionais é estúpida - eu recebo módulos reutilizáveis, mas às vezes nem tudo pode ser reutilizável.
cinzas
Você entende como o carregamento do produto funciona? Eu me senti da mesma maneira no começo, mas fica melhor.
Muscliftsme
3
Eu entendo, às vezes acho que o Magento está ao contrário em comparação com os padrões.
cinzas
$ product = Mage :: getModel ('catalog / product') -> loadByAttribute ('sku', $ sku); funciona para mim :) obrigado !!!
Jruzafa
@jruzafa, observe loadByAttribute()que você não obtém todos os dados de produtos relacionados. Faltam coisas como os objetos de estoque e mídia.
Musicliftsme
21

Testei o tempo de execução para os vários métodos que vi para carregar um produto por SKU. Este é o mais eficiente:

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

Testes:

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

Resultados do teste (em segundos):

time1: 0.024642
time2: 0.079715
time3: 0.007891
Ted
fonte
Como esse parâmetro é insuficiente, as variações possíveis em apenas uma única execução são altas. Também o cache dentro do DB poderia ter um grande impacto sobre os resultados aqui
Flyingmana
1

Para carregar o produto por SKU no magento, você pode usar o seguinte código:

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

Eu usei isso toda vez e funciona perfeitamente. Se você deseja carregar vários produtos, tente este

$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 de referência http://magentoexplorer.com/how-load-product-by-sku-or-id-in-magento

Brian
fonte
0

Como já discutimos, isso ocorre porque o método Mage_Catalog_Model_Product::loadBySkunão existe. Deve haver um método chamado loadBySkuna classe Mage_Catalog_Model_Productpara que você possa usá-lo.

Você também pode usar loadByAttribute()métodos para obter os detalhes dos produtos por 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;

Você também pode dar uma olhada neste artigo para obter mais detalhes. https://www.ipragmatech.com/ultimate-magento-developer-guide-get-product-details-using-restapi-magento-1-x/

Javed Usmani
fonte
0

Cuidado com $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);!
Pode funcionar 99% dos casos, mas isso resultará no carregamento do atributo, stock_itempois, em Varien_Objectvez disso Mage_CatalogInventory_Model_Stock_Item, em métodos como Mage_CatalogInventory_Model_Observer::checkQuoteItemQtyo chamado, o $stockItem instanceof Mage_CatalogInventory_Model_Stock_Itemque geraria uma exceção!

Portanto, a melhor maneira é:

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