วิธีที่มีประสิทธิภาพในการรับ URL และรูปภาพผลิตภัณฑ์


12

ในขณะที่สร้างส่วนเพิ่มเติมจากร้านค้าบนเว็บไซต์วีโอไอพีฉันพบปัญหาสองสามอย่าง ในการพยายามสร้างรหัสที่เร็วที่สุดฉันพบว่าตัวเองไม่สามารถคิดสองสิ่งได้

รหัสของฉัน (ที่เกี่ยวข้อง) มีดังต่อไปนี้:

$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 ที่ถูกต้องเสมอไปเพราะ webshops บางแห่งใช้ URL ของ canonical หรือมีหมวดหมู่ใน URL

2) ฉันจะได้รับภาพผลิตภัณฑ์ที่มีความกว้าง / ความสูงที่กำหนดไว้แทนที่จะเป็นภาพเต็มได้อย่างไร? ->resize()ฟังก์ชั่นไม่สามารถทำงานได้ในกรณีนี้ผมลาดตระเวน (ตั้งแต่มันกลับ 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 ผลิตภัณฑ์ด้วยหรือไม่
Sander Koedood

@SanderKoedood สำหรับการปรับขนาดให้เพิ่ม $ imageModel-> setWidth (150) -> setHeight (150) -> ปรับขนาด () -> 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
อัญมณี

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 เป็นเท็จ

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

** // คุณไม่สามารถหยุดวิธีนี้ได้โดยเพิ่ม ___store ลงใน URL แม้จะตั้งค่า _store_to_url เป็น false // note โปรดดูที่ส่วน "using _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ตัวแปรเนื่องจากจะทำให้ฉันโหลดผลิตภัณฑ์อย่างครบถ้วน และในการโหลดผลิตภัณฑ์ทั้งหมดที่ฉันวนลูปจะสร้างเวลาในการโหลดวินาทีซึ่งมากเกินไป
Sander Koedood

ทำไมคุณไม่ต้องการรับข้อมูลผลิตภัณฑ์โดยไม่ต้องโหลดผลิตภัณฑ์? คุณสามารถเพิ่มฟังก์ชั่น attributeToSelect เพื่อเลือกเฉพาะคุณสมบัติที่คุณต้องการแทนที่จะโหลดแอททริบิวต์ทั้งหมด
Rojan Shrestha

1
คุณช่วยแสดงให้ฉันเห็นว่าคุณจะได้รับ URL ผลิตภัณฑ์และรูปภาพได้อย่างไร? จุดประสงค์หลักของฉันในการไม่รับคอลเล็กชันคือข้อสันนิษฐานว่าสิ่งนี้จะช้าเกินไป
Sander Koedood

ฉันมักจะโหลดผลิตภัณฑ์และไม่เคยรู้สึกช้า แต่อย่างใด ฉัน $ _products = Mage :: getModel ('แคตตาล็อก / ผลิตภัณฑ์') -> loadByAttribute ('sku', 'productsku');
Rojan Shrestha

หลังจากนั้นทำตามคำตอบของฉันด้านบน
Rojan Shrestha
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.