Ефективне отримання URL-адреси продукту від ідентифікатора


27

Який найефективніший спосіб отримати URL-адресу продукту, надаючи лише його ідентифікатор? У кількох місцях у нашому коді є такі речі, як, наприклад Mage::getModel('catalog/product')->load($id)->getProductUrl(), щоб отримати URL-адресу товару, враховуючи кількість подій тощо, пов’язаних із продуктом, це здається досить марним, чи є простіший метод? Можливо також вказати ідентифікатор категорії.

Крім того, чи існує ефективний метод зробити те ж саме для одного атрибуту для продукту, як назва?


1
ваше питання тут вирішили? Вам потрібна була додаткова допомога з цього питання? Якщо так, дайте нам знати, що потрібно зробити, щоб допомогти вам знайти рішення.
philwinkle

Відповіді:


47

Цікаво знати, чи можемо ми отримати URL-адресу товару, не завантажуючи весь продукт. Вибачте, що відповідаю на ваше додаткове запитання, а не на головне питання, оскільки я також не впевнений, чи зможемо ми його отримати :)

Для отримання одного атрибуту без завантаження цілого продукту ви можете використовувати, getAttributeRawValue()якщо ви використовуєте Magento CE версії 1.6+

Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);

Відповідно до коментаря @ philwinkle нижче, тут є більш оптимізований код:

Mage::getResourceSingleton('catalog/product')
  ->getAttributeRawValue($productId, 'attribute_code', Mage::app()->getStore());

ОНОВЛЕННЯ: Отримайте URL-адресу продукту за ідентифікатором, не завантажуючи весь продукт:

Mage::getResourceSingleton('catalog/product')
  ->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());

8
Вовків. Не знав про це! Усі підтримують цю відповідь. Якщо ви дійсно хочете збільшити кількість попередніх даних, ви можете повторно використовувати існуючу модель ресурсу каталогу / продукту (замість того, щоб створювати нову модель), зателефонувавши getResourceSingletonнатомість. $ storeId не повинен бути ідентифікатором, він також може бути Mage_Core_Model_Storeоб’єктом, тому ви можете використовувати Mage::app()->getStore()вбудований текст для прискорення речей.
philwinkle

І ви можете використовувати його для отримання кількох атрибутів: @param int | string | array $ attribute atrribute ID-коди чи коди (в 1.7)
Річард

Мені подобається такий підхід, дуже акуратний. Я проголосував. Я прийму, якщо ніхто не придумає відповіді на URL-адресу.
Пітер О'Каллаган

Чи все-таки це можна використовувати без ідентифікатора продукту? Якщо у мене є лише SKU, чи змушений я завантажувати модель?
pspahn

1
Зверніть увагу , що в разі , якщо є більше , ніж продукт з тим же url_keyце може не спрацювати , тому що Magento збирається створити іншу переписування URL - адреса з url_key
Від

11

Я думаю, було б вигідно це зробити через колекцію. Якщо вам не потрібна повна інформація про продукт, ви можете завантажити її через колекцію і таким чином завантажувати лише потрібну інформацію. Код був би таким.

$product_collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToFilter('entity_id', 16)
    ->addUrlRewrite();
$product_collection_url = $product_collection->getFirstItem()->getProductUrl();

Примітка: addUrlRewriteщоб ви могли отримати URL-адресу продукту пізніше, він також може взяти ідентифікатор категорії як параметр, без цього URL не містив би категорію.

Ви все ще називаєте те, getProductUrl()що в кінцевому підсумку використовується Mage_Catalog_Model_Product_Url, але для цього потрібні лише ідентифікатор, request_path та ключ URL, щоб він міг працювати без повного продукту.


Це добре працює!
Mukesh Chapagain

Здавалося б, $ Product-> getProductUrl () має бути всім, що вам потрібно. Додаток "addUrlRewrite ()" має значення - дякую за надання цього прикладу.
jschrab

4

Я думаю, що найефективніший спосіб отримати переписану URL-адресу продуктів (без завантаження продукту) - це дивитись безпосередньо на переписувати таблу URL-адреси.

# returns string "product-url.html"
$productUrl = Mage::getResourceModel('core/url_rewrite')
    ->getRequestPathByIdPath('product/' . $productId, $storeId);

Щоб отримати повний шлях до категорії, використовуйте

# returns string "full/category/path/product-url.html"
$productUrl = Mage::getResourceModel('core/url_rewrite')
    ->getRequestPathByIdPath('product/' . $productId . '/' . $categoryId, $storeId);

Правка: перевірена на "url_key", для інших атрибутів getAttributeRawValueмає відповідати.

  1. getRequestPathByIdPath

    • Всього в т.ч. Час стіни (мікросек.): 8,323 мікросекунди
    • Всього в т.ч. ЦП (мікросекунди): 8,038 мікросекунди
    • Всього в т.ч. MemUse (байти): 273 872 байт
    • Всього в т.ч. PeakMemUse (байти): 213 488 байт
    • Кількість викликів функцій: 372
  2. getAttributeRawValue

    • Всього в т.ч. Час стіни (мікросек.): 51 213 мікросекунд
    • Всього в т.ч. Процесор (мікросекунди): 50 390 мікросекунд
    • Всього в т.ч. MemUse (байти): 1,223,520 байт
    • Всього в т.ч. PeakMemUse (байти): 1,168,496 байт
    • Кількість функціональних дзвінків: 2,233
  3. load(productId)

    • Всього в т.ч. Час стіни (мікросекція): 605,649 мікросекунди
    • Всього в т.ч. ЦП (мікросекунди): 598 820 мікросекунд
    • Всього в т.ч. MemUse (байти): 5,370,848 байт
    • Всього в т.ч. PeakMemUse (байти): 5,314,384 байт
    • Кількість функціональних дзвінків: 27,774

3

Я знайшов це питання, цікаво те саме. І лише на випадок, коли комусь це буде потрібно колись, я опублікую свої власні висновки тут.

Я знайшов два способи отримання URL-адреси продукту без завантаження повного продукту. Оскільки я працював на повільному сервері, мені потрібно було знайти найшвидший метод завантаження.

Перший спосіб:

Перше отримання - це колекція продукту на основі ідентифікатора продукту:

$_item = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('product_url')
    ->addAttributeToFilter('entity_id', $productId)
    ->addUrlRewrite()
    ->load();

foreach($_item as $product){
    echo $product->getProductUrl();
}

// returns string "http://www.your-domain.com/[category]/[product_url]"

Другий спосіб:

Другим методом, що використовує метод Калпеша Мети, буде такий код:

Mage::getResourceSingleton('catalog/product')
      ->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());

// returns string "product-url-like-this"

Для цього методу можна використовувати 'url_key'або 'url_path'. Я не дізнався різниці, хоча.

Різниця між методами:

Перший метод займає трохи більше часу (приблизно 15% часу більше). Однак другий метод повертає лише остаточну частину URL-адреси. Це означає, що якщо магазин використовує категорію в URL-адресі, він не працюватиме, оскільки ця частина не відображається. Так було в магазині, в якому я працював.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.