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


12

Створюючи додаток до веб-магазину Magento, я натрапив на кілька проблем. Прагнучи створити якомога швидший код, я виявив, що не в змозі з'ясувати дві речі.

Мій (відповідний) код такий:

$rc = Mage::getResourceSingleton('catalog/product');
$productName = $rc->getAttributeRawValue($productId, 'name', Mage::app()->getStore());
$productPrice = $rc->getAttributeRawValue($productId, 'price', Mage::app()->getStore());
$productImage = $rc->getAttributeRawValue($productId, 'image', Mage::app()->getStore());
$productUrl = $rc->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());

Я не можу зрозуміти дві речі:

1) Як отримати URL-адресу продукту? url_keyне завжди дає правильну URL-адресу, оскільки не всі веб-магазини використовують канонічні URL-адреси або мають категорію в URL-адресі.

2) Як я можу отримати зображення продукту із заданою шириною / висотою замість повного зображення? ->resize()Функція не працює в цьому випадку я Recon (оскільки вона повертає URL). Додатково до цього, можна отримати Base Image, Small Imageі по Thumbnailокремо?

Моя головна мета - тримати код якомога швидше. У мене є лише ідентифікатор продукту, оскільки я перебираю його через добутки продукту. Я не хочу використовувати, ->load()оскільки це потребує більшого часу завантаження.

Відповіді:


7

Ви можете зробити це так:

$smallImage = $rc->getAttributeRawValue($productId, 'small_image', Mage::app()->getStore());
$imageModel = Mage::getModel('catalog/product_image');
$imageModel->setDestinationSubdir('small_image');
$imageModel->setBaseFile($smallImage);
var_dump($imageModel->getUrl());

Аналогічно, ви також можете це зробити для "зображення" та "мініатюри".


Здається, це працює для звичайного зображення, але він вибирає неправильну папку для small_image. Здається, що на невеликих зображеннях розмір змінюється, і він не вибирає змінений варіант. Будь-яка ідея, як це вирішити? А у вас також є рішення щодо URL-адреси продукту?
Сандер Коедуд

@SanderKoedood Для зміни розміру додайте $ imageModel-> setWidth (150) -> setHeight (150) -> resize () -> getUrl ();
mpaepper

Замість 150 використовуйте потрібні вам значення, звичайно;)
mpaepper

Мої знання все-таки поширюються ;-), але дякую, що вказали на це. Однак це не змінює проблему завантаження сайту неправильною папкою. Тому жодне зображення не відображається при використанні малого зображення.
Sander Koedood

5
$productId = 'SOME_PRODUCT_ID';
$product = Mage::getModel('catalog/product')->load($productId);
$productMediaConfig = Mage::getModel('catalog/product_media_config');

$baseImageUrl = $productMediaConfig->getMediaUrl($product->getImage());
$smallImageUrl = $productMediaConfig->getMediaUrl($product->getSmallImage());
$thumbnailUrl = $productMediaConfig->getMediaUrl($product->getThumbnail());

Якщо я запускаю вище коду, браузер повертає порожню сторінку. мій код: justpaste.it/7hwc9
Gem

3

Спробуйте нижче вказаний код, щоб отримати URL-адресу зображення:

<?php echo Mage::helper('catalog/image')->init($product, 'thumbnail'); ?>
<?php echo Mage::helper('catalog/image')->init($_product, 'small_image') ?>

АБО

$productId = 1; // get product ID dynamically instead of 1.
$products = Mage::getModel('catalog/product')->load($productId);
$productUrl = $products->getProductUrl();
$baseImage = $products->getImage(); 
$SmallImage = $products->getSmallImage(); 
$thumbnail = $products->getThumbnail(); 

АБО

To get product URL:
$_products->getProductUrl();

2

Ви не можете обійтися без $ products / $ змінної товару:

Для продукту URL:

$product->getUrlPath();
'mondrian-large-coffee-table-set-multicolour'

$product->getUrlPath($category);
'tables/mondrian-large-coffee-table-set-multicolour'

