Lấy URL hình ảnh đầy đủ của sản phẩm trong mẫu


23

Tôi đang cố gắng tạo một khối tĩnh để hiển thị các sản phẩm động. Đây là mã được cho là để có được mọi danh mục con và in hình ảnh cho mỗi sản phẩm trong mỗi danh mục.

<?php
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');
    ?><ol><?php
    foreach ($category->getChildrenCategories() as $child_category) {
        ?><li>
            <ul><?php
                foreach ($child_category->getProductCollection() as $product) {
                    ?><li><img src="<?php echo $product->getImage();?>"/><li><?php
                }
            ?></ul>
        </li><?php
    }
    ?></ol>

Nó gần như hoạt động ngoại trừ các srcs img chỉ là "/a/b/ab001.jpg" làm ví dụ và không phải là đường dẫn đầy đủ, ví dụ: "/ pub / media / catalog / sản phẩm / cache / 1 / small_image / 240x300 / abc123def456 / a / b / 001.jpg "để hình ảnh không thể được tìm thấy. Cách chính xác để có được hình ảnh sản phẩm là gì?


1
Đừng cố sử dụng Trình quản lý đối tượng trực tiếp trên mẫu của bạn. Chúng ta nên tạo khối mới hoặc sử dụng lại các hàm tồn tại.
Khoa TruongDinh

Câu trả lời:


28

Nếu khối của bạn mở rộng Magento\Catalog\Block\Product\AbstractProduct, bạn có thể sử dụng:

$imageType = 'category_page_list'; // choose which image
$image = $block->getImage($product, $imageType);

Sau đó, có được URL hình ảnh với

$image->getImageUrl();

hoặc nếu bạn muốn xuất nó dưới dạng <img>phần tử:

echo $image->toHtml();

Nếu khối của bạn không / không thể mở rộng khối sản phẩm trừu tượng, bạn có thể tự tạo một getImage()phương thức:

public function getImage($product, $imageId)
{
    return $this->imageBuilder->setProduct($product)
        ->setImageId($imageId)
        ->create();
}

$this->imageBuilder phải được tiêm như Magento\Catalog\Block\Product\ImageBuilder


Ví dụ $imageType, $imageIdcác biến phải là một trong các loại hình ảnh được xác định trong chủ đềcategory_page_list .

Xem app/design/frontend/Magento/luma/etc/view.xml cho tất cả các loại hình ảnh trong chủ đề Luma, ví dụ.

Trong Magento 2, các loại hình ảnh này được sử dụng thay vì xác định trực tiếp chiều rộng và chiều cao trong mẫu.


Tôi đang thử mã của bạn nhưng tôi gặp lỗi nàyUncaught Magento\Framework\View\Asset\File\NotFoundException: Unable to resolve the source file for 'adminhtml/_view/en_US/Magento_Catalog/images/product/placeholder/.jpg'
ND17

@ ND17 hai câu hỏi: 1) bạn có đang sử dụng khối trong khu vực quản trị không? Mã này chỉ dành cho frontend 2) bạn đã cấu hình hình ảnh giữ chỗ chưa? Nếu không và một sản phẩm không có hình ảnh, bạn sẽ luôn gặp lỗi
Fabian Schmengler

1
@davideghz một trong những loại hình ảnh được xác định trong chủ đề, ví dụ category_page_list. Xem: github.com/magento/magento2/blob/, trong Magento 2, bạn sử dụng chúng thay vì xác định chiều rộng và chiều cao trực tiếp trong mẫu
Fabian Schmengler

3
Bất kỳ ý tưởng về lý do tại sao nó sẽ mang lại giữ chỗ thay vì hình ảnh được chỉ định?
Laura

2
Tôi đang gặp vấn đề tương tự như @Laura. Nó luôn trả về hình ảnh giữ chỗ thay vì hình ảnh được chỉ định (hình ảnh được gán hoàn toàn hiển thị trong danh sách sản phẩm hoặc trang chi tiết sản phẩm chung khác).
fritzmg

9

Nếu bạn cần thay đổi kích thước hình ảnh sản phẩm và sử dụng hệ thống bộ đệm hình ảnh Magento mặc định và bạn không ở trong khu vực lối vào, bạn có thể sử dụng cách giải quyết này.

Trường hợp sử dụng: Nó có thể hữu ích nếu bạn cần thay đổi kích thước URL hình ảnh trên API tùy chỉnh cho một ứng dụng bên ngoài.

Mã chức năng :

/**
 * @var \Magento\Catalog\Model\ProductFactory
 */
protected $productFactory;

/**
 * @var \Magento\Catalog\Helper\ImageFactory
 */
protected $helperFactory;

