Эффективный способ получить 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

Мои знания распространяются так далеко ;-), но спасибо за указание на это. Однако это не меняет проблему загрузки сайта не в ту папку. Поэтому при использовании маленького изображения изображение не отображается.
Сандер Коедуд

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 / $ product:

Для продукта 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 ложного // примечания - в разделе «использование _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);)
Сандер Кедуд

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, чтобы выбрать только те атрибуты, которые вам нужны, а не загружать все атрибуты.
Роян Шреста

1
Не могли бы вы показать мне, как вы будете получать URL продукта и изображение? Моей главной целью не получить коллекцию было предположение, что это будет слишком медленно.
Сандер Коедуд

Я обычно загружаю продукт, и он никогда не чувствовал себя медленным никоим образом. Я делаю $ _products = Mage :: getModel ('catalog / product') -> loadByAttribute ('sku', 'productsku');
Роян Шреста

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