Magento 2 создайте миниатюру атрибута категории и загрузите изображение с помощью компонента загрузки файлов


Я создал пользовательский модуль для отображения миниатюр категорий. Я читал magento dev doc Он отображается в разделе "Моя категория" с помощью category_form.xml

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="content">
        <field name="thumbnail">
            <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">category</item>
                    <item name="label" xsi:type="string" translate="true">Thumbnail 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">Magento_Catalog/image-preview</item>
                    <item name="required" xsi:type="boolean">false</item>
                    <item name="sortOrder" xsi:type="number">30</item>
                    <item name="uploaderConfig" xsi:type="array">
                        <item name="url" xsi:type="url" path="categorylist/category_thumbnailimage/upload"/>
                    </item>
                </item>
            </argument>
        </field>
    </fieldset>
</form>

Когда я загружаю изображение, я показываю следующую ошибку

1 exception(s):
Exception #0 (BadMethodCallException): Missing required argument $baseTmpPath of Magento\Catalog\Model\ImageUploader.

Exception #0 (BadMethodCallException): Missing required argument $baseTmpPath of Magento\Catalog\Model\ImageUploader.

Мой файл контроллера

<?php

namespace Company\Categorylist\Controller\Adminhtml\Category\Thumbnailimage;

use Magento\Framework\Controller\ResultFactory;

/**
 * Class Upload
 */
class Upload extends \Magento\Backend\App\Action
{
    protected $baseTmpPath;
      /**
     * Image uploader
     *
     * @var \Magento\Catalog\Model\ImageUploader
     */
    protected $imageUploader;

    /**
     * Upload constructor.
     *
     * @param \Magento\Backend\App\Action\Context $context
     * @param \Magento\Catalog\Model\ImageUploader $imageUploader
     */
    public function __construct(
        \Magento\Backend\App\Action\Context $context,
        \Magento\Catalog\Model\ImageUploader $imageUploader
    ) {
        $this->imageUploader = $imageUploader;
        parent::__construct($context);

    }
   public function execute() {
        try {
            $result = $this->imageUploader->saveFileToTmpDir('thumbnail');
            $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);
   }
}
Author: Pratik, 2016-08-04

3 answers

Вам нужно добавить это в di.xml вашего модуля.

<type name="Company\Categorylist\Controller\Adminhtml\Category\Thumbnailimage\Upload">
    <arguments>
        <argument name="imageUploader" xsi:type="object">Magento\Catalog\CategoryImageUpload</argument>
    </arguments>
</type>

Это необходимо, потому что зависимость вашего контроллера под названием imageUploader является экземпляром \Magento\Catalog\Model\ImageUploader. Это всего лишь общий класс для загрузки, для которого не заданы базовый путь и базовый путь tmp. Поэтому он не знает, куда загружать файлы.
Но в файле etc/di.xml модуля каталога у вас определен этот виртуальный тип:

<virtualType name="Magento\Catalog\CategoryImageUpload" type="Magento\Catalog\Model\ImageUploader">
    <arguments>
        <argument name="baseTmpPath" xsi:type="string">catalog/tmp/category</argument>
        <argument name="basePath" xsi:type="string">catalog/category</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>
</virtualType>

Это означает, что Magento\Catalog\CategoryImageUpload класс на самом деле не существует, но когда это используется вы на самом деле будете использовать экземпляр ожидаемого класса Magento\Catalog\Model\ImageUploader, но у него есть необходимые переменные члена (basePath, baseTmpPath и allowedExtensions) уже установлен.

 15
Author: Marius, 2016-08-04 05:49:30

Пожалуйста, проверьте эту проблему на github проблема с атрибутом изображения категории

 1
Author: Pratik, 2016-08-08 06:00:31

Если вы хотите создать собственные $BASETMPPATH и $basePath, то вам нужно будет сделать это после решения @Marius.
Положи это в свой Upload.php

public function execute()
{
    $imageId = $this->_request->getParam('param_name', 'image');

    try {
        $this->imageUploader->setBaseTmpPath('Aht_BannerSlider/tmp/images');
        $this->imageUploader->setBasePath('Aht_BannerSlider/images');
// some code ...

Например: Aht_BannerSlider - это имя моего модуля.
Спасибо @Marius

 0
Author: fudu, 2018-08-15 04:30:39