/**
 * @var \Magento\Store\Model\App\Emulation
 */
protected $appEmulation;

/**
 * Constructor.
 *
 * @param \Magento\Catalog\Model\ProductFactory $productFactory
 * @param \Magento\Store\Model\App\Emulation $appEmulation
 * @param \Magento\Catalog\Helper\ImageFactory $helperFactory
 * @param \Magento\Store\Model\StoreManagerInterface $storeManager
 */
public function __construct(
    \Magento\Catalog\Model\ProductFactory $productFactory,
    \Magento\Store\Model\App\Emulation $appEmulation,
    \Magento\Catalog\Helper\ImageFactory $helperFactory,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
) {
    $this->productFactory                   = $productFactory;
    $this->imageBuilder                     = $imageBuilder;
    $this->helperFactory                    = $helperFactory;
    $this->appEmulation                     = $appEmulation;
    $this->storeManager                     = $storeManager;
}

/**
 * Retrieve product image
 *
 * @param \Magento\Catalog\Model\Product $product
 * @param string $imageId
 * @param array $attributes
 * @return \Magento\Catalog\Block\Product\Image
 */
public function getImage($product, $imageId, $attributes = [])
{
    $image = $this->helperFactory->create()->init($product, $imageId)
        ->constrainOnly(true)
        ->keepAspectRatio(true)
        ->keepTransparency(true)
        ->keepFrame(false)
        ->resize(200, 300);

    return $image;
}

public function customFunction()
{
    // some stuff here

    $storeId = $this->storeManager->getStore()->getId();

    $this->appEmulation->startEnvironmentEmulation($storeId, \Magento\Framework\App\Area::AREA_FRONTEND, true);

    $product = $this->productFactory->create()->loadByAttribute('sku', 'productSKU');
    $imageUrl = $this->getImage($product, 'product_base_image')->getUrl();

    echo $imageUrl;

    $this->appEmulation->stopEnvironmentEmulation();

    // some stuff here
}

Ví dụ đầu ra:

http://{domain}/media/catalog/product/cache/1/image/200x300/e9c3970ab036de70892d86c6d221abfe/s/r/{imageName}.jpg

Bình luận :

Tham số thứ ba của hàm startEn Môi trườngmulation được sử dụng để buộc sử dụng vùng giao diện nếu bạn đã ở trên cùng một storeId. (hữu ích cho khu vực API)

Cách giải quyết này tránh cho bạn có loại lỗi này:

http://XXXX.com/pub/static/webapi_rest/_view/en_US/Magento_Catalog/images/product/placeholder/.jpg

Uncaught Magento\Framework\View\Asset\File\NotFoundException: Unable to resolve the source file for 'adminhtml/_view/en_US/Magento_Catalog/images/product/placeh‌​older/.jpg'

1
Cảm ơn các mẹo về mô phỏng môi trường, chỉ những gì tôi cần.
thaddeusmt

2
Thi đua môi trường đã cứu ngày của tôi. Cảm ơn nhiều!
medina

+1 cho tính hữu dụng của API
tony

8

Thử nó

$store = $objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore();
$imageUrl = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $product->getImage();

1
Điều này là tốt bởi vì nó sẽ tự động cung cấp URL an toàn / không an toàn theo yêu cầu hiện tại
Milan Simek

3

Hãy thử mã này ..

$ProductImageUrl = $block->getUrl('pub/media/catalog').'product'.$_product->getImage();

Chào mừng đến với Magento SE. Câu trả lời chỉ chứa một dòng mã thường không hữu ích lắm. Trong trường hợp này, tương đối rõ ràng cách sử dụng dòng này, nhưng sử dụng getUrl()không đúng cách ngay cả khi nó có thể vô tình hoạt động. Nó nhận một $routetham số ở dạng "mô-đun / bộ điều khiển / hành động". "pub / media / catalog" trông giống như một tuyến đường, nhưng không phải.
Fabian Schmengler

Không sử dụng trình quản lý đối tượng, câu trả lời tốt. Ngay cả khi chỉ có một dòng.
LM_Fielding

@LM_Fielding Không phải mọi câu trả lời không sử dụng trình quản lý đối tượng đều tự động tốt.
Fabian Schmengler

Hãy thử mã này và gửi bình luận của bạn
Shihas Suliaman

1

Có lẽ Magento\Catalog\Helper\Product::getImageUrl()có thể giúp đỡ. Tôi không hiểu tại sao các nhà phát triển Magento không triển khai nó trong Magento\Catalog\Helper\Imagelớp vì getUrlphương thức trong trình trợ giúp hình ảnh không trả về những gì người ta có thể mong đợi ...


1

Vui lòng thử mã này:

