Je crée un module CRUD pour Magento 2 en utilisant des composants d'interface utilisateur pour la liste et le formulaire d'administration et l'une de mes entités a un champ d'image.
Mais je ne peux pas le faire fonctionner comme il se doit.
Voici comment cela devrait fonctionner.
En mode ajout ou en mode édition sans image téléchargée, cela devrait ressembler à une simple entrée de fichier.
Lorsqu'un fichier est téléchargé, il doit afficher l'aperçu de l'image et une zone de suppression en dessous.
Je ne cherche pas exactement ce design. Il pourrait avoir un aspect différent mais avoir les mêmes fonctionnalités.
Dans Magento 1, j'ai pu le faire, simplement en créant mon propre rendu de bloc
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;
}
}
Et en ajoutant ceci dans mon bloc de formulaire
$fieldset->addType(
'image',
Mage::getConfig()->getBlockClassName('{{namespace}}_{{module}}/adminhtml_{{entity}}_helper_image')
);
Mais je n'ai pas de bloc de formulaire dans Magento 2.
Je sais que je peux utiliser un nom de classe pour un champ de formulaire dans le fichier des composants de l'interface utilisateur
<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>
Évidemment, je dois créer cette classe, mais que dois-je étendre?
Tout ce que je sais, c'est que je dois implémenter l'interface Magento\Framework\View\Element\UiComponentInterface
mais je n'ai rien trouvé que je puisse étendre.
Ma vraie question est donc: puis-je étendre une classe pour obtenir le comportement souhaité? Sinon, comment puis-je commencer à créer ce rendu d'élément?
la source
Réponses:
J'ai trouvé un moyen de le faire sans avoir besoin d'une classe attachée au terrain. Je veux dire qu'il y a une classe attachée à l'élément de formulaire mais pas en tant que moteur de rendu.
La colonne doit être définie comme suit:
J'ai également dû créer le fichier de modèle d'aperçu référencé par
[Namespace]_[Module]/image-preview
.Voilà
app/code/[Namespace]/[Module]/view/adminhtml/web/template/image-preview.html
qui ressemble à ceci:Ce code va générer un champ comme celui-ci:
Après avoir téléchargé une image (en temps réel), elle ressemble à ceci:
L'
url
élément à l'intérieur de l'uploaderConfig
URL est l'URL où l'image est publiée lors du téléchargement. Je devais donc créer cela aussi:Cette classe utilise une instance
[Namespace]\[Module]\Model\ImageUploader
similaire à\Magento\Catalog\Model\ImageUploader
.Cela semble fonctionner. J'ai toujours des problèmes pour enregistrer l'image dans la base de données, mais c'est un problème totalement différent.
J'ai utilisé comme inspiration le
image
champ de l'entité catégoriela source
Oui, la classe à étendre est
\Magento\Ui\Component\Form\Element\AbstractElement
.Cette classe implémente le
ElementInterface
qui lui-même étend le dontUiComponentInterface
vous parlez.En plus de cela, si vous vérifiez les composants déclarés sous,
Magento\Ui\Component\Form\Element
vous pouvez voir qu'ils étendent tous cette classe.La raison pour laquelle je choisirais cette classe est que la(Ceci est en fait une instancerender
méthode\Magento\Backend\Block\Widget\Form\Renderer\Element
accepte uniquement ce type de classe:Magento\Framework\Data\Form\Element\AbstractElement
qui est acceptée, non\Magento\Ui\Component\Form\Element\AbstractElement
)la source