ম্যাজেন্টো 2: ইউআই ফাইলআপলোডার প্রয়োগ করুন


22

আমি সম্প্রতি ম্যাজেন্টো ২.১..7 এ আমার ফর্মটিতে ফাইলআপলোডার ইউআই উপাদানটি প্রয়োগ করেছি।

এর জন্য কোডটি এখানে ( অ্যাপ্লিকেশন / কোড / বিক্রেতা / ব্লগ / ভিউ / অ্যাডমিনটিচটিএমএল / ইউআই_কম্পোনেন্ট / বিক্রেতার_ব্লগ_ফর্ম.এক্সএমএল ) রয়েছে:

<field name="featured_images">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="label" translate="true" xsi:type="string">Hervorgehobene Bilder:</item>
                    <item name="formElement" xsi:type="string">fileUploader</item>
                    <item name="componentType" xsi:type="string">fileUploader</item>
                    <item name="previewTmpl" xsi:type="string">Magento_Catalog/image-preview</item>
                    <item name="elementTmpl" xsi:type="string">ui/form/element/uploader/uploader</item>
                    <item name="allowedExtensions" xsi:type="string">jpg jpeg gif png</item>
                    <item name="notice" xsi:type="string" translate="true">Erlaubte Dateitypen: png, gif, jpg, jpeg.</item>
                    <item name="maxFileSize" xsi:type="number">2097152</item>
                    <item name="source" xsi:type="string">blog</item>
                    <item name="sortOrder" xsi:type="number">10</item>
                    <item name="dataScope" xsi:type="string">featured_images</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">false</item>
                    </item>
                    <item name="uploaderConfig" xsi:type="array">
                        <item name="url" xsi:type="url" path="vendor_blog/blog/upload"/>
                    </item>
                </item>
            </argument>
        </field>

এর জন্য আমার নিয়ামক এটি ( অ্যাপ্লিকেশন / কোড / বিক্রেতা / ব্লগ / কন্ট্রোলার / অ্যাডমিনটিচটিএমএল / ব্লগ / আপলোড.এফপি ):

<?php

namespace Vendor\Blog\Controller\Adminhtml\Blog;

use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Backend\App\Action;  

class Upload extends \Vendor\Blog\Controller\Adminhtml\Blog
{

    protected $_fileUploaderFactory;
    protected $_directory_list;
    protected $_logger;

    public function __construct(
        Action\Context $context,
        \Magento\Framework\Registry $coreRegistry,
        \Magento\MediaStorage\Model\File\UploaderFactory $fileUploaderFactory,
        \Magento\Framework\App\Filesystem\DirectoryList $directory_list,
        \Psr\Log\LoggerInterface $logger
    ) {
        $this->_fileUploaderFactory = $fileUploaderFactory;
        $this->_directory_list = $directory_list;
        $this->_logger = $logger;
        parent::__construct($context, $coreRegistry);
    }

    public function execute(){
        $uploader = $this->_fileUploaderFactory->create(['fileId' => 'featured_images']);
        $uploader->setAllowedExtensions(['jpg', 'jpeg', 'gif', 'png']);
        $uploader->setAllowRenameFiles(false);
        $uploader->setFilesDispersion(false);
        $path = $this->_filesystem->getDirectoryRead(DirectoryList::MEDIA)->getAbsolutePath('blog');
        //$path = $this->_directory_list->getPath('media') . '/blog';
        $this->_logger->debug('Uploader.php: '.$path);
        $uploader->save($path);
    }
}

যাইহোক, যখন আমি একটি চিত্র আপলোড এবং Chrome এর কনসোলে কল পরিদর্শন, আমি একটি ত্রুটি 500 ব্যতিক্রম পাবেন: $ _FILES অ্যারে খালি

আমি দু'দিন ধরে লড়াই করে যাচ্ছি তবে ঠিক কাজ করতে পারছি না। যখন আমি বিকল্প $pathপরিবর্তনশীল লাইনটি আপত্তি করি তখন আপলোড সফল হয় তবে আমি পূর্বরূপ পাই না।

আমি পড়েছি যে এটি যে enctypeফর্মটি সমস্যার কারণ হয়ে উঠেছে তা হতে পারে তবে এটি কোনও ইউআই উপাদান ফর্মের জন্য কীভাবে পরীক্ষা করা যায় সে সম্পর্কে আমি কোনও তথ্য পাইনি।