$prdId = 35;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$hotPrd = $objectManager->get('Magento\Catalog\Model\Product')->load($prdId);
$store = $objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore();
echo $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $hotPrd->getThumbnail();

1

Bạn có thể sử dụng ObjectManager hoặc Block.

Đối tượng:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$store = $objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore();
$imageUrl = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $product->getImage();

Khối :

protected $_storeManagerInterface;

public function __construct(
  ...
  \Magento\Store\Model\StoreManagerInterface $storeManagerInterface,
  ...
)
{
  ...
  $this->_storeManagerInterface = $storeManagerInterface;
  ...
}

...

public function getStoreInterface($imgUrl){
   $store = $this->_storeManagerInterface->getStore();
   $storeMedia = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $imgUrl;
   return $storeMedia;
}
...

Gọi hàm:

<img src="<?php echo $block->getStoreInterface($imgUrl) ?>"/>

0

Hãy thử mã này

<img class="test-image" alt="image" src="<?php echo $block->getUrl('pub/media/catalog/product', ['_secure' => $block->getRequest()->isSecure()]).$product->getImage();?>" />

Hy vọng điều này sẽ giúp bạn


Đây là thêm một src của " domain.com/pub/media/catalog//a/b/ab001.jpg " cũng không thể tìm thấy
Alex

Thiếu thư mục sản phẩm.
LM_Fielding

0

Trong mô-đun của bạn:

public function getProducts()
{
    //... create collection code goes here...

    $result = [ ];

    foreach ( $collection as $product ) {
        $result[] = [
            'id'        => $product->getId(),
            '_sku'      => $product->getSku(),
            'permalink' => $product->getProductUrl($product),
            'title'     => $product->getName(),
            'raw_price' => $product->getPrice(),
            'image_url' => $this->getUrl().'pub/media/catalog/product'.$product->getImage()
        ];
    }

    return $result;
}

Sau đó, trong khối của bạn, bạn sẽ nhận được kết quả này:

print_r($block->getProducts());

Chà, nó không hoàn hảo, nhưng nó hiệu quả với tôi.

Hãy xem kết quả: nhập mô tả hình ảnh ở đây


0

Trong lớp của bạn, phụ thuộc vào StoreManagerInterface như:

use \Magento\Framework\View\Element\Template\Context;
use \Magento\Store\Model\StoreManagerInterface;

public function __construct(Context $context, StoreManagerInterfac $storeManager)
    {
        parent::__construct($context);
        $this->_storeManager = $storeManager;

    }

sau trong phương pháp của bạn, để lấy ngón tay cái chẳng hạn

public function getProductThumbnail(){

        return $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $product->getImage();
    }

0

Bạn có thể thử mã dưới đây.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');
$childcategories = $category->getChildrenCategories();

foreach($childcategories as $child)
    {
echo '<li class="sub-cat">';
        $cat = $objectManager->create('Magento\Catalog\Model\Category')->load($child->getId()); 
        ?>
        <a href="<?php echo $cat->getUrl(); ?>">
        <div class="sub-title">
            <h3><?php echo $cat->getName();?></h3>
        </div> 
    <?php
        if ($_imgUrl = $cat->getImageUrl())
        {
            $_imgHtml = '<div class="category-image"><img src="' . $_imgUrl . '" alt="' . $block->escapeHtml($cat->getName()) . '" title="' . $block->escapeHtml($cat->getName()) . '" class="image" /></div>';
            $_imgHtml = $_helper->categoryAttribute($cat, $_imgHtml, 'image');
            /* @escapeNotVerified */ echo $_imgHtml;
        }  

    ?>      
    <?php echo '</a></li>'; }
    echo '</ul>';
}

0

Đây là một phương pháp làm việc khác:

/** @var \Magento\Framework\UrlInterface $urlManager */
$url = $urlManager->getDirectUrl('pub/media/catalog/product' . $product->getImage());

Hoặc tôn trọng URL an toàn / không an toàn dựa trên yêu cầu hiện tại:

/** @var \Magento\Framework\UrlInterface $urlManager */
/** @var \Magento\Framework\App\RequestInterface $request */
$url = $urlManager->getDirectUrl(
    'pub/media/catalog/product' . $product->getImage(),
    ['_secure' => $request->isSecure()]
);

Tôi sẽ để đối tượng khởi tạo theo trí tưởng tượng của riêng bạn.


0

Chúng tôi có thể nhận url Base Image trong tệp phtml

$_objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$imageHelper  = $_objectManager->get('\Magento\Catalog\Helper\Image');
<?php $image_url = $imageHelper->init($product, 'product_base_image')->setImageFile($product->getFile())->resize($imagewidth, $imageheight)->getUrl(); ?>
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.