Ich erstelle ein CRUD-Modul für Magento 2 unter Verwendung von UI-Komponenten für die Administratorliste und das Formular, und eine meiner Entitäten verfügt über ein Bildfeld.
Aber ich kann es nicht so machen, wie es sollte.
So sollte es funktionieren.
Im Hinzufügungs- oder Bearbeitungsmodus ohne hochgeladenes Bild sollte es wie eine einfache Dateieingabe aussehen.
Wenn eine Datei hochgeladen wird, sollte die Bildvorschau und ein Löschfeld darunter angezeigt werden.
Ich suche nicht genau diesen Entwurf. Es könnte anders aussehen, aber die gleiche Funktionalität haben.
In Magento 1 konnte ich dies tun, indem ich meinen eigenen Block-Renderer erstellte
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;
}
}
Und dies in meinem Formularblock hinzufügen
$fieldset->addType(
'image',
Mage::getConfig()->getBlockClassName('{{namespace}}_{{module}}/adminhtml_{{entity}}_helper_image')
);
Ich habe aber keinen Formularblock in Magento 2.
Ich weiß, dass ich einen Klassennamen für ein Formularfeld in der UI-Komponentendatei verwenden kann
<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>
Natürlich muss ich diese Klasse erstellen, aber was soll ich erweitern?
Ich weiß nur, dass ich das Interface implementieren muss, Magento\Framework\View\Element\UiComponentInterface
aber ich habe nichts gefunden, was ich erweitern könnte.
Meine eigentliche Frage lautet also: Kann ich eine Klasse erweitern, um das gewünschte Verhalten zu erreichen? Wenn nicht, wie kann ich diesen Elementrenderer erstellen?
quelle
Antworten:
Ich habe einen Weg gefunden, dies zu tun, ohne dass eine Klasse an das Feld angehängt werden muss. Ich meine, es gibt eine Klasse, die an das Formularelement angehängt ist, aber nicht als Renderer.
Die Spalte sollte folgendermaßen definiert sein:
Ich musste auch die Vorschau-Vorlagendatei erstellen, auf die von verwiesen wird
[Namespace]_[Module]/image-preview
.Das
app/code/[Namespace]/[Module]/view/adminhtml/web/template/image-preview.html
sieht so aus:Dieser Code generiert ein Feld wie das folgende:
Nach dem Hochladen eines Bildes (in Echtzeit) sieht es so aus:
Das
url
Element in deruploaderConfig
ist die URL, unter der das Bild beim Hochladen veröffentlicht wird. Also musste ich das auch schaffen:Diese Klasse verwendet eine
[Namespace]\[Module]\Model\ImageUploader
ähnliche Instanz wie\Magento\Catalog\Model\ImageUploader
.Das scheint zu funktionieren. Ich habe immer noch Probleme, das Bild in der Datenbank zu speichern, aber das ist ein ganz anderes Problem.
Ich habe als Inspiration das
image
Feld für die Kategorie Entität verwendetquelle
Ja, die Klasse, die Sie erweitern sollten, ist
\Magento\Ui\Component\Form\Element\AbstractElement
.Diese Klasse implementiert die
ElementInterface
Erweiterung, auf dieUiComponentInterface
Sie sich beziehen.Wenn Sie außerdem die unter deklarierten Komponenten überprüfen
Magento\Ui\Component\Form\Element
, können Sie feststellen, dass sie alle diese Klasse erweitern.Der Grund, warum ich diese Klasse wählen würde, ist, dass die(Dies ist eigentlich eine Instanzrender
Methode\Magento\Backend\Block\Widget\Form\Renderer\Element
nur einen solchen Klassentyp akzeptiert:Magento\Framework\Data\Form\Element\AbstractElement
, die akzeptiert wird, nicht\Magento\Ui\Component\Form\Element\AbstractElement
)quelle