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.