ম্যাজেন্টো 2: কাস্টম মডিউলটির জন্য চিত্রের পুনরায় আকার কীভাবে পাবেন?


12

আমি ম্যাজেন্টো 2 সিই সংস্করণ 2.1.0 ব্যবহার করছি

আমার সাথে ইমেজ ফিল্ডের কাস্টম মডিউল রয়েছে। এটি আপলোড করা হলে, আমি থাম্বনেইল চিত্র, তালিকার চিত্র এবং পণ্য বিশদ বিবরণ পৃষ্ঠা চিত্র থাকা পণ্য হিসাবে বিভিন্ন আকারের চিত্র চাই।

আকার পরিবর্তন ছাড়াই 1 টি চিত্র আপলোড করতে সক্ষম।

আমি চিত্রটি পুনরায় আকার দেওয়ার জন্য নীচের কোডটি ব্যবহার করছি, তবে এটি পণ্যের চিত্র URL দেবে। আমার কাস্টম মডিউল নয়।

\ অ্যাপ্লিকেশন \ কোড \ কাস্টম \ মডিউল \ ব্লক \ MyPosts \ Edit.php

public function getImage($posts, $image) {
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $_imagehelper = $objectManager->get('Magento\Catalog\Helper\Image');
    echo $postImage = $_imagehelper->init($posts, $image)->constrainOnly(FALSE)->keepAspectRatio(TRUE)->keepFrame(FALSE)->resize(400)->getUrl();
    exit;
}

এটি URL টি নীচে দেয় :

আমার ইমেজ এখানে সংরক্ষিত হয়: \magento2\pub\media\custom_module\posts\image

এই পথ দিয়ে আমি কীভাবে চিত্রের আকার পরিবর্তন করতে পারি এবং কীভাবে আমি বিভিন্ন আকারের চিত্র সংরক্ষণ / পুনরুদ্ধার করতে পারি?

উত্তর:


15

আপনি ক্লিক করে বিশদটি পরীক্ষা করতে পারেন, ম্যাজেন্টো 2 এ কাস্টম চিত্রের আকার পরিবর্তন করুন

ব্লক ফাইলের ভিতরে কোডের নীচে রাখুন,

   protected $_filesystem ;
   protected $_imageFactory;
   public function __construct(            
        \Magento\Framework\Filesystem $filesystem,         
        \Magento\Framework\Image\AdapterFactory $imageFactory         
        ) {         
        $this->_filesystem = $filesystem;               
        $this->_imageFactory = $imageFactory;         
        }

    // pass imagename, width and height
    public function resize($image, $width = null, $height = null)
    {
        $absolutePath = $this->_filesystem->getDirectoryRead(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA)->getAbsolutePath('custom_module/posts/').$image;
        if (!file_exists($absolutePath)) return false;
        $imageResized = $this->_filesystem->getDirectoryRead(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA)->getAbsolutePath('resized/'.$width.'/').$image;
        if (!file_exists($imageResized)) { // Only resize image if not already exists.
            //create image factory...
            $imageResize = $this->_imageFactory->create();         
            $imageResize->open($absolutePath);
            $imageResize->constrainOnly(TRUE);         
            $imageResize->keepTransparency(TRUE);         
            $imageResize->keepFrame(FALSE);         
            $imageResize->keepAspectRatio(TRUE);         
            $imageResize->resize($width,$height);  
            //destination folder                
            $destination = $imageResized ;    
            //save image      
            $imageResize->save($destination);         
        } 
        $resizedURL = $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA).'resized/'.$width.'/'.$image;
        return $resizedURL;
  } 

এখন পিটিএইচএমএল ফাইলের ভিতরে কল করুন,

$block->resize('test.jpg',500,400);

সাবাস। পুরোপুরি কাজ করে। সুতরাং চিত্র যুক্ত করার সময় আমাদের বিভিন্ন আকারের সাথে আপলোড করতে হবে না। কেবল প্রদর্শিত যখন আমরা সঠিক @ রাকেশ পরিচালনা করতে হবে?
অঙ্কিত শাহ

1
হ্যাঁ যখন আমাদের সেই সময় পরিচালনা করতে হবে।
রাকেশ জেসাদিয়া

