¿Por qué no puedo cargar un producto por SKU usando loadBySku ()?

27

Sinopsis

Quería cargar un producto por SKU, hay muchos artículos, publicaciones de blog, resultados de desbordamiento de pila, etc. Todo lo que quiero saber es: ¿por qué tiene que ser tan difícil cargar un producto por un 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');

Por supuesto, estoy esperando demasiado de Magento en este momento una simpleforma de hacer algo (simple es un concepto con el que Magento claramente no está familiarizado)

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

Respuestas:

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

Esto se debe a que el método Mage_Catalog_Model_Product::loadBySkuno existe. Debe haber un método llamado loadBySkuen la clase Mage_Catalog_Model_Productpara que pueda usarlo, a menos que sea un método mágico.

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

Lo anterior incluye errores tipográficos. Debería ser como a continuación. Debe asignar a qué Mage::getModel()->load()regresa $productantes de hacer cosas con el objeto del producto.

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

Tenga en cuenta que con loadByAttributeno obtiene objetos relacionados como la galería de acciones y medios. Ver Mage_Catalog_Model_Abstract::loadByAttributepara más información.

musicliftsme
fuente
1
Se han corregido los errores tipográficos;) Solo estoy tratando de entender por qué las funciones básicas en Magento son tan complicadas. Si tiene que ver con cambios en la arquitectura, sería útil aprender sobre estos. La cantidad de tiempo desperdiciado tratando de completar pequeños y simples cambios funcionales es estúpido. Obtengo módulos reutilizables, pero a veces no todo puede ser reutilizable.
ceniza
¿Entiendes cómo funciona la carga del producto? Al principio sentí lo mismo, pero mejora.
musicliftsme
3
Lo entiendo, a veces encuentro que Magento está al revés en comparación con los patrones.
ceniza
$ product = Mage :: getModel ('catálogo / producto') -> loadByAttribute ('sku', $ sku); me funciona :) gracias !!!
jruzafa
@jruzafa, tenga en cuenta loadByAttribute()que no obtiene todos los datos relacionados del producto. Faltarán cosas como el stock y los objetos multimedia.
musicliftsme
21

Probé el tiempo de ejecución de los diversos métodos que he visto para cargar un producto por SKU. Este es el más eficiente:

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

Pruebas:

$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 de la prueba (en segundos):

time1: 0.024642
time2: 0.079715
time3: 0.007891
Ted
fuente
este punto de referencia es insuficiente, las posibles variaciones en una sola ejecución son demasiado altas. También el caché dentro de la base de datos podría tener un gran impacto en los resultados aquí
Flyingmana
1

Para cargar el producto por SKU en magento, puede usar el siguiente código:

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

Usé esto cada vez y funciona perfectamente. Si desea cargar varios productos, intente esto

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

Fuente de referencia http://magentoexplorer.com/how-load-product-by-sku-or-id-in-magento

Brian
fuente
0

Como ya comentamos, esto se debe a que el método Mage_Catalog_Model_Product::loadBySkuno existe. Debe haber un método llamado loadBySkuen la clase Mage_Catalog_Model_Productpara que pueda usarlo.

También puede usar loadByAttribute()métodos para obtener los detalles de los productos 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;

También puede consultar este artículo para obtener más detalles. https://www.ipragmatech.com/ultimate-magento-developer-guide-get-product-details-using-restapi-magento-1-x/

Javed Usmani
fuente
0

¡Cuidado con $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);!
Puede funcionar el 99% de los casos, pero esto dará como resultado la carga del atributo, stock_itemya que en Varien_Objectlugar de Mage_CatalogInventory_Model_Stock_Itemhacerlo Mage_CatalogInventory_Model_Observer::checkQuoteItemQty, se llamarán métodos como los $stockItem instanceof Mage_CatalogInventory_Model_Stock_Itemque arrojarían una excepción.

Entonces la mejor manera es:

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