Pourquoi ne puis-je pas charger un produit par SKU à l'aide de loadBySku ()?


27

Synopsis

Je voulais charger un produit par SKU, il y a de nombreux articles, articles de blog, résultats de débordement de pile, etc. Tout ce que je veux savoir, c'est - pourquoi est-il si difficile de charger un produit par 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');

Bien sûr, j'attends beaucoup trop de Magento à ce stade une simplefaçon de faire quelque chose (simple est un concept que Magento n'est clairement pas familier)

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

Réponses:


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

En effet, la méthode Mage_Catalog_Model_Product::loadBySkun'existe pas. Il doit y avoir une méthode appelée loadBySkudans la classe Mage_Catalog_Model_Productpour que vous puissiez l'utiliser, sauf s'il s'agit d'une méthode magique.

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

Ce qui précède comprend les fautes de frappe. Cela devrait être comme ci-dessous. Vous devez attribuer ce qui Mage::getModel()->load()revient $productavant de faire des choses avec l'objet produit.

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

Notez qu'avec loadByAttribute, vous n'obtenez pas d'objets liés comme le stock et la galerie multimédia. Voir Mage_Catalog_Model_Abstract::loadByAttributepour plus d'informations.


1
Les fautes de frappe ont été corrigées;) J'essaie seulement de comprendre pourquoi les fonctionnalités de base de Magento sont si compliquées. S'il s'agit de changements d'architecture, il serait utile d'en savoir plus. Le temps perdu à essayer de réaliser de petits et simples changements fonctionnels est stupide - je reçois des modules réutilisables, mais parfois tout ne peut pas être réutilisable.
— ash

Mais comprenez-vous comment fonctionne le chargement du produit? J'ai ressenti la même chose au début, mais ça va mieux.
— musicliftsme

3
Je le comprends, je trouve parfois que Magento est à l'envers par rapport aux modèles.
— ash

$ product = Mage :: getModel ('catalogue / produit') -> loadByAttribute ('sku', $ sku); ça marche pour moi :) merci !!!
— jruzafa

@jruzafa, notez loadByAttribute()que vous n'obtenez pas toutes les données relatives aux produits. Il manquera des choses comme le stock et les objets multimédias.
— musicliftsme

21

J'ai testé le temps d'exécution pour les différentes méthodes que j'ai vues pour charger un produit par SKU. C'est le plus efficace:

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

Tests:

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

Résultats des tests (en secondes):

time1: 0.024642
time2: 0.079715
time3: 0.007891

ce repère est insuffisant, les variations possibles en un seul passage sont trop élevées. De plus, le cache à l'intérieur de la base de données pourrait avoir un grand impact sur les résultats ici
— Flyingmana

1

Pour charger un produit par SKU dans magento, vous pouvez utiliser le code suivant:

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

Je l'ai utilisé à chaque fois et cela fonctionne parfaitement. Si vous souhaitez charger plusieurs produits, essayez ceci

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

Source de référence http://magentoexplorer.com/how-load-product-by-sku-or-id-in-magento


0

Comme déjà discuté, c'est parce que la méthode Mage_Catalog_Model_Product::loadBySkun'existe pas. Il doit y avoir une méthode appelée loadBySkudans la classe Mage_Catalog_Model_Productpour que vous puissiez l'utiliser.

Vous pouvez également utiliser des loadByAttribute()méthodes pour obtenir les détails des produits par 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;

Vous pouvez également consulter cet article pour plus de détails. https://www.ipragmatech.com/ultimate-magento-developer-guide-get-product-details-using-restapi-magento-1-x/


0

Attention $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);!
Cela peut fonctionner dans 99% des cas, mais cela se traduira par le chargement de l'attribut stock_itemcomme Varien_Objectau lieu des Mage_CatalogInventory_Model_Stock_Itemméthodes comme Mage_CatalogInventory_Model_Observer::checkQuoteItemQtyil appellera, $stockItem instanceof Mage_CatalogInventory_Model_Stock_Itemce qui lèverait une exception!

La meilleure façon est donc:

$product = Mage::getModel('catalog/product');
$product->setStoreId($storeId)->load($product->getIdBySku($sku));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.