যখন আমরা 1 টি চিত্রকে পুনরায় আকার দেওয়ার চেষ্টা করি এবং একই চিত্র সহ একই ফোল্ডারে রাখি তখন তা কার্যকর হয় না। এটির মতো: $ পরমপথ = $ এটি -> _ ফাইলসিস্টেম-> getDirectoryRead (\ ম্যাজেন্টো \ ফ্রেমওয়ার্ক \ অ্যাপ \ ফাইল সিস্টেম \ ডিরেক্টরি তালিকা: মিডিয়া) -> getRelativePath ('সি: / xampp / htdocs / magento / অ্যাপ / কোড / আহত / ব্যানারসাইডার /view/frontend/web/').$image; $ চিত্ররূপিত = $ এটি -> _ ফাইলসিস্টেম-> getDirectoryRead (\ Magento \ ফ্রেমওয়ার্ক \ অ্যাপ \ ফাইল সিস্টেম m ডিরেক্টরি তালিকা: MEDIA) -> getRelativePath ('সি: / xampp / htdocs / magento / অ্যাপ / কোড / আহত / ব্যানারস্লাইডার / ভিউ / ফ্রন্টএন্ড / ওয়েব /').$ ইমেজ;
ফুডু 8'18

ইতিমধ্যে উল্লিখিত হিসাবে, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়। আপনাকে এগুলি নিজেই করার দরকার নেই - কেবলমাত্র ম্যাগেন্টো কোরের ইতিমধ্যে বিদ্যমান চিত্র সহায়কটি ব্যবহার করুন।
ফ্রিজম্মেগ

@ রকেশ জেসাদিয়া, এটি আমাকে ইউআরএল হিসাবে অজানা পাঠ্য দিচ্ছে
হিতেশ বালপান্দে

13

গৃহীত উত্তরটি পারফরম্যান্সের উন্নতির জন্য চিত্রটি ক্যাশে করার বিষয়টি বিবেচনা করে না। প্রতিবার অনুরোধ করা হওয়ার সাথে সাথে আপনাকে আকারটি পরিবর্তন করতে এবং ওভাররাইট করতে হবে না। নিম্নলিখিত পদ্ধতিটি পুনরায় আকারিত চিত্রটিকে "ক্যাশে" ফোল্ডারে সংরক্ষণ করে যাতে ক্রমাগত কলগুলি ক্যাশে থেকে চিত্রটি ফেরত দেয়। পদ্ধতিটি কোনও সহায়ক (কোনও ব্লক নয়) এর মধ্যে রয়েছে যাতে আপনি এটি পছন্দ মতো কোনও টেম্পলেট থেকে কল করতে পারেন:

অ্যাপ্লিকেশন / কোড / বিক্রেতা / নামস্থান / সাহায্যকারী / Image.php

<?php

namespace Vendor\Namespace\Helper;

use Magento\Framework\App\Filesystem\DirectoryList;

class Image extends \Magento\Framework\App\Helper\AbstractHelper
{
    /**
     * Custom directory relative to the "media" folder
     */
    const DIRECTORY = 'custom_module/posts';

    /**
     * @var \Magento\Framework\Filesystem\Directory\WriteInterface
     */
    protected $_mediaDirectory;

    /**
     * @var \Magento\Framework\Image\Factory
     */
    protected $_imageFactory;

    /**
     * Store manager
     *
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    protected $_storeManager;

    /**
     * @param \Magento\Framework\App\Helper\Context $context
     * @param \Magento\Framework\Filesystem $filesystem
     * @param \Magento\Framework\Image\Factory $imageFactory
     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
     */
    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Framework\Filesystem $filesystem,
        \Magento\Framework\Image\AdapterFactory $imageFactory,
        \Magento\Store\Model\StoreManagerInterface $storeManager
    ) {
        $this->_mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
        $this->_imageFactory = $imageFactory;
        $this->_storeManager = $storeManager;
        parent::__construct($context);
    }

    /**
     * First check this file on FS
     *
     * @param string $filename
     * @return bool
     */
    protected function _fileExists($filename)
    {
        if ($this->_mediaDirectory->isFile($filename)) {
            return true;
        }
        return false;
    }

    /**
     * Resize image
     * @return string
     */
    public function resize($image, $width = null, $height = null)
    {
        $mediaFolder = self::DIRECTORY;

        $path = $mediaFolder . '/cache';
        if ($width !== null) {
            $path .= '/' . $width . 'x';
            if ($height !== null) {
                $path .= $height ;
            }
        }

        $absolutePath = $this->_mediaDirectory->getAbsolutePath($mediaFolder) . $image;
        $imageResized = $this->_mediaDirectory->getAbsolutePath($path) . $image;

        if (!$this->_fileExists($path . $image)) {
            $imageFactory = $this->_imageFactory->create();
            $imageFactory->open($absolutePath);
            $imageFactory->constrainOnly(true);
            $imageFactory->keepTransparency(true);
            $imageFactory->keepFrame(true);
            $imageFactory->keepAspectRatio(true);
            $imageFactory->resize($width, $height);
            $imageFactory->save($imageResized);
        }

        return $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . $path . $image;
    }
}

