Magento 2.3 О массовых действиях как я могу обновить сетку списков с помощью ajax (без обновления страницы)
Как я вижу по умолчанию после применения массового действия magento2, логика по умолчанию заключается в обновлении страницы. Я хотел бы обновить сетку без фактической перезагрузки страницы, а скорее из js после завершения массового действия. Я успешно обновил сетку после добавления нового элемента с помощью своих пользовательских сценариев с использованием js, однако я не могу найти простой способ вызвать js для massaction, и, насколько я вижу, для massaction magento2 просто перенаправляю на фактическую страницу контроллера там действие случаться.
Вот часть моей таблицы списков для массового удаления (работает нормально, но с обновлением страницы)
<action name="massdelete">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">massdelete</item>
<item name="label" xsi:type="string" translate="true">Delete</item>
<item name="url" xsi:type="url" path="electroidlab/connect_ui/massDelete"/>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Attention</item>
<item name="message" xsi:type="string" translate="true">Are you sure want to delete?</item>
</item>
</item>
</argument>
Вот часть контроллера с перенаправлением. Если я прокомментирую часть перенаправления, то это будет просто белая страница с путем контроллера в URL
public function execute()
{
...
$collection = $this->filter
->getCollection(
$this->collectionFactory->create()
);
$catRecordDeleted = 0;
foreach ($collection as $category) {
$category->setId($category->getEntityId());
$category->delete();
++$catRecordDeleted;
}
$this->messageManager->addSuccess(
__("A total of %1 record(s) have been deleted.", $catRecordDeleted)
);
return $this->resultRedirectFactory->create()->setPath(
'electroidlab/connect/edit',
[
'id'=>$this->getRequest()->getParam('id'),
'_secure' => $this->getRequest()->isSecure()
]
);
...
}
Есть ли способ сделать массовое действие по умолчанию без фактического обновления страницы? Спасибо!
1 answers
Наконец-то удалось решить эту проблему. Магенто2 massactions.js запуск utils.submit в рамках метода обратного вызова по умолчанию:
defaultCallback: function (action, data) {
...
utils.submit({
url: action.url,
data: selections
});
}
Для того, чтобы сетка работала с ajax, мне нужно переопределить defaultCallback с помощью миксинов и изменить utils по умолчанию.отправить в utils.ajaxSubmit для моего пользовательского действия. Вот код для моего модуля requirejs-config.js
var config = {
config: {
mixins: {
'Magento_Ui/js/grid/massactions': {
'ElectroidLab_Custom/js/grid/massactions': true
}
}
}
}
Расширенный massactions.js код
define([
'underscore',
'uiRegistry',
'mageUtils',
'Magento_Ui/js/lib/collapsible',
'Magento_Ui/js/modal/confirm',
'Magento_Ui/js/modal/alert',
'mage/translate'
], function (_, registry, utils, Collapsible, confirm, alert, $t) {
'use strict';
return function (Component) {
return Component.extend({
defaultCallback: function (action, data) {
var itemsType = data.excludeMode ? 'excluded' : 'selected',
selections = {};
if (itemsType === 'excluded' && data.selected && data.selected.length) {
itemsType = 'selected';
data[itemsType] = _.difference(data.selected, data.excluded);
}
selections[itemsType] = data[itemsType];
if (!selections[itemsType].length) {
selections[itemsType] = false;
}
_.extend(selections, data.params || {});
// code for my massaction running with ajaxSubmit
if (action.url.indexOf("electroidlab/connect_ui/massDelete") !== -1) {
var config = {ajaxSaveType: "simple"};
utils.ajaxSubmit({
url: action.url,
data: selections
}, config).done(function(a) {
var gridName = "electroidlab_connect_list.electroidlab_connect_list_data_source";
if (gridName) {
var params = [];
var target = registry.get(gridName);
if (target && typeof target === 'object') {
target.set('params.t ', Date.now());
}
}
});
} else {
// default submit
utils.submit({
url: action.url,
data: selections
});
}
}
});
}
});
Все работает нормально, сетка обновлена через ajax в massaction.