Estoy construyendo un módulo CRUD para Magento 2 usando componentes ui para la lista y el formulario de administración y una de mis entidades tiene un campo de imagen.
Pero no puedo hacer que funcione como debería.
Así es como debería funcionar.
Cuando está en modo agregar o en modo edición sin imagen cargada, debería verse como una simple entrada de archivo.
Cuando se carga un archivo, debe mostrar la vista previa de la imagen y un cuadro de eliminación debajo de él.
No estoy buscando exactamente este diseño. Podría verse de manera diferente pero tener la misma funcionalidad.
En Magento 1 pude hacer esto, simplemente creando mi propio renderizador de bloques
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;
}
}
Y agregando esto en mi bloque de formulario
$fieldset->addType(
'image',
Mage::getConfig()->getBlockClassName('{{namespace}}_{{module}}/adminhtml_{{entity}}_helper_image')
);
Pero no tengo bloque de formulario en Magento 2.
Sé que puedo usar un nombre de clase para un campo de formulario en el archivo de componentes de la interfaz de usuario
<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 tengo que crear esta clase, pero ¿qué debo extender?
Todo lo que sé es que necesito implementar la interfaz Magento\Framework\View\Element\UiComponentInterfacepero no encontré nada que pueda extender.
Entonces, mi verdadera pregunta es: ¿Puedo extender alguna clase para lograr el comportamiento deseado? Si no, ¿cómo puedo comenzar a crear este renderizador de elementos?
fuente



Respuestas:
Encontré una manera de hacerlo sin requerir una clase adjunta al campo. Quiero decir que hay una clase adjunta al elemento de formulario pero no como un renderizador.
La columna debe definirse así:
También necesitaba crear el archivo de plantilla de vista previa al que hace referencia
[Namespace]_[Module]/image-preview.Eso es lo
app/code/[Namespace]/[Module]/view/adminhtml/web/template/image-preview.htmlque se ve así:Este código generará un campo como este:
Después de cargar una imagen (en tiempo real) se ve así:
El
urlelemento dentro deuploaderConfiges la url donde se publica la imagen cuando se carga. Entonces necesitaba crear esto también:Esta clase usa una instancia
[Namespace]\[Module]\Model\ImageUploadersimilar a\Magento\Catalog\Model\ImageUploader.Esto parece funcionar. Todavía tengo problemas para guardar la imagen en la base de datos, pero ese es un problema totalmente diferente.
Usé como inspiración el
imagecampo para la entidad de categoríafuente
Sí, la clase que debes extender es
\Magento\Ui\Component\Form\Element\AbstractElement.Esta clase implementa lo
ElementInterfaceque se extiende a loUiComponentInterfaceque se refiere.Además de eso, si marca los componentes declarados debajo
Magento\Ui\Component\Form\Element, puede ver que todos extienden esa clase.La razón por la que elegiría esta clase es porque el(Esto es realmente una instancia derendermétodo de\Magento\Backend\Block\Widget\Form\Renderer\Elementsolo acepta dicho tipo de clase:Magento\Framework\Data\Form\Element\AbstractElementeso es aceptado, no\Magento\Ui\Component\Form\Element\AbstractElement)fuente