আপনার যদি সম্পূর্ণ ব্যতিক্রম কোডের প্রয়োজন হয় তবে দয়া করে আমাকে জানান।

আমি সম্ভব প্রতিটি সাহায্যের প্রশংসা করি। ধন্যবাদ!


কেন আপনি আপলোডের অন্য উপায় চেষ্টা করবেন না? যেমন। webkul.com/blog/…
পল্লবী

দুঃখের সাথে আমি কেবল এই এক্সটেনশনের জন্য এক্সএমএল ঘোষণার সাথে খাঁটি ইউআই উপাদানগুলি ব্যবহার করতে সীমাবদ্ধ। তবে এটি একটি দুর্দান্ত বিকল্প হবে।
হলিউরন

উত্তর:


35

আমি প্রশাসনিক আকারে ইউআই ফাইলআপলোডার উপাদান যুক্ত করতে এই পদক্ষেপগুলি অনুসরণ করি follow

আমি আমার FAQ এক্সটেনশনের জন্য আইকন আপলোড করতে UI ফাইলআপলোডার উপাদানটি ব্যবহার করি। আপনি এখান থেকে রেফারেন্স নিতে পারেন: https://github.com/mageprince/magento2- FAQ

1) admin_form.xml(প্রশাসন ফর্ম) এ ফিল্ড যুক্ত করুন

<field name="icon">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="dataType" xsi:type="string">string</item>
            <item name="source" xsi:type="string">FaqGroup</item>
            <item name="label" xsi:type="string" translate="true">Group Image</item>
            <item name="visible" xsi:type="boolean">true</item>
            <item name="formElement" xsi:type="string">fileUploader</item>
            <item name="elementTmpl" xsi:type="string">ui/form/element/uploader/uploader</item>
            <item name="previewTmpl" xsi:type="string">Vendor_Module/image-preview</item>
            <item name="required" xsi:type="boolean">false</item>
            <item name="sortOrder" xsi:type="number">40</item>
            <item name="uploaderConfig" xsi:type="array">
                <item name="url" xsi:type="url" path="your_router/faqgroup/upload"/>
            </item>
        </item>
    </argument>
</field>

2) এখন আমাদের নিয়ামক তৈরি করতে হবে যা আমরা uploaderConfigঅ্যাডমিন আকারে সংজ্ঞায়িত করেছি :<item name="url" xsi:type="url" path="vendor_module/faqgroup/upload"/>

অ্যাপ্লিকেশন / কোড / বিক্রেতা / মডিউল / কন্ট্রোলার / Adminhtml / FaqGroup / Upload.php

<?php

namespace Vendor\Module\Controller\Adminhtml\FaqGroup;

use Magento\Framework\Controller\ResultFactory;

class Upload extends \Magento\Backend\App\Action
{
    public $imageUploader;

    public function __construct(
        \Magento\Backend\App\Action\Context $context,
        \Vendor\Module\Model\ImageUploader $imageUploader
    ) {
        parent::__construct($context);
        $this->imageUploader = $imageUploader;
    }

    public function _isAllowed()
    {
        return $this->_authorization->isAllowed('Vendor_Module::Faq');
    }

    public function execute()
    {
        try {
            $result = $this->imageUploader->saveFileToTmpDir('icon');
            $result['cookie'] = [
                'name' => $this->_getSession()->getName(),
                'value' => $this->_getSession()->getSessionId(),
                'lifetime' => $this->_getSession()->getCookieLifetime(),
                'path' => $this->_getSession()->getCookiePath(),
                'domain' => $this->_getSession()->getCookieDomain(),
            ];
        } catch (\Exception $e) {
            $result = ['error' => $e->getMessage(), 'errorcode' => $e->getCode()];
        }
        return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setData($result);
    }
}

3) তৈরি করুন ImageUploader.php

অ্যাপ্লিকেশন / কোড / বিক্রেতা / মডিউল / মডেল / ImageUploader.php

<?php

namespace Prince\Faq\Model;

class ImageUploader
{
    private $coreFileStorageDatabase;
    private $mediaDirectory;
    private $uploaderFactory;
    private $storeManager;
    private $logger;
    public $baseTmpPath;
    public $basePath;
    public $allowedExtensions;

