Skuteczny sposób na uzyskanie adresu URL produktu i obrazu

12

Budując dodatek do sklepu internetowego Magento, natknąłem się na kilka problemów. W moim dążeniu do jak najszybszego stworzenia kodu nie mogłem zrozumieć dwóch rzeczy.

Mój (odpowiedni) kod jest następujący:

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

Dwie rzeczy, których nie mogę zrozumieć to:

1) Jak mogę pobrać adres URL produktu? url_keynie zawsze podaje prawidłowy adres URL, ponieważ nie wszystkie sklepy internetowe używają kanonicznych adresów URL lub mają kategorię w adresie URL.

2) Jak mogę uzyskać obraz produktu o ustawionej szerokości / wysokości zamiast pełnego obrazu? Ta ->resize()funkcja nie działa w tym przypadku po ponownym uruchomieniu (ponieważ zwraca adres URL). Dodano do tego, czy jest możliwe, aby uzyskać Base Image, Small Imagea Thumbnailosobno?

Moim głównym celem jest jak najszybsze utrzymanie kodu. Mam tylko identyfikator produktu, ponieważ przeglądam elementy potomne produktu. Nie chcę używać, ->load()ponieważ zajmuje to znacznie więcej czasu ładowania.

Sander Koedood
źródło

Odpowiedzi:

7

Możesz to zrobić w następujący sposób:

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

Analogicznie możesz to zrobić również dla „obrazu” i „miniatury”.

mpaepper
źródło
Wydaje się, że działa to dla zwykłego obrazu, ale wybiera zły folder dla small_image. Wygląda na to, że wszystkie małe obrazy zmieniają rozmiar i nie wybiera wariantu o zmienionym rozmiarze. Masz pomysł, jak to rozwiązać? Czy masz również rozwiązanie dotyczące adresu URL produktu?
Sander Koedood
@SanderKoedood W celu zmiany rozmiaru dodaj $ imageModel-> setWidth (150) -> setHeight (150) -> resize () -> getUrl ();
mpaepper
Zamiast 150 użyj oczywiście potrzebnych wartości;)
mpaepper
Moja wiedza rozprzestrzenia się tak daleko ;-), ale dziękuję za wskazanie tego. Nie zmienia to jednak problemu ładowania strony do niewłaściwego folderu. Dlatego podczas korzystania z małego obrazu nie wyświetla się żaden obraz.
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());
mahethekiller
źródło
Jeśli uruchomię się powyżej kodu, przeglądarka zwróci pustą stronę. mój kod: justpaste.it/7hwc9
Gem
3

Wypróbuj poniższy kod, aby uzyskać adres URL obrazu:

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

LUB

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

LUB

To get product URL:
$_products->getProductUrl();
Abhinav Singh
źródło
2

Nie można tego zrobić bez zmiennej $ products / $ product zmienna:

W przypadku adresu URL produktu:

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

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

// nie można zatrzymać tej metody dodawania ___store do adresu URL, nawet ustawiając _store_to_url na false

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

** // nie możesz zatrzymać tej metody dodawania ___store do adresu URL, nawet ustawiając _store_to_url na false // note - zobacz sekcję „using _ignore_category” poniżej, aby znaleźć uzasadniony błąd przy użyciu tego parametru **

$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'

Dla produktu Zdjęcie:

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

Jeśli chcesz, aby URL obrazu był używany w tagu,

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); 
TBI Infotech
źródło
Mam już wynik $product->getUrlPath();, zdobywając url_key. Jest to możliwe bez $productzmiennej. To sprawia, że ​​uważam, że uzyskanie obrazu produktu i zmiana jego rozmiaru również powinny być możliwe bez konieczności ładowania całego produktu. (więc bez użycia Mage::getModel('catalog/product')->load($productId);)
Sander Koedood
2

Chcę dodać 1 linię kodu do komentarza mpaepper, co moim zdaniem jest świetnym rozwiązaniem w konkretnych scenariuszach. Użyłem go w pętli na stronie, na której nie miałem obiektu produktu, aby załadować obraz przez model produktu.

Jeśli nie chcesz ładować obrazu z obiektem produktu, możesz użyć podejścia mpaepper exlpains. Nie zapomnij zapisać ręcznie utworzonego obrazu podczas korzystania z tego rozwiązania. Gdy zapiszesz obiekt obrazu, utworzy on plik pamięci podręcznej, podobnie jak normalne obrazy Magento.

Zatem pełny kod powinien być:

$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());
IJsbrand van Prattenburg
źródło
1

Obraz produktu można uzyskać w następujący sposób:

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

Aby zmienić rozmiar obrazu, możesz dodać to:

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

Aby uzyskać adres URL produktu:

$_products->getProductUrl();

$ _Products to sam produkt, a nie identyfikator produktu;

Rojan Shrestha
źródło
2
Nie mam dostępu do $_productszmiennej, ponieważ wymagałoby to załadowania produktu w całości. A załadowanie wszystkich produktów, przez które przechodzę przez pętlę, spowodowałoby ładowanie sekund w sekundach, co jest zbyt duże.
Sander Koedood,
dlaczego nie chcesz uzyskać danych produktu bez ładowania produktu? Możesz dodać funkcję attributeToSelect, aby wybrać tylko wymagane atrybuty, a nie ładować wszystkie atrybuty.
Rojan Shrestha
1
Czy możesz mi pokazać, jak postąpiłbyś wtedy, gdy uzyskałbyś URL produktu i obraz? Moim głównym celem nieotrzymania kolekcji było założenie, że byłoby to zbyt wolne.
Sander Koedood,
Zwykle ładuję produkt i nigdy nie czuł się powolny. Robię $ _products = Mage :: getModel ('katalog / produkt') -> loadByAttribute ('sku', 'productsku');
Rojan Shrestha
potem postępuj zgodnie z moją odpowiedzią powyżej
Rojan Shrestha