// ви не можете зупинити цей метод, додаючи ___store до URL, навіть встановивши _store_to_url на false

$product->getUrlInStore();
'http://made.local/tables/mondrian-large-coffee-table-set-multicolour?___store=default'

** // Ви не можете зупинити цей метод, додаючи ___store до URL-адреси, навіть встановивши _store_to_url на false // note - див. розділ "Використання _ignore_category" нижче для аргументованої помилки з використанням цього парамуму **

$product->getUrlInStore(array('_ignore_category' => true));
'http://made.local/mondrian-large-coffee-table-set-multicolour?___store=default'

$product->getProductUrl();
'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'

$product->getProductUrl(true);
'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'

Для зображення продукту:

$productId = 1; 
$products = Mage::getModel('catalog/product')->load($productId);
$products->getImage(); $products->getSmallImage(); 
$products->getThumbnail(); 

Якщо ви хочете використовувати URL-адресу зображення в тезі,

Mage::helper('catalog/image')->init($products, 'small_image')->resize(163,100); // resize function is used to resize image 
Mage::helper('catalog/image')->init($products, 'image')->resize(400,400); 
Mage::helper('catalog/image')->init($products, 'thumbnail')->resize(60,60); 

Я отримав результат $product->getUrlPath();вже, отримавши url_key. Так що це можливо без $productзмінної. Це змушує мене вважати, що отримати зображення продукту та змінити його розмір також слід, не завантажуючи весь продукт. (тож ніякої користі Mage::getModel('catalog/product')->load($productId);)
Sander Koedood

2

Я хочу додати 1 рядок коду до коментаря mpaepper, який, на мою думку, є відмінним рішенням у конкретних сценаріях. Я використовував його в циклі на сторінці, де у мене не було об'єкта продукту для завантаження зображення через модель продукту.

Якщо ви не хочете завантажувати зображення з продуктом, ви можете використовувати mpaepper exlpains. Не забудьте зберегти створене вручну зображення під час використання цього рішення. Коли ви збережете об'єкт зображення, він створить файл кешу, як і звичайні зображення Magento.

Отже, повний код повинен бути:

$rc = Mage::getResourceModel('catalog/product'); //empty product model which you only have to load it once. (for the people who want to use this in a loop, put this Resource Model outside the loop.

$smallImage = $rc->getAttributeRawValue($productId, 'small_image', Mage::app()->getStore());
$imageModel = Mage::getModel('catalog/product_image');
$imageModel->setDestinationSubdir('small_image');
$imageModel->setBaseFile($smallImage);
$imageModel->saveFile(); //important line to create an cache file of the image
var_dump($imageModel->getUrl());

1

Доступ до образу товару можна отримати таким чином:

$this->helper('catalog/image')->init($_products, 'small_image');

Щоб змінити розмір зображення, ви можете додати це:

$this->helper('catalog/image')->init($_products, 'small_image')->resize(150,150);

Щоб отримати URL-адресу продукту:

$_products->getProductUrl();

Тут $ _products - це сам продукт, а не ідентифікатор продукту;


2
Я не маю доступу до $_productsзмінної, оскільки це вимагає від мене завантаження продукту повністю. А для завантаження всіх продуктів, які я перебираю через цикл, створювалося б час завантаження секунд, що занадто багато.
Сандер Коедуд

чому б ви не хотіли отримувати дані про товар, не завантажуючи продукт? Ви можете додати функцію attributeToSelect, щоб вибрати лише потрібні вам атрибути, а не завантажувати всі атрибути.
Rojan Shrestha

1
Не могли б ви показати мені, як тоді ви отримаєте URL-адресу та зображення продукту? Моєю основною метою не отримати колекцію було припущення, що це буде занадто повільно.
Сандер Коедуд

Зазвичай я завантажую товар, і він ніколи не відчував себе повільним. Я роблю $ _products = Mage :: getModel ('каталог / продукт') -> loadByAttribute ('sku', 'productsku');
Rojan Shrestha

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