Saya sedang membangun modul CRUD untuk Magento 2 menggunakan komponen ui untuk daftar dan formulir admin dan salah satu entitas saya memiliki bidang gambar.
Tetapi saya tidak bisa membuatnya berfungsi sebagaimana mestinya.
Inilah cara kerjanya.
Ketika dalam mode tambah atau mode edit tanpa gambar yang diunggah, tampilannya akan tampak seperti input file sederhana.
Ketika sebuah file diunggah, ia harus memperlihatkan pratinjau gambar dan kotak hapus di bawahnya.
Saya tidak mencari desain ini persis. Itu bisa terlihat berbeda tetapi memiliki fungsi yang sama.
Di Magento 1 saya bisa melakukan ini, hanya dengan membuat block renderer saya sendiri
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;
}
}
Dan menambahkan ini di blok formulir saya
$fieldset->addType(
'image',
Mage::getConfig()->getBlockClassName('{{namespace}}_{{module}}/adminhtml_{{entity}}_helper_image')
);
Tapi saya tidak punya blok formulir di Magento 2.
Saya tahu saya bisa menggunakan nama kelas untuk bidang formulir di file komponen ui
<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>
Jelas saya harus membuat kelas ini, tetapi apa yang harus saya sampaikan?
Yang saya tahu adalah saya perlu mengimplementasikan antarmuka Magento\Framework\View\Element\UiComponentInterface
tetapi saya tidak menemukan apa pun yang dapat saya kembangkan.
Jadi pertanyaan saya yang sebenarnya adalah: Dapatkah saya memperluas beberapa kelas untuk mencapai perilaku yang diinginkan? Jika tidak, bagaimana saya bisa mulai membuat elemen renderer ini?
sumber
Jawaban:
Saya menemukan cara untuk melakukannya tanpa memerlukan kelas yang terpasang di lapangan. Maksud saya ada kelas yang dilampirkan ke elemen form tetapi tidak sebagai renderer.
Kolom harus didefinisikan sebagai ini:
Saya juga perlu membuat file templat pratinjau yang direferensikan oleh
[Namespace]_[Module]/image-preview
.Itu
app/code/[Namespace]/[Module]/view/adminhtml/web/template/image-preview.html
yang terlihat seperti ini:Kode ini akan menghasilkan bidang seperti ini:
Setelah mengunggah gambar (waktu nyata) seperti ini:
The
url
Item dalamuploaderConfig
adalah url di mana foto tersebut diposting ketika upload. Jadi saya perlu membuat ini juga:Kelas ini menggunakan instance
[Namespace]\[Module]\Model\ImageUploader
yang mirip dengan\Magento\Catalog\Model\ImageUploader
.Ini bekerja. Saya masih kesulitan menyimpan gambar di db tapi itu masalah yang sama sekali berbeda.
Saya digunakan sebagai inspirasi
image
bidang untuk entitas kategorisumber
Ya, kelas yang harus Anda perpanjang adalah
\Magento\Ui\Component\Form\Element\AbstractElement
.Kelas ini mengimplementasikan yang
ElementInterface
mana itu sendiri memperluas yangUiComponentInterface
Anda maksud.Selain itu, jika Anda memeriksa komponen yang dideklarasikan di bawah
Magento\Ui\Component\Form\Element
Anda dapat melihat bahwa mereka semua memperluas kelas itu.Alasan saya memilih kelas ini adalah karena(Ini sebenarnya adalah contohrender
metode\Magento\Backend\Block\Widget\Form\Renderer\Element
hanya menerima jenis kelas seperti itu:Magento\Framework\Data\Form\Element\AbstractElement
yang diterima, bukan\Magento\Ui\Component\Form\Element\AbstractElement
)sumber