Magento2: Mô-đun quản trị Mã tải lên hình ảnh để hiển thị mẫu


7

Tôi có mô-đun tùy chỉnh quản trị viên magento2 với chức năng tải lên hình ảnh. Tôi muốn tải lên hình ảnh từ quản trị viên. mã nào nên áp dụng cho trường hình ảnh hiển thị từ, tải lên hình ảnh, cũng hiển thị hình ảnh trong hành động chỉnh sửa.

Cảm ơn

Đường dẫn tập tin : app\code\[Vendor]\[Module]\Block\Adminhtml\Emp\Edit\Tab\Main.php

    /**
     * Prepare form
     *
     * @return $this
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
    */
    protected function _prepareForm()
    {
        $model = $this->_coreRegistry->registry('emp_post');

        $isElementDisabled = false;

        /** @var \Magento\Framework\Data\Form $form */
        $form = $this->_formFactory->create();

        $form->setHtmlIdPrefix('page_');

        $fieldset = $form->addFieldset('base_fieldset', ['legend' => __('Employee Information')]);

        if ($model->getId()) {
            $fieldset->addField('customer_id', 'hidden', ['name' => 'customer_id']);
        }

        $fieldset->addField(
            'firstname',
            'text',
            [
                'name' => 'firstname',
                'label' => __('First Name'),
                'title' => __('First Name'),
                'required' => true,
                'disabled' => $isElementDisabled,
                'value' =>'abc'
            ]
        );

        $fieldset->addField(
            'lastname',
            'text',
            [
                'name' => 'lastname',
                'label' => __('Last Name'),
                'title' => __('Last Name'),
                'required' => true,
                'disabled' => $isElementDisabled,
                'value' =>'abc'
            ]
        );

        $fieldset->addField(
            'email',
            'text',
            [
                'name' => 'email',
                'label' => __('Email Address'),
                'title' => __('Email Address'),
                'required' => true,
                'disabled' => $isElementDisabled,
                'value' =>'abc'
            ]
        );


        $fieldset->addField(
            'image',
            'image',
            array(
                'name' => 'image',
                'label' => __('Image'),
                'title' => __('Image')
            )
        );

        $fieldset->addField(
            'telephone',
            'text',
            [
                'name' => 'telephone',
                'label' => __('Telephone'),
                'title' => __('Telephone'),
                'required' => true,
                'disabled' => $isElementDisabled,
                'value' =>'abc'
            ]
        );

        $dateFormat = $this->_localeDate->getDateFormat(
            \IntlDateFormatter::SHORT
        );

        $fieldset->addField(
            'dob',
            'date',
            [
                'name' => 'dob',
                'label' => __('Date of birth'),
                'date_format' => $dateFormat,
                'disabled' => $isElementDisabled,
                'class' => 'validate-date validate-date-range date-range-custom_theme-from'
            ]
        );

        $fieldset->addField(
            'is_active',
            'select',
            [
                'label' => __('Status'),
                'title' => __('Status'),
                'name' => 'is_active',
                'required' => true,
                'options' => $this->_status->getOptionArray(),
                'disabled' => $isElementDisabled
            ]
        );
        if (!$model->getId()) {
            $model->setData('is_active', $isElementDisabled ? '0' : '1');
        }


        if($model->getData('image')){
            $model->setData('image','learning/images'.$model->getData('image'));
        }

        $form->setValues($model->getData());
        $this->setForm($form);

        return parent::_prepareForm();
    } 

Mô-đun được phát triển darshanbhavsar.wordpress.com/2015/02/11/magento-2-custom-module trông có mọi thứ bạn đang tìm kiếm.
Imran Zahoor

Câu trả lời:


18

Bạn cần tạo một lớp để xử lý trường tải lên hình ảnh của bạn và hiển thị hình ảnh một khi được tải lên.

Vì vậy, tạo [Namespace]\[Module]\Block\Adminhtml\[Entity]\Helper\Imagelớp

<?php
namespace [Namespace]\[Module]\Block\Adminhtml\[Entity]\Helper;
use Magento\Framework\Data\Form\Element\Image as ImageField;
use Magento\Framework\Data\Form\Element\Factory as ElementFactory;
use Magento\Framework\Data\Form\Element\CollectionFactory as ElementCollectionFactory;
use Magento\Framework\Escaper;
use [Namespace]\[Module]\Model\[Entity]\Image as [Entity]Image;
use Magento\Framework\UrlInterface;

/**
 * @method string getValue()
 */
class Image extends ImageField
{
    /**
     * image model
     *
     * @var \[Namespace]\[Module]\Model\[Entity]\Image
     */
    protected $imageModel;