এখন কোনও। Phtml টেমপ্লেট থেকে আপনি এই পদ্ধতিটিকে কল করতে পারেন:

<!-- Get a reference to the Image helper -->
<?php $image = $this->helper('Vendor\Namespace\Helper\Image'); ?>
.
.
.
<!-- Resize the image by specifying width only -->
<img src="<?php echo $image->resize('/my-picture.jpg', 1200); ?>">

<!-- Resize the image by specifying width and height -->
<img src="<?php echo $image->resize('/my-picture.jpg', 640, 480); ?>">

আমি কি মূল ফাইলটির জন্য একটি চেক যুক্ত করার পরামর্শ দিতে পারি, যদি এটি বিদ্যমান না থাকে? পুনরায় আকার দেওয়ার () ফাংশনে: আমি পরিবর্তিত if (!$this->_fileExists($path . $image)) {করতেif (!$this->_fileExists($path . $image) && $this->_fileExists($mediaFolder . $image)) {
Alexandru Bangala

একটি মোহন মত কাজ, আপনাকে ধন্যবাদ। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত
ফুডু

আপনি কেবল বিদ্যমানটি ব্যবহার করতে পারেন \Magento\Catalog\Helper\Image
ফ্রিজমগ

2
@ ফ্রিটজমগ এই সহায়িকাটি কেবল পণ্যের চিত্রগুলির জন্য নয়? আমি কীভাবে এটি কাস্টম ইমেজ দিয়ে ব্যবহার করতে পারি যা কোনও পণ্য চিত্র নয় তবে চিত্রটি কাস্টম মডিউলে / পাব / মিডিয়া ফোল্ডারে আপলোড হয়েছে এবং এর সাথে পণ্যের কোনও সম্পর্ক নেই?
কোভিনিট

1
@ কোকিনেট - যতক্ষণ না মূল চিত্রটি পাব / মিডিয়া / ফোল্ডারের মধ্যে থাকে ততক্ষণ এটি কোনও চিত্রের সাথে কাজ করে। চিত্রটির পথটি কেবল $ চিত্র-> পুনরায় আকার ('চিত্র / পথ / ফাইল নাম.ext') এ পাস করুন;
ড্যানিয়েল ক্রেটোহভিল

3

আমি আশঙ্কা করছি যে আপনার ইমেজগুলিকে পুনরায় আকার দেওয়ার জন্য নতুন ক্লাস তৈরি করার দরকার নেই, যেহেতু ম্যাজেন্টো সহায়কদের এটি ইতিমধ্যে রয়েছে (দেখুন \Magento\Catalog\Helper\Image::resize)।

সুতরাং, আপনি ঠিক করতে পারেন:

$_imageHelper = \Magento\Framework\App\ObjectManager::getInstance()->get('Magento\Catalog\Helper\Image');

echo $_imageHelper->init($product, 'small_image', ['type'=>'small_image'])->keepAspectRatio(true)->resize('65','65')->getUrl();

আপনি এই ব্যবহারের উদাহরণও দেখতে পাবেন \Magento\VisualMerchandiser\Block\Adminhtml\Category\Merchandiser\Tile::getImageUrl(Magento EE কেবলমাত্র আমার অনুমান)


তবে আপনার উদাহরণটি কেবল পণ্যের চিত্র নিয়ে কাজ করবে, তাই না? প্রশ্নটি চিত্রের সাথে কাস্টম মডিউল সম্পর্কে। সুতরাং $product/ মিডিয়াতে কেবল ইমেজ ফাইলের কোনও পথ নেই ।
কোভিনেট

আপনি ঠিক @ কোকিনেট আমি এটি তখন লক্ষ্য করিনি। যাইহোক, এই থ্রেডটি আমাকে পণ্যের চিত্রগুলিতে সহায়তা করেছে এবং মনে হয় এটি অন্যকে সহায়তা করে। তবে আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ। যত তাড়াতাড়ি আমার কিছু সময় আছে, আমি আরও ভাল উত্তর সন্ধান করব। ;)
রিকার্ডো মার্টিনস

1

আমি এমন একটি সমস্যার মুখোমুখি হয়েছি যেখানে resizeপদ্ধতিটি আমার মাত্রাগুলিতে চিত্রটি ক্রপ করবে না যাতে আপনার মূল চিত্রের আকারের উপর নির্ভর করে আপনার উপরের এবং নীচে বা বাম এবং ডান দিক থেকে শস্যের মানগুলি গণনা করতে হবে। আমি @ রাকেশের কাছ থেকে কোডটি ব্যবহার করেছি এবং এটিকে সংশোধন করেছি যাতে এটি মূল চিত্রটি লম্বা বা প্রশস্ত এবং তদনুসারে ফসলগুলি পরীক্ষা করে:

public function resize($image, $width = null, $height = null)
{
    $mediaFolder = self::DIRECTORY;

    $path = $mediaFolder . 'cache';
    if ($width !== null) {
        $path .= '/' . $width . 'x';
        if ($height !== null) {
            $path .= $height ;
        }
    }

    $absolutePath = $this->_mediaDirectory->getAbsolutePath($mediaFolder) . $image;
    $imageResized = $this->_mediaDirectory->getAbsolutePath($path) . $image;

    if (!$this->_fileExists($path . $image) && $this->_fileExists($mediaFolder . $image)) {
        $imageFactory = $this->_imageFactory->create();
        $imageFactory->open($absolutePath);
        $imageFactory->constrainOnly(true);
        $imageFactory->keepAspectRatio(true);
        $imageFactory->keepFrame(false);

        $originalWidth = $imageFactory->getOriginalWidth();
        $originalHeight = $imageFactory->getOriginalHeight();

        $oldAspectRatio = $originalWidth / $originalHeight;
        $newAspectRatio = $width / $height;

        if ($oldAspectRatio > $newAspectRatio) {
            // original image is wider than the desired dimensions
            $imageFactory->resize(null, $height);
            $crop = ($imageFactory->getOriginalWidth() - $width) / 2;
            $imageFactory->crop(0, $crop, $crop, 0);
        } else {
            // it's taller...
            $imageFactory->resize($width, null);
            $crop = ($imageFactory->getOriginalHeight() - $height) / 2;
            $imageFactory->crop($crop, 0, 0, $crop);
        }

        $imageFactory->save($imageResized);

    }

    return $this->_storeManager
            ->getStore()
            ->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . $path . $image;
}

0

@ রাকেশ - আমিও তাই করেছি কিন্তু এটি আমার পক্ষে কাজ করছে না ত্রুটি আছে

ব্লককোটের ত্রুটি ফিল্টারিং: ত্রুটি 304 নং লাইনে /sitename/vendor/magento/framework/ চিত্র / অ্যাডাপ্টার / অ্যাবস্ট্রাক্টএডাপ্টার.এফপি

আপনি এই আমাকে সাহায্য করতে পারেন?

ধন্যবাদ.


সমাধান কি খুঁজে পাচ্ছেন? কারণ আমি এখন আপনার পরিস্থিতিতে আছি। :(
ফুডু

দয়া করে ফোল্ডার বা ফাইলের অনুমতি পরীক্ষা করুন।
সরফরাজ সিপাই

C: /xampp/htdocs/magento/pub/media/Aht_BannerSlider/images/slide_1.jpg ফোল্ডারে আহত_ব্যানারস্লাইডার / চিত্র / স্লাইড_1.jpg নেই এবং আমি কেবল পব ফোল্ডারের জন্য অনুমতি দিয়েছি।
ফুদু

এবং এখনও কাজ করে না। :(
ফুদু

এই পৃষ্ঠায় শেষ উত্তর চেক করুন।
সরফরাজ সিপাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.