    public function __construct(
        \Magento\MediaStorage\Helper\File\Storage\Database $coreFileStorageDatabase,
        \Magento\Framework\Filesystem $filesystem,
        \Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Psr\Log\LoggerInterface $logger
    ) {
        $this->coreFileStorageDatabase = $coreFileStorageDatabase;
        $this->mediaDirectory = $filesystem->getDirectoryWrite(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA);
        $this->uploaderFactory = $uploaderFactory;
        $this->storeManager = $storeManager;
        $this->logger = $logger;
        $this->baseTmpPath = "faq/tmp/icon";
        $this->basePath = "faq/icon";
        $this->allowedExtensions= ['jpg', 'jpeg', 'gif', 'png'];
    }

    public function setBaseTmpPath($baseTmpPath)
    {
        $this->baseTmpPath = $baseTmpPath;
    }

    public function setBasePath($basePath)
    {
        $this->basePath = $basePath;
    }

    public function setAllowedExtensions($allowedExtensions)
    {
        $this->allowedExtensions = $allowedExtensions;
    }

    public function getBaseTmpPath()
    {
        return $this->baseTmpPath;
    }

    public function getBasePath()
    {
        return $this->basePath;
    }

    public function getAllowedExtensions()
    {
        return $this->allowedExtensions;
    }

    public function getFilePath($path, $imageName)
    {
        return rtrim($path, '/') . '/' . ltrim($imageName, '/');
    }

    public function moveFileFromTmp($imageName)
    {
        $baseTmpPath = $this->getBaseTmpPath();
        $basePath = $this->getBasePath();
        $baseImagePath = $this->getFilePath($basePath, $imageName);
        $baseTmpImagePath = $this->getFilePath($baseTmpPath, $imageName);
        try {
            $this->coreFileStorageDatabase->copyFile(
                $baseTmpImagePath,
                $baseImagePath
            );
            $this->mediaDirectory->renameFile(
                $baseTmpImagePath,
                $baseImagePath
            );
        } catch (\Exception $e) {
            throw new \Magento\Framework\Exception\LocalizedException(
                __('Something went wrong while saving the file(s).')
            );
        }
        return $imageName;
    }

    public function saveFileToTmpDir($fileId)
    {
        $baseTmpPath = $this->getBaseTmpPath();
        $uploader = $this->uploaderFactory->create(['fileId' => $fileId]);
        $uploader->setAllowedExtensions($this->getAllowedExtensions());
        $uploader->setAllowRenameFiles(true);
        $result = $uploader->save($this->mediaDirectory->getAbsolutePath($baseTmpPath));
        if (!$result) {
            throw new \Magento\Framework\Exception\LocalizedException(
                __('File can not be saved to the destination folder.')
            );
        }

        $result['tmp_name'] = str_replace('\\', '/', $result['tmp_name']);
        $result['path'] = str_replace('\\', '/', $result['path']);
        $result['url'] = $this->storeManager
                ->getStore()
                ->getBaseUrl(
                    \Magento\Framework\UrlInterface::URL_TYPE_MEDIA
                ) . $this->getFilePath($baseTmpPath, $result['file']);
        $result['name'] = $result['file'];
        if (isset($result['file'])) {
            try {
                $relativePath = rtrim($baseTmpPath, '/') . '/' . ltrim($result['file'], '/');
                $this->coreFileStorageDatabase->saveFile($relativePath);
            } catch (\Exception $e) {
                $this->logger->critical($e);
                throw new \Magento\Framework\Exception\LocalizedException(
                    __('Something went wrong while saving the file(s).')
                );
            }
        }
        return $result;
    }
}

4) তৈরি করুন image-preview.html

অ্যাপ্লিকেশন / কোড / বিক্রেতা / মডিউল / দৃশ্য / adminhtml / ওয়েব / টেমপ্লেট / চিত্র-preview.html

