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\UiComponentInterface
pero 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.html
que se ve así:Este código generará un campo como este:
Después de cargar una imagen (en tiempo real) se ve así:
El
url
elemento dentro deuploaderConfig
es la url donde se publica la imagen cuando se carga. Entonces necesitaba crear esto también:Esta clase usa una instancia
[Namespace]\[Module]\Model\ImageUploader
similar 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
image
campo para la entidad de categoríafuente
Sí, la clase que debes extender es
\Magento\Ui\Component\Form\Element\AbstractElement
.Esta clase implementa lo
ElementInterface
que se extiende a loUiComponentInterface
que 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 derender
método de\Magento\Backend\Block\Widget\Form\Renderer\Element
solo acepta dicho tipo de clase:Magento\Framework\Data\Form\Element\AbstractElement
eso es aceptado, no\Magento\Ui\Component\Form\Element\AbstractElement
)fuente