Tentang tombol formulir backend Magento2 "Simpan", "SaveAndContinue"

8

Untuk membuat formulir backend melalui ui_component, saya mendefinisikan berikut ini di file konfigurasi untuk menampilkan tombol simpan dan simpanAndContinue Button

<item name="buttons" xsi:type="array">
    <item name="save" xsi:type="string">namespace\module\Block\Adminhtml\Edit\SaveButton</item>
    <item name="save_and_continue" xsi:type="string">namespace\module\Block\Adminhtml\Edit\SaveAndContinueButton</item>
</item>

Masing-masing, dua file SaveButton.phpdan SaveAndContinueButton.phpdibuat dan keduanya diimplementasikanButtonProviderInterface

Seperti yang saya tahu, tombol terutama ditampilkan dari suatu getButtonDatafungsi. LihatSaveAndContinueButton.php

public function getButtonData()
{
    $TodoItemId = $this->getTodoItemId();
    $data = [];
    if ($TodoItemId) {
        $data = [
            'label' => __('Save and Continue Edit'),
            'class' => 'save',
            'data_attribute' => [
                'mage-init' => [
                    'button' => ['event' => 'saveAndContinueEdit'],
                ],
            ],
            'sort_order' => 80,
        ];
    }
    return $data;
}

Di data_attributesitulah saya tidak mengerti. Bagaimana cara mengetahui file mana yang akan menangani permintaan simpan?

Jika kami memeriksa SaveButton.php, Kami melihat

$data = [
    'label' => __('Save TodoItem'),
    'class' => 'save primary',
    'data_attribute' => [
        'mage-init' => ['button' => ['event' => 'save']],
        'form-role' => 'save',
    ],
    'sort_order' => 90,
];

Saya tahu di file konfigurasi ui_component, ada

<item name="submit_url" xsi:type="url" path="path/to/save"/>

Kedua aksi berhasil mengeksekusi Save.phpfile yang sama dan masuk akal. Yang paling membingungkan saya adalah data_attributedan bagaimana cara SaveAndContinueButton melewati parameter " back" sehingga ia tahu untuk tetap di halaman yang sama alih-alih pergi ke kisi (biasanya kisi adalah titik masuk suatu formulir, alias sunting halaman).

Jika kita melihat lagi deleteButton, itu pemandangan lain

$data = [
    'label' => __('Delete'),
    'class' => 'delete',
    'on_click' => 'deleteConfirm(\'' . __(
        'Are you sure you want to do this?'
    ) . '\', \'' . $this->getDeleteUrl() . '\')',

    'sort_order' => 20,
];

Ini secara langsung mengeksekusi event onClick JavaScript. Setiap ide / saran akan dihargai. Terima kasih

Satu pertanyaan lagi: apa bedanya data_attributedan on_click? atau menguntungkan satu sama lain?

Nero
sumber
Saya telah menyimpan dan melanjutkan, tetapi pengalihan ke halaman admin
magento
Apa file yang diperlukan untuk menambahkan simpan dan lanjutkan
Jaisa

Jawaban:

8

Saya tidak punya penjelasan lengkap, tapi saya punya ide.
Semua elemen yang diberikan dengan mage-initkehendak / harus ditangani oleh beberapa kode javascript.
Anda menautkan tombol-tombol ini ke formulir, dan formulir ditangani oleh file js ini di lib/web/mage/backend/form.jsmana widget jquery ui dibuat.

Ini adalah opsi untuk widget

options: {
    handlersData: {
        save: {},
        saveAndContinueEdit: {
            action: {
                args: {
                    back: 'edit'
                }
            }
        },
        preview: {
            target: '_blank'
        }
    }
},

Anda dapat melihat saveAndContinueEditdi sana di suatu tempat di dalam handlersData.
Mencari penggunaan handlersData Anda berakhir di _beforeSubmittempat beberapa keajaiban terjadi (saya tidak benar-benar mengerti segalanya di sana), dan pada satu titik _processDatadisebut.
Pindah ke _processDataAnda akan melihat sesuatu seperti ini

if (attrName === 'action') {
    data[attrName] = this._getActionUrl(attrValue);
}

ini berarti bahwa actionformulir diubah berdasarkan tombol yang ditekan.

yang _getActionUrlfungsi terlihat seperti ini

_getActionUrl: function(data) {
    if ($.type(data) === 'object') {
        return this._buildURL(this.oldAttributes.action, data.args);
    } else {
        return $.type(data) === 'string' ? data : this.oldAttributes.action;
    }
},

Anda bisa lihat di sana data.argsterlibat. Variabel yang sama dalam opsi widget untuk saveAndContinueEdit.

Kesimpulan: Ketika Anda mengatur peran ke saveAndContinueEdittombol kirim, aksi formulir diubah melalui js dan back/editditambahkan ke url.

on_clickditransformasikan ke onclickacara tersebut dan hanya disebut.
Jujur saya tidak tahu mengapa ada 2 cara untuk melakukan ini. Mungkin deletetindakan belum di refactored.

Marius
sumber