<div class="file-uploader-summary">
    <div class="file-uploader-preview">
        <a attr="href: $parent.getFilePreview($file)" target="_blank">
            <img
                class="preview-image"
                tabindex="0"
                event="load: $parent.onPreviewLoad.bind($parent)"
                attr="
                    src: $parent.getFilePreview($file),
                    alt: $file.name">
        </a>

        <div class="actions">
            <button
                type="button"
                class="action-remove"
                data-role="delete-button"
                attr="title: $t('Delete image')"
                click="$parent.removeFile.bind($parent, $file)">
                <span translate="'Delete image'"/>
            </button>
        </div>
    </div>

    <div class="file-uploader-filename" text="$file.name"/>
    <div class="file-uploader-meta">
        <text args="$file.previewWidth"/>x<text args="$file.previewHeight"/>
    </div>
</div>

5) এখন ImageUploader.phpdi.xML এর জন্য যুক্তি যুক্ত করুন

অ্যাপ্লিকেশন / কোড / বিক্রেতা / মডিউল, / etc / di.xml

<type name="Vendor\Module\Model\ImageUploader">
    <arguments>
        <!-- Temporary file stored in pub/media/faq/tmp/icon -->
        <argument name="baseTmpPath" xsi:type="string">faq/tmp/icon</argument>
        <argument name="basePath" xsi:type="string">faq/icon</argument>
        <argument name="allowedExtensions" xsi:type="array">
            <item name="jpg" xsi:type="string">jpg</item>
            <item name="jpeg" xsi:type="string">jpeg</item>
            <item name="gif" xsi:type="string">gif</item>
            <item name="png" xsi:type="string">png</item>
        </argument>
    </arguments>
</type>

সম্পাদনা ফর্মটিতে লোড আপলোড করা চিত্রের জন্য এই ফাইলটি পরীক্ষা করুন: ডেটাপ্রোভাইডার.পিপি

আউটপুট:

এখানে চিত্র বর্ণনা লিখুন

ডাটাবেসে চিত্র সংরক্ষণ করতে

অ্যাপ্লিকেশন / কোড / বিক্রেতা / মডিউল / কন্ট্রোলার / Adminhtml / Save.php

<?php

namespace Vendor\Module\Controller\Adminhtml;

use Magento\Framework\Exception\LocalizedException;

class Save extends \Magento\Backend\App\Action
{
    protected $dataPersistor;

    public function __construct(
        \Magento\Backend\App\Action\Context $context,
        \Magento\Framework\App\Request\DataPersistorInterface $dataPersistor
    ) {
        $this->dataPersistor = $dataPersistor;
        parent::__construct($context);
    }

    public function execute()
    {
        ...
        ...
        $data = $this->_filterFoodData($data);
        $model->setData($data);
        $model->save();
        ...
        ...     
    }

    public function _filterFoodData(array $rawData)
    {
        //Replace icon with fileuploader field name
        $data = $rawData;
        if (isset($data['icon'][0]['name'])) {
            $data['icon'] = $data['icon'][0]['name'];
        } else {
            $data['icon'] = null;
        }
        return $data;
    }
}

ফর্ম সম্পাদনা পৃষ্ঠায় আপলোড করা চিত্রটি দেখানোর জন্য:

অ্যাপ্লিকেশন / কোড / বিক্রেতা / মডিউল / মডেল / DataProvider.php

<?php

namespace Vendor\Module\Model;

use Magento\Store\Model\StoreManagerInterface;

class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
{
    ...
    ...

    public function getData()
    {
        ...
        ...
        $items = $this->collection->getItems();

        //Replace icon with fileuploader field name
        foreach ($items as $model) {
            $this->loadedData[$model->getId()] = $model->getData();
            if ($model->getIcon()) {
                $m['icon'][0]['name'] = $model->getIcon();
                $m['icon'][0]['url'] = $this->getMediaUrl().$model->getIcon();
                $fullData = $this->loadedData;
                $this->loadedData[$model->getId()] = array_merge($fullData[$model->getId()], $m);
            }
        }
        ...
        ...

        return $this->loadedData;
    }

    public function getMediaUrl()
    {
        $mediaUrl = $this->storeManager->getStore()
            ->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA).'faq/tmp/icon/';
        return $mediaUrl;
    }
}

এর জন্য আপনাকে অনেক ধন্যবাদ, সত্যই এটি প্রশংসা করুন। তবে আমি যখন আপনার সমাধানটি প্রয়োগ করি এবং একটি চিত্র আপলোড করি তখন ক্রোমের কনসোলে আমার ফিরে আসা প্রতিক্রিয়াটি হ'ল: error "ত্রুটি": "$ _ ফাইলগুলির অ্যারেটি খালি", "ত্রুটি কোড": 0}} ফাইল আপলোড করা হয়নি (আমি chmod চেক করেছি) এবং অবশ্যই পূর্বরূপ দেখাতে পারে না।
হলিওরন