    /**
     * @param [Entity]Image $imageModel
     * @param ElementFactory $factoryElement
     * @param ElementCollectionFactory $factoryCollection
     * @param Escaper $escaper
     * @param UrlInterface $urlBuilder
     * @param array $data
     */
    public function __construct(
        [Entity]Image $imageModel,
        ElementFactory $factoryElement,
        ElementCollectionFactory $factoryCollection,
        Escaper $escaper,
        UrlInterface $urlBuilder,
        $data = []
    )
    {
        $this->imageModel = $imageModel;
        parent::__construct($factoryElement, $factoryCollection, $escaper, $urlBuilder, $data);
    }
    /**
     * Get image preview url
     *
     * @return string
     */
    protected function _getUrl()
    {
        $url = false;
        if ($this->getValue()) {
            $url = $this->imageModel->getBaseUrl().$this->getValue();
        }
        return $url;
    }
}

sau đó tạo lớp sẽ giúp bạn truy xuất đường dẫn tải lên hình ảnh và tải lên thư mục

<?php
namespace [Namespace]\[Module]\Model\[Entity];
use Magento\Framework\UrlInterface;
use Magento\Framework\Filesystem;
use Magento\Framework\App\Filesystem\DirectoryList;
class Image
{
    /**
     * media sub folder
     * @var string
     */
    protected $subDir = '[namespace]/[module]/[entity]';
    /**
     * url builder
     *
     * @var \Magento\Framework\UrlInterface
     */
    protected $urlBuilder;
    /**
     * @var \Magento\Framework\Filesystem
     */
    protected $fileSystem;
    /**
     * @param UrlInterface $urlBuilder
     * @param Filesystem $fileSystem
     */
    public function __construct(
        UrlInterface $urlBuilder,
        Filesystem $fileSystem
    )
    {
        $this->urlBuilder = $urlBuilder;
        $this->fileSystem = $fileSystem;
    }
    /**
     * get images base url
     *
     * @return string
     */
    public function getBaseUrl()
    {
        return $this->urlBuilder->getBaseUrl(['_type' => UrlInterface::URL_TYPE_MEDIA]).$this->subDir.'/image';
    }
    /**
     * get base image dir
     *
     * @return string
     */
    public function getBaseDir()
    {
        return $this->fileSystem->getDirectoryWrite(DirectoryList::MEDIA)->getAbsolutePath($this->subDir.'/image');
    }
}

bây giờ trong phần chỉnh sửa của bạn cho tab, hãy thêm cái này vào phương thức _prepareFormngay sau khi khai báo bộ trường

$fieldset->addType('image', '\[Namespace]\[Module]\Block\Adminhtml\[Entity]\Helper\Image');

và thêm trường hình ảnh của bạn như thế này

$fieldset->addField(
    'image_field_name',
    'image',
    [
        'name'        => 'image_field_name',
        'label'       => __('Image field Label'),
        'title'       => __('Image field Label'),
    ]
);

Trong trình điều khiển lưu thực thể của bạn, bạn cần tiêm vào hàm tạo các lớp sau

Magento\MediaStorage\Model\File\UploaderFactory[Namespace]\[Module]\Model\[Entity]\Image

Vì vậy, làm cho lớp học của bạn trông như thế này

<?php
use Magento\Framework\Exception\LocalizedException as FrameworkException;

class ....

protected $uploaderFactory;
protected $imageModel;

public function __construct(
    ....
    \Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory,
    \[Namespace]\[Module]\Model\[Entity]\Image $imageModel,
    ....
){
    ...
    $this->uploaderFactory = $uploaderFactory;
    $this->imageModel = $imageModel;
    ...
}

Bây giờ, trong cùng một bộ điều khiển thêm cái này, trước khi gọi $[entity]->save()

$imageName = $this->uploadFileAndGetName('image_field_name', $this->imageModel->getBaseDir(), $data);
$[entity]->setImageFieldName($imageName);

và tạo phương thức này:

public function uploadFileAndGetName($input, $destinationFolder, $data)
{
    try {
        if (isset($data[$input]['delete'])) {
            return '';
        } else {
            $uploader = $this->uploaderFactory->create(['fileId' => $input]);
            $uploader->setAllowRenameFiles(true);
            $uploader->setFilesDispersion(true);
            $uploader->setAllowCreateFolders(true);
            $result = $uploader->save($destinationFolder);
            return $result['file'];
        }
    } catch (\Exception $e) {
        if ($e->getCode() != \Magento\Framework\File\Uploader::TMP_NAME_EMPTY) {
            throw new FrameworkException($e->getMessage());
        } else {
            if (isset($data[$input]['value'])) {
                return $data[$input]['value'];
            }
        }
    }
    return '';
}

