Чому я не можу завантажити товар 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отримання додаткової інформації.


1
Друкарські помилки виправлені;) Я лише намагаюся зрозуміти, чому основні риси в Magento такі складні. Якщо це стосується змін архітектури, було б корисно дізнатися про них. Кількість витраченого часу на спроби завершити невеликі та прості функціональні зміни - це дурно - я отримую багаторазові модулі - це спосіб, але іноді не все можна використовувати багаторазово.
попіл

Ти розумієш, як працює завантаження продукту? Я почував себе так само спочатку, але стає краще.
musicliftsme

3
Я це розумію, іноді я знаходжу, що Маженто відстає порівняно з візерунками.
попіл

$ product = Mage :: getModel ('каталог / товар') -> 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

Для завантаження продукту SKU в 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));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.