Cara yang efisien untuk mendapatkan URL dan gambar produk

12

Saat membangun tambahan ke toko web Magento, saya menemukan beberapa masalah. Dalam pencarian saya untuk membuat kode yang secepat mungkin, saya mendapati diri saya tidak dapat menemukan dua hal.

Kode saya (relevan) adalah sebagai berikut:

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

Dua hal yang saya tidak tahu adalah:

1) Bagaimana cara mengambil URL produk? url_keytidak selalu memberikan URL yang benar, karena tidak semua toko web menggunakan URL kanonik, atau memiliki kategori dalam URL.

2) Bagaimana saya bisa mendapatkan gambar produk dengan lebar / tinggi yang ditetapkan, bukan gambar penuh? The ->resize()Fungsi tidak berfungsi dalam hal ini saya pengintaian (karena mengembalikan sebuah URL). Ditambah dengan itu, apakah mungkin untuk mendapatkan Base Image, Small Imagedan Thumbnailsecara terpisah?

Tujuan utama saya adalah menjaga kode secepat mungkin. Saya hanya memiliki id produk, karena saya mengulangi anak-anak suatu produk. Saya tidak ingin menggunakan ->load()karena itu membutuhkan lebih banyak waktu pemuatan.

Sander Koedood
sumber

Jawaban:

7

Anda bisa melakukannya seperti ini:

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

Secara analog, Anda juga dapat melakukannya untuk "gambar" dan "gambar kecil".

mpaepper
sumber
Tampaknya ini berfungsi untuk gambar biasa, tetapi memilih folder yang salah untuk small_image. Tampaknya semua gambar kecil diubah ukurannya, dan tidak memilih varian yang diubah ukurannya. Adakah cara mengatasinya? Dan apakah Anda juga punya solusi untuk URL produk?
Sander Koedood
@SanderKoedood Untuk mengubah ukuran, tambahkan $ imageModel-> setWidth (150) -> setHeight (150) -> resize () -> getUrl ();
mpaepper
Alih-alih 150, gunakan nilai yang Anda butuhkan, tentu saja;)
mpaepper
Pengetahuan saya memang menyebar sejauh itu ;-) tapi terima kasih telah menunjukkannya. Namun, itu tidak mengubah masalah situs memuat folder yang salah. Jadi tidak ada gambar yang ditampilkan saat menggunakan gambar kecil.
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
sumber
Jika saya menjalankan kode di atas browser kembali halaman kosong. kode saya: justpaste.it/7hwc9
Permata
3

Coba di bawah ini kode yang disebutkan untuk mendapatkan URL gambar:

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

ATAU

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

ATAU

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

Anda tidak dapat melakukannya tanpa $ produk / $ variabel produk:

Untuk Url produk:

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

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

// Anda tidak dapat menghentikan metode ini dengan menambahkan ___store ke URL, bahkan dengan mengatur _store_to_url ke false

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

** // Anda tidak dapat menghentikan metode ini dengan menambahkan ___store ke URL, bahkan dengan mengatur _store_to_url ke false // note - lihat bagian "using _ignore_category" di bawah ini untuk bug yang bisa diperdebatkan dengan menggunakan param ini **

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

Untuk Gambar produk:

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

Jika Anda ingin URL gambar digunakan dalam tag,

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
sumber
Saya sudah mendapatkan hasilnya $product->getUrlPath();, dengan mendapatkan url_key. Jadi itu mungkin tanpa $productvariabel. Itu membuat saya percaya bahwa mendapatkan gambar produk, dan mengubah ukurannya, harus dimungkinkan juga, tanpa memuat seluruh produk. (jadi tidak ada gunanya Mage::getModel('catalog/product')->load($productId);)
Sander Koedood
2

Saya ingin menambahkan 1 baris kode ke komentar mpaepper, yang menurut saya merupakan solusi hebat dalam skenario tertentu. Saya menggunakannya dalam satu lingkaran pada halaman di mana saya tidak memiliki objek produk untuk memuat gambar melalui model produk.

Ketika Anda tidak ingin memuat gambar dengan objek produk, Anda bisa menggunakan pendekatan mpaepper exlpains. Jangan lupa untuk menyimpan gambar yang dibuat secara manual saat Anda menggunakan solusi ini. Ketika Anda menyimpan objek gambar itu akan membuat file cache seperti gambar Magento normal juga.

Jadi kode lengkapnya harus:

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

Gambar produk dapat diakses dengan cara berikut:

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

Untuk mengubah ukuran gambar, Anda dapat menambahkan ini:

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

Untuk mendapatkan url produk:

$_products->getProductUrl();

Di sini $ _products adalah produk itu sendiri dan bukan id produk;

Rojan Shrestha
sumber
2
Saya tidak memiliki akses ke $_productsvariabel, karena itu akan mengharuskan saya untuk memuat produk secara keseluruhan. Dan untuk memuat semua produk yang saya lewati akan menciptakan waktu muat detik, yang terlalu banyak.
Sander Koedood
mengapa Anda tidak ingin mendapatkan data produk tanpa memuat produk? Anda dapat menambahkan fungsi attributeToSelect untuk memilih hanya atribut yang Anda butuhkan daripada memuat semua atribut.
Rojan Shrestha
1
Bisakah Anda tunjukkan kepada saya bagaimana Anda akan mendapatkan url dan gambar produk? Tujuan utama saya untuk tidak mendapatkan koleksi adalah asumsi bahwa ini akan terlalu lambat.
Sander Koedood
Saya biasanya memuat produk dan tidak pernah terasa lambat dengan cara apa pun. Saya melakukan $ _products = Mage :: getModel ('catalog / product') -> loadByAttribute ('sku', 'productsku');
Rojan Shrestha
setelah itu ikuti jawaban saya di atas
Rojan Shrestha