템플릿에서 제품의 전체 이미지 URL 가져 오기


23

동적 제품을 표시하기 위해 정적 블록을 만들려고합니다. 이것은 모든 하위 카테고리를 가져와 각 카테고리의 각 제품에 대한 이미지를 인쇄하는 코드입니다.

<?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>

예를 들어 img src가 "/a/b/ab001.jpg"이고 전체 경로가 아닌 "/ pub / media / catalog / product / cache / 1 / small_image / 240x300 / abc123def456 /을 제외하고는 거의 작동합니다. a / b / 001.jpg "이므로 이미지를 찾을 수 없습니다. 제품 이미지를 얻는 올바른 방법은 무엇입니까?


1
템플릿에서 직접 개체 관리자를 사용 하지 마십시오 . 새로운 블록을 만들거나 존재하는 기능을 재사용해야합니다.
Khoa TruongDinh 2016 년

답변:


28

블록이 확장 Magento\Catalog\Block\Product\AbstractProduct되면 다음을 사용할 수 있습니다.

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

그런 다음 이미지 URL을

$image->getImageUrl();

또는 <img>요소 로 출력하려면 다음을 수행하십시오 .

echo $image->toHtml();

블록이 추상 제품 블록을 확장하지 못하거나 확장 할 수없는 경우 getImage()직접 방법을 만들 수 있습니다 .

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

$this->imageBuilder 로 주입해야합니다 Magento\Catalog\Block\Product\ImageBuilder


$imageType또는 $imageId변수는 예를 들면, 테마에 기재된 화상 유형 중 하나이어야한다 category_page_list.

app/design/frontend/Magento/luma/etc/view.xml예를 들어 Luma 테마의 모든 이미지 유형을 참조하십시오 .

Magento 2에서는 템플릿에서 직접 너비와 높이를 정의하는 대신이 이미지 유형이 사용됩니다.


코드를 작성하려고하지만이 오류가 발생합니다Uncaught 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 두 가지 질문 : 1) 관리 영역에서 블록을 사용하고 있습니까? 이 코드는 프런트 엔드 전용입니다. 2) 자리 표시 자 이미지를 구성 했습니까? 그렇지 않은 경우 제품에 이미지가 없으면 항상 오류가 발생합니다.
Fabian Schmengler

1
@davideghz 테마에 정의 된 이미지 유형 중 하나입니다 (예 :) category_page_list. 참조 : Magento 2의 github.com/magento/magento2/blob/… 템플릿에서 직접 너비와 높이를 정의하는 대신 이것을 사용하십시오
Fabian Schmengler

3
할당 된 이미지 대신 자리 표시자를 다시 가져 오는 이유에 대한 아이디어가 있습니까?
Laura

2
@Laura와 같은 문제가 있습니다. 지정된 이미지 대신 항상 자리 표시 자 이미지를 반환합니다 (할당 된 이미지는 제품 목록 또는 일반 제품 세부 정보 페이지에서 완벽하게 표시됨).
fritzmg

9

제품 이미지의 크기를 조정하고 기본 Magento 이미지 캐시 시스템을 사용해야하고 프런트 엔드 영역에 있지 않은 경우이 해결 방법을 사용할 수 있습니다.

사용 사례 : 외부 애플리케이션의 사용자 정의 API에서 이미지 URL 크기를 조정해야하는 경우 유용 할 수 있습니다.

기능 코드 :

/**
 * @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
}

출력 예 :

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

코멘트 :

startEnvironmentEmulation 함수의 세 번째 매개 변수 는 이미 동일한 storeId에있는 경우 프론트 엔드 영역을 강제로 사용하는 데 사용됩니다. (API 영역에 유용)

이 해결 방법은 이러한 종류의 오류가 발생하지 않도록합니다.

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
필요한 환경 에뮬레이션에 대한 팁을 주셔서 감사합니다.
thaddeusmt

2
환경 에뮬레이션으로 하루가 절약되었습니다. 많은 감사합니다!
medina

API 유용성 +1
tony

8

시도 해봐

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

1
이것은 현재 요청에 따라 안전하고 안전하지 않은 URL을 자동으로 제공하기 때문에 좋습니다
Milan Simek

3

이 코드를 사용해보십시오.

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

Magento SE에 오신 것을 환영합니다. 한 줄의 코드 만 포함 된 답변은 종종 큰 도움이되지 않습니다. 이 경우이 라인을 어떻게 사용해야하는지 비교적 분명하지만 getUrl()실수로 작동하더라도 올바르게 사용하는 것은 아닙니다. $route"모듈 / 컨트롤러 / 액션"형식 의 매개 변수를 사용합니다. "pub / media / catalog"는 경로처럼 보이지만 그렇지 않습니다.
Fabian Schmengler

개체 관리자를 사용하지 않습니다. 좋은 대답입니다. 한 줄이라도.
LM_Fielding

@LM_Fielding 객체 관리자를 사용하지 않는 모든 답변이 자동으로 좋은 것은 아닙니다.
Fabian Schmengler

이 코드를 시도하고 의견을 게시하십시오
Shihas Suliaman

1

아마 Magento\Catalog\Helper\Product::getImageUrl()도움이 될 수 있습니다. 이미지 도우미 Magento\Catalog\Helper\ImagegetUrl메소드가 기대할 수있는 것을 반환하지 않기 때문에 Magento 개발자가 클래스 에서 구현하지 않은 이유를 이해 하지 못합니다 ...


1

이 코드를 시도하십시오 :

$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

ObjectManager 또는 Block을 사용할 수 있습니다.

객체 관리자 :

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

블록 :

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;
}
...

함수를 호출하십시오.

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

0

이 코드를 사용해보십시오

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

희망이 당신을 도울 것입니다


이것은 또한 찾을 수없는 " domain.com/pub/media/catalog//a/b/ab001.jpg " 의 src를 추가합니다
Alex

제품 디렉토리가 누락되었습니다.
LM_Fielding

0

모듈에서 :

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

그런 다음 블록에서 다음 결과를 얻습니다.

print_r($block->getProducts());

글쎄, 그것은 완벽하지는 않지만 나에게 효과적입니다.

결과를 살펴보십시오. 여기에 이미지 설명을 입력하십시오


0

클래스에서 종속성과 같은 StoreManagerInterface를 삽입하십시오.

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;

    }

예를 들어 방법에 따라, 예를 들어 Thumbail을 얻으려면

public function getProductThumbnail(){

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

0

아래 코드에서 시도해 볼 수 있습니다.

$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

이것은 또 다른 작업 방법입니다.

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

또는 현재 요청을 기반으로 안전하고 안전하지 않은 URL을 존중합니다.

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

객체 인스턴스화를 여러분의 상상력에 맡기겠습니다.


0

phtml 파일에서 기본 이미지 URL을 얻을 수 있습니다

$_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(); ?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.