Cách hiệu quả để lấy URL và hình ảnh sản phẩm


12

Trong khi xây dựng một bổ sung cho một cửa hàng web Magento, tôi đã vấp phải một vài vấn đề. Trong quá trình theo đuổi để tạo ra mã nhanh nhất có thể, tôi thấy mình không thể tìm ra hai điều.

Mã (có liên quan) của tôi là như sau:

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

Hai điều tôi không thể tìm ra là:

1) Làm cách nào để truy xuất URL sản phẩm? url_keykhông phải lúc nào cũng cung cấp đúng URL, vì không phải tất cả các hội thảo đều sử dụng URL chính tắc hoặc có danh mục trong URL.

2) Làm cách nào tôi có thể có được hình ảnh sản phẩm với chiều rộng / chiều cao được đặt, thay vì hình ảnh đầy đủ? Các ->resize()chức năng không hoạt động trong trường hợp tôi này trinh sát (vì nó trả về một URL). Thêm vào đó, có thể có được Base Image, Small ImageThumbnailriêng biệt?

Mục tiêu chính của tôi là giữ mã càng nhanh càng tốt. Tôi chỉ có một id sản phẩm, vì tôi lặp qua các con của một sản phẩm. Tôi không muốn sử dụng ->load()vì điều đó làm mất nhiều thời gian tải hơn.

Câu trả lời:


7

Bạn có thể làm như thế này:

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

Tương tự, bạn cũng có thể làm điều đó cho "hình ảnh" và "hình thu nhỏ".


Điều này dường như hoạt động cho hình ảnh thông thường, nhưng nó chọn một thư mục sai cho small_image. Dường như tất cả các hình ảnh nhỏ đều được thay đổi kích thước và không chọn biến thể thay đổi kích thước. Bất cứ ý tưởng làm thế nào để giải quyết điều đó? Và bạn cũng có một giải pháp cho URL sản phẩm?
Sander Koedood

@SanderKoedood Để thay đổi kích thước, hãy thêm $ imageModel-> setWidth (150) -> setHeight (150) -> thay đổi kích thước () -> getUrl ();
mpaepper

Thay vì 150, dĩ nhiên, hãy sử dụng các giá trị bạn cần;)
mpaepper

Kiến thức của tôi không lan truyền đến đó ;-) nhưng cảm ơn vì đã chỉ ra điều đó. Tuy nhiên, điều đó không thay đổi vấn đề của trang web tải thư mục sai. Vì vậy, không có hình ảnh hiển thị khi sử dụng hình ảnh nhỏ.
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());

Nếu tôi chạy ở trên mã trình duyệt trả về trang trống. mã của tôi: justpaste.it/7hwc9
Gem

3

Hãy thử mã được đề cập bên dưới để nhận URL hình ảnh:

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

HOẶC LÀ

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

HOẶC LÀ

To get product URL:
$_products->getProductUrl();

2

Bạn không thể làm gì nếu không có biến sản phẩm $ / $ sản phẩm:

Đối với Url sản phẩm:

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

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

// bạn không thể dừng phương thức này khi thêm ___store vào URL, thậm chí bằng cách đặt _store_to_url thành false

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

** // bạn không thể dừng phương thức này khi thêm ___store vào URL, ngay cả khi đặt _store_to_url thành false // ghi chú - xem phần "bằng cách sử dụng _ignore_carget" bên dưới để biết lỗi có thể tranh cãi khi sử dụng param ** này

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

Đối với hình ảnh sản phẩm:

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

Nếu bạn muốn url hình ảnh sử dụng trong thẻ,

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

Tôi đã có kết quả $product->getUrlPath();rồi, bằng cách lấy url_key. Vì vậy, điều đó là có thể mà không cần $productbiến. Điều đó khiến tôi tin rằng việc lấy hình ảnh sản phẩm và thay đổi kích thước của nó cũng có thể thực hiện được mà không cần tải toàn bộ sản phẩm. (vì vậy không sử dụng Mage::getModel('catalog/product')->load($productId);)
Sander Koedood

2

Tôi muốn thêm 1 dòng mã vào nhận xét của mpaepper, mà tôi nghĩ rằng đó là một giải pháp tuyệt vời trong kịch bản cụ thể. Tôi đã sử dụng nó trong một vòng lặp trên một trang mà tôi không có đối tượng sản phẩm để tải hình ảnh qua mô hình sản phẩm.

Khi bạn không muốn tải một hình ảnh với một đối tượng sản phẩm, bạn có thể sử dụng phương pháp tiếp cận mpaepper exlpains. Đừng quên lưu hình ảnh được tạo thủ công khi bạn sử dụng giải pháp này. Khi bạn lưu đối tượng hình ảnh, nó sẽ tạo một tệp bộ đệm giống như các hình ảnh Magento bình thường cũng làm.

Vì vậy, mã đầy đủ phải là:

$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

Hình ảnh của sản phẩm có thể được truy cập theo cách sau:

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

Để thay đổi kích thước hình ảnh, bạn có thể thêm điều này:

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

Để lấy url sản phẩm:

$_products->getProductUrl();

Ở đây $ _products là chính sản phẩm chứ không phải id sản phẩm;


2
Tôi không có quyền truy cập vào $_productsbiến, vì điều đó sẽ yêu cầu tôi tải toàn bộ sản phẩm. Và để tải tất cả các sản phẩm tôi lặp đi lặp lại sẽ tạo ra thời gian tải là vài giây, quá nhiều.
Sander Koedood

Tại sao bạn không muốn lấy dữ liệu sản phẩm mà không tải sản phẩm? Bạn có thể thêm hàm propertyToSelect để chỉ chọn các thuộc tính bạn yêu cầu thay vì tải tất cả các thuộc tính.
Rojan Shrestha

1
Bạn có thể chỉ cho tôi cách bạn sẽ nhận được url và hình ảnh của sản phẩm không? Mục đích chính của tôi khi không nhận được một bộ sưu tập là giả định rằng điều này sẽ quá chậm.
Sander Koedood

Tôi thường tải sản phẩm và nó chưa bao giờ cảm thấy chậm theo bất kỳ cách nào. Tôi làm $ _products = Mage :: getModel ('danh mục / sản phẩm') -> loadByAttribution ('sku', 'Productsku');
Rojan Shrestha

sau đó làm theo câu trả lời của tôi ở trên
Rojan Shrestha
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.