Я создаю модуль CRUD для Magento 2, используя компоненты пользовательского интерфейса для списка и формы администратора, и одна из моих сущностей имеет поле изображения.
Но я не могу заставить его работать как следует.
Вот как это должно работать.
В режиме добавления или в режиме редактирования без загруженного изображения это должно выглядеть как простой ввод файла.
Когда файл загружен, он должен показать предварительный просмотр изображения и поле для удаления под ним.
Я не ищу именно этот дизайн. Это может выглядеть по-другому, но иметь одинаковую функциональность.
В Magento 1 я смог сделать это, просто создав собственный блок рендеринга.
class {{Namespace}}_{{Module}}_Block_Adminhtml_{{Entity}}_Helper_Image extends Varien_Data_Form_Element_Image
{
protected function _getUrl()
{
$url = false;
if ($this->getValue()) {
$url = Mage::helper('{{namespace}}_{{module}}/{{entity}}_image')->getImageBaseUrl().$this->getValue();
}
return $url;
}
}
И добавив это в моей форме блока
$fieldset->addType(
'image',
Mage::getConfig()->getBlockClassName('{{namespace}}_{{module}}/adminhtml_{{entity}}_helper_image')
);
Но у меня нет блока формы в Magento 2.
Я знаю, что могу использовать имя класса для поля формы в файле компонентов пользовательского интерфейса
<field name="image" class="Class\Name\Here">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">Resume</item>
<item name="formElement" xsi:type="string">image</item>
<item name="source" xsi:type="string">[entity]</item>
<item name="dataScope" xsi:type="string">image</item>
</item>
</argument>
</field>
Очевидно, я должен создать этот класс, но что я должен расширить?
Все, что я знаю, это то, что мне нужно реализовать интерфейс, Magento\Framework\View\Element\UiComponentInterface
но я не нашел ничего, что мог бы расширить.
Итак, мой реальный вопрос: могу ли я расширить какой-то класс для достижения желаемого поведения? Если нет, как я могу начать создавать этот элемент рендерера?
источник
Ответы:
Я нашел способ сделать это, не требуя присоединения класса к полю. Я имею в виду, что есть класс, прикрепленный к элементу формы, но не как средство визуализации.
Столбец должен быть определен так:
Мне также нужно было создать файл шаблона предварительного просмотра, на который ссылается
[Namespace]_[Module]/image-preview
.Вот
app/code/[Namespace]/[Module]/view/adminhtml/web/template/image-preview.html
что выглядит так:Этот код сгенерирует поле вроде этого:
После загрузки изображения (в реальном времени) оно выглядит так:
url
Элемент внутриuploaderConfig
есть URL , где изображение размещено при загрузке. Так что мне нужно было создать это также:Этот класс использует экземпляр,
[Namespace]\[Module]\Model\ImageUploader
который похож на\Magento\Catalog\Model\ImageUploader
.Это швы на работу. У меня все еще есть проблемы с сохранением изображения в БД, но это совсем другая проблема.
Я использовал в качестве вдохновения
image
поле для объекта категорииисточник
Да, класс, который вы должны расширить, это
\Magento\Ui\Component\Form\Element\AbstractElement
.Этот класс реализует тот,
ElementInterface
который сам расширяет то, наUiComponentInterface
что вы ссылаетесь.Кроме того, если вы проверите компоненты, объявленные под,
Magento\Ui\Component\Form\Element
вы увидите, что они все расширяют этот класс.Причина, по которой я бы выбрал этот класс, заключается в том, что(Это на самом деле пример того,render
метод\Magento\Backend\Block\Widget\Form\Renderer\Element
принимает только такой тип класса:Magento\Framework\Data\Form\Element\AbstractElement
что принято, а не\Magento\Ui\Component\Form\Element\AbstractElement
)источник