Estou construindo um módulo CRUD para Magento 2 usando componentes da interface do usuário para a lista e o formulário de administração e uma das minhas entidades possui um campo de imagem.
Mas não posso fazê-lo funcionar como deveria.
Aqui está como deve funcionar.
Quando no modo de adição ou no modo de edição, sem imagem carregada, deve parecer uma simples entrada de arquivo.
Quando um arquivo é carregado, ele deve mostrar a visualização da imagem e uma caixa de exclusão abaixo.
Não estou procurando exatamente esse design. Pode parecer diferente, mas tem a mesma funcionalidade.
No Magento 1 eu pude fazer isso, apenas criando meu próprio renderizador de bloco
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;
}
}
E adicionando isso no meu bloco de formulário
$fieldset->addType(
'image',
Mage::getConfig()->getBlockClassName('{{namespace}}_{{module}}/adminhtml_{{entity}}_helper_image')
);
Mas não tenho nenhum bloco de formulário no Magento 2.
Sei que posso usar um nome de classe para um campo de formulário no arquivo de componentes da interface do usuário
<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>
Obviamente eu tenho que criar essa classe, mas o que devo estender?
Tudo o que sei é que preciso implementar a interface, Magento\Framework\View\Element\UiComponentInterface
mas não encontrei nada que pudesse estender.
Portanto, minha verdadeira pergunta é: Posso estender algumas aulas para alcançar o comportamento desejado? Caso contrário, como posso começar a criar esse elemento renderizador?
fonte
Respostas:
Eu encontrei uma maneira de fazer isso sem exigir uma classe anexada ao campo. Quero dizer, há uma classe anexada ao elemento do formulário, mas não como renderizador.
A coluna deve ser definida como esta:
Eu também precisava criar o arquivo de modelo de visualização mencionado por
[Namespace]_[Module]/image-preview
.Isso é
app/code/[Namespace]/[Module]/view/adminhtml/web/template/image-preview.html
assim:Este código irá gerar um campo como este:
Após o upload de uma imagem (em tempo real), fica assim:
O
url
item dentro douploaderConfig
é o URL em que a imagem é postada quando carregada. Então, eu precisava criar isso também:Esta classe usa uma instância
[Namespace]\[Module]\Model\ImageUploader
semelhante a\Magento\Catalog\Model\ImageUploader
.Isso parece funcionar. Ainda tenho problemas para salvar a imagem no banco de dados, mas essa é uma questão totalmente diferente.
Usei como inspiração o
image
campo para a entidade de categoriafonte
Sim, a classe que você deve estender é
\Magento\Ui\Component\Form\Element\AbstractElement
.Esta classe implementa o
ElementInterface
que em si estende o queUiComponentInterface
você está se referindo.Além disso, se você verificar os componentes declarados abaixo,
Magento\Ui\Component\Form\Element
poderá ver que todos eles estendem essa classe.A razão pela qual eu escolheria essa classe é porque o(Esta é realmente uma instânciarender
método\Magento\Backend\Block\Widget\Form\Renderer\Element
aceita apenas esse tipo de classe:Magento\Framework\Data\Form\Element\AbstractElement
que é aceita, não\Magento\Ui\Component\Form\Element\AbstractElement
)fonte