টেমপ্লেটে পণ্যের পুরো চিত্রের 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 / ছোট_আইমেজ / 240x300 / abc123def456 / a / b / 001.jpg "যাতে চিত্রগুলি পাওয়া যায় না। পণ্যের চিত্র পাওয়ার সঠিক উপায় কী?


1
আপনার টেম্পলেটে সরাসরি অবজেক্ট ম্যানেজার ব্যবহার করার চেষ্টা করবেন না । আমাদের নতুন ব্লক তৈরি করা উচিত বা বিদ্যমান ব্যবহারের পুনরায় ব্যবহার করা উচিত।
খোয়া ট্রুংদিনহ

উত্তর:


28

যদি আপনার ব্লকটি প্রসারিত হয় তবে Magento\Catalog\Block\Product\AbstractProductআপনি ব্যবহার করতে পারেন:

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

তারপরে হয় হয় সঙ্গে চিত্র চিত্রটি

$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'
পাচ্ছি

@ এনডি 17 দুটি প্রশ্ন: 1) আপনি প্রশাসক অঞ্চলে ব্লকটি ব্যবহার করছেন? এই কোডটি কেবলমাত্র 2) আপনি কোনও স্থানধারক চিত্রটি কনফিগার করেছেন? যদি না হয় এবং কোনও পণ্যের কোনও চিত্র না থাকে তবে আপনি সর্বদা ত্রুটিগুলি পেয়ে
যাবেন

1
@ ডেভিডেজেজ উদাহরণস্বরূপ, থিমটিতে সংজ্ঞাযুক্ত চিত্রগুলির মধ্যে একটি category_page_list। দেখুন: github.com/magento/magento2/blob/… ম্যাজেন্টো 2-এ আপনি সরাসরি টেম্পলেটে প্রস্থ এবং উচ্চতা নির্ধারণের পরিবর্তে এগুলি ব্যবহার করেন
ফ্যাবিয়ান শেমংলার

3
কেন এটি নির্ধারিত চিত্রের পরিবর্তে স্থানধারককে ফিরিয়ে আনবে সে সম্পর্কে কোনও ধারণা?
লরা

2
@ লরা হিসাবে আমারও একই সমস্যা হচ্ছে। এটি সর্বদা নির্ধারিত চিত্রের পরিবর্তে স্থানধারক চিত্রটি ফেরত দেয় (নির্ধারিত চিত্রটি পণ্যের তালিকায় বা অন্যথায় জেনেরিক পণ্যের বিবরণ পৃষ্ঠায় পুরোপুরি দৃশ্যমান হয়)।
frizmg

9

আপনার যদি পণ্যের চিত্রটির আকার পরিবর্তন করতে হবে এবং ডিফল্ট ম্যাজেন্টো ইমেজ ক্যাশে সিস্টেমটি ব্যবহার করতে হবে এবং আপনি সীমান্ত অঞ্চলে নেই, আপনি এই কাজটি ব্যবহার করতে পারেন।

কেস ব্যবহার করুন: যদি আপনার বাহ্যিক অ্যাপ্লিকেশনটির জন্য আপনার কাস্টম 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

মন্তব্যসমূহ:

আপনি যদি একই স্টোরআইডে থাকেন তবে ফাংশন স্টার্টইনমেন্টমেন্টমুলেশনটির তৃতীয় প্যারামিটারটি ফ্রন্টএন্ড এরিয়া ব্যবহার করার জন্য জোর করা হয়। (এপিআই অঞ্চলের জন্য দরকারী)

এই ধরণের ত্রুটিগুলি এড়াতে আপনাকে এড়াতে হবে:

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 দেবে
মিলান সিমেক

3

এই কোডটি ব্যবহার করে দেখুন ..

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

Magento এসই এ স্বাগতম। শুধুমাত্র একটি লাইনের কোডের উত্তরগুলি প্রায়শই খুব সহায়ক হয় না। getUrl()এক্ষেত্রে এটি অপেক্ষাকৃত স্পষ্ট যে এই লাইনটি কীভাবে ব্যবহৃত হবে বলে মনে করা হচ্ছে, তবে এটি দুর্ঘটনাক্রমে কাজ হলেও সঠিকভাবে ব্যবহার করা যায় না। এটি $route"মডিউল / নিয়ামক / ক্রিয়া" আকারে একটি পরামিতি নেয় । "পাব / মিডিয়া / ক্যাটালগ" দেখতে কোনও রুটের মতো দেখাচ্ছে তবে তা নয়।
ফ্যাবিয়ান শেমঙ্গলার

অবজেক্ট ম্যানেজার ব্যবহার করে না, ভাল উত্তর। এমনকি যদি কেবল একটি লাইন হয়।
এলএম_ ফিল্ডিং

@ এলএম_ফিল্ডিং প্রতিটি উত্তর যা অবজেক্ট ম্যানেজারটি ব্যবহার করে না তা স্বয়ংক্রিয়ভাবে ভাল।
ফ্যাবিয়ান শেমংলার

এই কোডটি ব্যবহার করে দেখুন এবং আপনার মন্তব্য পোস্ট করুন
শিহাস সুলিয়ামান

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 = \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();?>" />

আশা করি এটা তোমাকে সাহায্য করবে


এটি " ডোমেন.com/pub/media/catolog//a/b/ab001.jpg " এর একটি এসআরসি যুক্ত করছে যা পাওয়া যায় না
অ্যালেক্স

পণ্য ডিরেক্টরি অনুপস্থিত।
এলএম_ ফিল্ডিং

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

আপনার শ্রেণিতে ইনজেকশন নির্ভরতা স্টোর ম্যানেজার ইন্টারফেসের মতো:

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

আমরা পিটিএইচটিএমএল ফাইলে বেস ইমেজ 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.