1
আসলে আমি আপনার কোডের সাহায্যে অবশেষে এটি কাজ করেছিলাম। তাই আপনাকে অনেক ধন্যবাদ! আপনি আমার নায়ক! :-)
10-18

আপনাকে সর্বাধিক স্বাগতম :)
যুবরাজ প্যাটেল

@ প্রিন্সপ্যাটেল এটি কেবল দুর্দান্ত, তবে ধরে নিয়েছি আমার একটি সম্পাদনা ফর্ম রয়েছে, কীভাবে আমি চিত্র সরবরাহকারীর
গেটডাটা

1
@ প্রিন্সপ্যাটেল আমি ম্যাজেন্টো ২.৩ এ কাজ করছি এবং ডি.এক্সএমএল থেকে "ইমেজআপলোডার" কল করছি এবং বেস ট্যাম্পপ্যাথ, বেসপ্যাথ এবং অনুমতিপ্রাপ্ত এক্সটেনশনগুলি প্যারাম পাঠাচ্ছি। এখন আমার মডেল "ইমেজআপলোডার" একটি ত্রুটি ছুড়ে ফেলেছে "ব্যতিক্রম # 0 (BadMethodCallException): অনুপস্থিত আর্গুমেন্ট $ baseTmpPath" অনুপস্থিত। "ইমেজআপলোডার" মডেলটির কনস্ট্রাক্টর ফাংশনটি স্থিতিশীলভাবে সেট করার পরিবর্তে di.xML থেকে কীভাবে পরিচালনা করবেন আপনি দয়া করে আমাকে সহায়তা করতে পারেন?
ধড়া ভাট্টি

6

ম্যাজেন্টো ২.২ ইউআই উপাদানগুলির পরিপূরক

ম্যাজেন্টো ২.১ এর সাথে তুলনা করুন, ম্যাজেন্টো ২.২-তে , ইউআই উপাদানটির নীচের মতো কিছু alচ্ছিক পার্থক্য রয়েছে । আমরা অফিসিয়ালটিকে Magento_Catalog/image-previewপূর্বরূপ মন্দির হিসাবে ব্যবহার করতে পারি এবং নিয়ামকের মতো বাকী কোডগুলি গৃহীত উত্তরের উল্লেখ করতে পারে ।

<field name="image" formElement="fileUploader">
    <settings>
        <notice translate="true">Allowed file types: jpg, jpeg, gif, png.</notice>
        <label translate="true">Image</label>
        <componentType>fileUploader</componentType>
    </settings>
    <formElements>
        <fileUploader>
            <settings>
                <allowedExtensions>jpg jpeg gif png</allowedExtensions>
                <maxFileSize>10240000</maxFileSize>
                <placeholderType>image</placeholderType>
                <previewTmpl>Magento_Catalog/image-preview</previewTmpl>
                <uploaderConfig>
                    <param xsi:type="string" name="url">path/to/controller</param>
                </uploaderConfig>
            </settings>
        </fileUploader>
    </formElements>
</field>

1
আমি ত্রুটি পেয়েছি TypeError: value.map is not a function। আমি কীভাবে এটি ঠিক করতে পারি
নেরো ফুং

@ নেরোফং হাই, দয়া করে এই সমাধানটি চেষ্টা করুন magento.stackexchange.com/q/138642/44237
কী শ্যাং

আমি এই পোস্টটি অনুসরণ করে নিজেই এই সমস্যাটি করেছি। সমর্থনের জন্য ধন্যবাদ!
নিরো ফুং

@KeyShang, আপনার কোড, কিভাবে এবং কোথায় আমি চিত্রের জন্য বৈধতা করা ক্ষেত্র uploder ইন
Jaisa

@ শ্রী আমি আপনার প্রশ্নটি দেখতে পাচ্ছি, আমি আপনার প্রশ্নের উত্তরটি দিয়ে দেব magento.stackexchange.com/questions/211957/… , আমাকে কিছু সময় দিন।
কী শ্যাং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.