Add below code in app\code\Vendor\ModuleName\Block\Adminhtml\Module\Edit.php
in _construct()
protected function _construct(){
$this->addButton(
'delete',
[
'label' => __('Delete'),
'onclick' => 'deleteConfirm(' . json_encode(__('Are you sure you want to do this?'))
. ','
. json_encode($this->getDeleteUrl()
)
. ')',
'class' => 'scalable delete',
'level' => -1
]
);
}
Below will be your delete action.
/**
* @param array $args
* @return string
*/
public function getDeleteUrl(array $args = [])
{
$params = array_merge($this->getDefaultUrlParams(), $args);
return $this->getUrl('module/*/delete', $params);
}
I don't have a full explanation, but I have an idea.
All elements rendered with mage-init
will/should be handled by some javascript code.
You are linking these buttons to a form, and the form is handled by this js file lib/web/mage/backend/form.js
where a jquery ui widget is created.
These are the options for the widget
options: {
handlersData: {
save: {},
saveAndContinueEdit: {
action: {
args: {
back: 'edit'
}
}
},
preview: {
target: '_blank'
}
}
},
you can see a saveAndContinueEdit
in there somewhere inside handlersData
.
Looking for the usages of handlersData
you end up in _beforeSubmit
where some magic happens (I don't really understand everything in there), and at one point _processData
is called.
Moving to _processData
you will see something like this
if (attrName === 'action') {
data[attrName] = this._getActionUrl(attrValue);
}
this means that the action
of the form is changed based on the button pressed.
the _getActionUrl
function looks like this
_getActionUrl: function(data) {
if ($.type(data) === 'object') {
return this._buildURL(this.oldAttributes.action, data.args);
} else {
return $.type(data) === 'string' ? data : this.oldAttributes.action;
}
},
you can see in there data.args
involved. The same variable in the widget options for saveAndContinueEdit
.
Conclusion: When you set the role saveAndContinueEdit
toa submit button, the action of the form is changed via js and back/edit
is added to the url.
on_click
is transformed to the onclick
event and simply called.
I honestly have no idea why there are 2 ways of doing this. Maybe the delete
actions didn't get refactored yet.
Best Answer
please try:
Add javascript to content:
You can change Magento\Framework\View\Element\Template to your block
script.phtml (templates/script.phtml):