Một ví dụ đầy đủ về cách tạo một thực thể hỗ trợ tải lên hình ảnh và tệp (nó hơi khác so với mô tả ở đây vì nó có chứa một lớp bổ sung để tải lên) có thể được tìm thấy ở đây


cho phép mở rộng url không hoạt động. nó gây ra lỗi ngoại lệ trên màn hình 'Magento \ Framework \ Exception \ LocalizedException' với thông báo 'Lớp nguồn "\ Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ Collection" cho "Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ CollectionFactory "thế hệ không tồn tại. '
Suresh Chikani

@SHPatel. Xóa nội dung của var / thế hệ. Nếu vấn đề này vẫn còn có thể vì 2 lý do. Bạn không có phiên bản Magento 2 mới nhất hoặc tiện ích mở rộng của tôi không hoạt động trên phiên bản mới nhất. Nếu vấn đề là phần mở rộng của tôi, tôi sẽ kiểm tra nó khi tôi có thời gian.
Marius

@Marius, Làm thế nào chúng ta cũng có thể hiển thị hình ảnh như vậy vào adminhtml Gridphần? Ngay bây giờ là Mặc định magento 2 đang hiển thị cho Product Grid.
Rajput đáng khen ngợi

@PrafulRajput. Tôi đã không được kiểm tra phần đó chưa. Tôi không biết làm thế nào nó được thực hiện.
Marius

@marius điều này hoạt động trong RC 2. Một điều bạn đề cập đến khi thêm $ fieldset-> addType ('image', '[Namespace] [Module] \ adminhtml [Entity] \ Helper \ Image'); Tôi khá chắc chắn rằng bạn đang thiếu một chú thích "Chặn". [Không gian tên] [Mô-đun] \ Chặn \ adminhtml [Thực thể] \ Người trợ giúp \ Hình ảnh
Eirik

3

Mô-đun quản trị cho tin tức bổ sung / cập nhật cơ bản có ở đây . Trong trường hợp bạn đang tìm kiếm giải pháp tải lên hình ảnh đơn giản, hãy xem đoạn trích sau được lấy từ liên kết .

use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Backend\App\Action;
protected $_fileUploaderFactory;
public function __construct(
    \Magento\MediaStorage\Model\File\UploaderFactory $fileUploaderFactory,
    Action\Context $context     
) {
    $this->_fileUploaderFactory = $fileUploaderFactory;
    parent::__construct($context);
}
public function execute(){
    $uploader = $this->_fileUploaderFactory->create(['fileId' => 'image']);
    $uploader->setAllowedExtensions(['jpg', 'jpeg', 'gif', 'png']);
    $uploader->setAllowRenameFiles(false);
    $uploader->setFilesDispersion(false);
    $path = $this->_objectManager->get('Magento\Framework\Filesystem')->getDirectoryRead(DirectoryList::MEDIA)
    ->getAbsolutePath('images/');
    $uploader->save($path);
}

_filesystem không bị chặn :(
fudu

tìm thấy nó, chúng ta cần thêm cái này để làm việc, đồng thời tạo nó trong hàm construc () cũng như sử dụng \ Magento \ Framework \ Filesystem;
fudu

Thay thế _filesystem bằng $ this -> _ objectManager-> get ('Magento \ Framework \ Filesystem')
divya sekar

@divyasekar Bạn có thể vui lòng trả lời câu hỏi này không? -> magento.stackexchange.com/questions/287175/ từ
Kowsigan Atsayam

1

Bạn có thể thêm trường hình ảnh trong phương thức _prepareForm () của biểu mẫu quản trị viên của bạn:

$fieldset->addField(
    'imagefieldname',
    'image',
    array(
        'name' => 'imagefieldname',
        'label' => __('Image'),
        'title' => __('Image')
    )

  );

1
@chanresh trường hình ảnh được thêm vào nhưng tôi cần hiển thị xem trước hình ảnh trên biểu mẫu.
Suresh Chikani

1
Nếu bạn tải lên hình ảnh và lưu bản ghi thì nó sẽ hiển thị hình thu nhỏ nhỏ gần trường tệp nhập "Chọn tệp".
Chandresh P.

1
Tôi có hình ảnh uplode và lưu nó nhưng hình thu nhỏ không thể hiển thị.
Suresh Chikani

Vui lòng thêm đoạn mã của bạn cho _prepareForm ().
Chandresh P.

kiểm tra câu hỏi của tôi, câu hỏi được cập nhật với _prepareForm ().
Suresh Chikani

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.