टेम्पलेट में उत्पाद की पूर्ण छवि 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 srcs केवल "/a/b/ab001.jpg" उदाहरण के रूप में हैं और पूर्ण पथ नहीं जैसे "/ पब / मीडिया / कैटलॉग / उत्पाद / कैश / 1 / small_image / 240x300 / abc123def456 / a / b / 001.jpg "इसलिए चित्र नहीं मिल सकते हैं। उत्पाद चित्र प्राप्त करने का सही तरीका क्या है?


1
ऑब्जेक्ट टेम्पलेट को सीधे अपने टेम्पलेट पर उपयोग करने का प्रयास करें। हमें नए ब्लॉक बनाने या मौजूद कार्यों का फिर से उपयोग करना चाहिए।
खोआ TruongDinh

जवाबों:


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उदाहरण के लिए, लूमा थीम में सभी छवि प्रकार देखें ।

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 के लिए लक्षित है) क्या आपने एक प्लेसहोल्डर छवि को कॉन्फ़िगर किया है? यदि नहीं और किसी उत्पाद की कोई छवि नहीं है, तो आपको हमेशा त्रुटियाँ
मिलेंगी

1
उदाहरण के लिए, थीम में परिभाषित छवि प्रकारों में से @davideghz category_page_list। देखें: github.com/magento/magento2/blob/… Magento 2 में आप सीधे टेम्पलेट में चौड़ाई और ऊंचाई को परिभाषित करने के बजाय इनका उपयोग करते हैं
फेबियन शेंगलर

3
कोई भी विचार क्यों यह नियत छवि के बजाय प्लेसहोल्डर को वापस लाएगा?
लौरा

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 का तीसरा पैरामीटर फ्रंटएंड क्षेत्र के उपयोग को बाध्य करने के लिए उपयोग किया जाता है यदि आप पहले से ही एक ही स्टोर पर हैं। (एपीआई क्षेत्र के लिए उपयोगी)

इस प्रकार की त्रुटियों से बचने के लिए यह समाधान:

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
पर्यावरण अनुकरण ने मेरा दिन बचाया। बहुत धन्यवाद!
मदिना

एपीआई उपयोगिता के लिए +1
टोनी

8

कोशिश करो

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

1
यह एक अच्छा है क्योंकि यह वर्तमान अनुरोध के अनुसार स्वचालित रूप से सुरक्षित / असुरक्षित URL देगा
मिलान Simek

3

इस कोड को आज़माएं ..

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

Magento SE में आपका स्वागत है। उत्तर जिसमें केवल एक पंक्ति का कोड होता है, अक्सर बहुत उपयोगी नहीं होते हैं। इस मामले में यह अपेक्षाकृत स्पष्ट है कि इस लाइन का उपयोग कैसे किया जाना चाहिए, लेकिन getUrl()यह सही तरीके से नहीं है भले ही यह गलती से काम कर सकता हो। यह $route"मॉड्यूल / नियंत्रक / कार्रवाई" के रूप में एक पैरामीटर लेता है । "पब / मीडिया / कैटलॉग" एक मार्ग की तरह दिखता है, लेकिन ऐसा नहीं है।
फाबियान शेंगलर

वस्तु प्रबंधक का उपयोग नहीं करता है, अच्छा जवाब। भले ही एक ही लाइन हो।
LM_Fielding

@LM_Fielding ऑब्जेक्ट प्रबंधक का उपयोग नहीं करने वाला प्रत्येक उत्तर स्वचालित रूप से अच्छा है।
फाबियान शेंगलर

इस कोड को आज़माएं और अपनी टिप्पणी पोस्ट करें
शिहास सुलियमन

1

शायद Magento\Catalog\Helper\Product::getImageUrl()मदद कर सके। मुझे समझ में नहीं आता है कि मैगनेटो डेवलपर्स ने इसे Magento\Catalog\Helper\Imageकक्षा में लागू नहीं किया क्योंकि getUrlछवि सहायक में विधि वापस नहीं आती है जो कोई उम्मीद नहीं कर सकता है ...


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 या ब्लॉक का उपयोग कर सकते हैं।

ऑब्जेक्टमैनगर:

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

    }

अपने तरीके के बाद, उदाहरण के लिए अंगूठे को प्राप्त करने के लिए

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 फाइल में प्राप्त कर सकते हैं

$_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(); ?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.