Effiziente Methode zum Abrufen von Produkt-URL und Bild

12

Beim Erstellen einer Erweiterung für einen Magento-Webshop bin ich auf einige Probleme gestoßen. In meinem Bestreben, Code so schnell wie möglich zu erstellen, war ich nicht in der Lage, zwei Dinge herauszufinden.

Mein (relevanter) Code ist der folgende:

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

Die zwei Dinge, die ich nicht herausfinden kann, sind:

1) Wie rufe ich die Produkt-URL ab? url_keygibt nicht immer die richtige URL an, da nicht alle Webshops kanonische URLs verwenden oder die Kategorie in der URL haben.

2) Wie kann ich das Produktbild mit einer festgelegten Breite / Höhe anstelle des Vollbilds erhalten? Die ->resize()Funktion funktioniert in diesem Fall nicht, da sie eine URL zurückgibt. Hinzu kommt , dass ist es möglich , das zu bekommen Base Image, Small Imageund Thumbnailgetrennt?

Mein Hauptziel ist es, den Code so schnell wie möglich zu halten. Ich habe nur eine Produkt-ID, da ich die Kinder eines Produkts durchschleife. Ich möchte nicht verwenden, ->load()da dies viel mehr Ladezeit in Anspruch nimmt.

Sander Koedood
quelle

Antworten:

7

Du kannst es so machen:

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

Analog können Sie dies auch für "Bild" und "Miniaturansicht" tun.

mpaepper
quelle
Dies scheint für das normale Bild zu funktionieren, wählt jedoch einen falschen Ordner für das small_image. Es scheint, dass die Größe der kleinen Bilder geändert wird, und es wird nicht die Größe der Variante ausgewählt. Irgendeine Idee, wie man das löst? Und haben Sie auch eine Lösung für die Produkt-URL?
Sander Koedood
@SanderKoedood Fügen Sie für die Größenänderung $ imageModel-> setWidth (150) -> setHeight (150) -> resize () -> getUrl () hinzu.
Mpaepper
Verwenden Sie statt 150 natürlich die
gewünschten
Mein Wissen hat sich so weit verbreitet ;-) aber danke, dass du darauf hingewiesen hast. Dies ändert jedoch nichts an dem Problem, dass die Site den falschen Ordner lädt. Es wird also kein Bild angezeigt, wenn das kleine Bild verwendet wird.
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
quelle
Wenn ich über Code laufe, gibt der Browser eine leere Seite zurück. Mein Code: justpaste.it/7hwc9
Gem
3

Versuchen Sie den folgenden Code, um die Bild-URL zu erhalten:

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

ODER

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

ODER

To get product URL:
$_products->getProductUrl();
Abhinav Singh
quelle
2

Auf $ products / $ product variable kann man nicht verzichten:

Für Produkt-URL:

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

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

// Sie können diese Methode nicht stoppen, indem Sie der URL ___store hinzufügen, auch wenn _store_to_url auf false gesetzt ist

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

** // Sie können diese Methode nicht stoppen, indem Sie der URL ___store hinzufügen, auch wenn _store_to_url auf false gesetzt wird // Hinweis: Im Abschnitt "using _ignore_category" finden Sie einen möglichen Fehler bei der Verwendung dieses Parameters. **

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

Für produkt Bild:

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

Wenn Sie möchten, dass die Bild-URL im Tag verwendet wird,

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
quelle
Ich habe das Ergebnis $product->getUrlPath();schon, indem ich das bekomme url_key. Das ist also ohne die $productVariable möglich. Das lässt mich glauben, dass es auch möglich sein sollte, das Produktbild abzurufen und seine Größe zu ändern, ohne das gesamte Produkt zu laden. (also keine Verwendung von Mage::getModel('catalog/product')->load($productId);)
Sander Koedood
2

Ich möchte dem Kommentar von mpaepper eine Codezeile hinzufügen, was meiner Meinung nach eine großartige Lösung in bestimmten Szenarien ist. Ich habe es in einer Schleife auf einer Seite verwendet, auf der ich kein Produktobjekt zum Laden des Bildes durch das Produktmodell hatte.

Wenn Sie kein Bild mit einem Produktobjekt laden möchten, können Sie den Ansatz mpaepper exlpains verwenden. Vergessen Sie nicht, das manuell erstellte Bild zu speichern, wenn Sie diese Lösung verwenden. Wenn Sie das Bildobjekt speichern, wird eine Cache-Datei erstellt, wie dies auch bei normalen Magento-Bildern der Fall ist.

Der vollständige Code sollte also sein:

$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
quelle
1

Auf das Image des Produkts kann auf folgende Weise zugegriffen werden:

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

Um die Größe des Bildes zu ändern, können Sie dies hinzufügen:

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

So rufen Sie die Produkt-URL ab:

$_products->getProductUrl();

Hier ist $ _products das Produkt selbst und nicht die Produkt-ID.

Rojan Shrestha
quelle
2
Ich habe keinen Zugriff auf die $_productsVariable, da ich das Produkt dann vollständig laden müsste. Und das Laden aller Produkte, die ich durchlaufe, würde Ladezeiten von Sekunden verursachen, was zu viel ist.
Sander Koedood
Warum möchten Sie die Produktdaten nicht erhalten, ohne das Produkt zu laden? Sie können die Funktion attributeToSelect hinzufügen, um nur die gewünschten Attribute auszuwählen, anstatt alle Attribute zu laden.
Rojan Shrestha
1
Können Sie mir zeigen, wie Sie die URL und das Image des Produkts erhalten würden? Mein Hauptzweck, keine Sammlung zu bekommen, war die Annahme, dass dies zu langsam sein würde.
Sander Koedood
Normalerweise lade ich das Produkt und es hat sich in keiner Weise langsam angefühlt. Ich mache $ _products = Mage :: getModel ('catalog / product') -> loadByAttribute ('sku', 'productsku');
Rojan Shrestha
danach folge meiner Antwort oben
Rojan Shrestha