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()
                        ]
                    );
                    
            ...

    }

Есть ли способ сделать массовое действие по умолчанию без фактического обновления страницы? Спасибо!

Author: electroid, 2020-07-14

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.

 0
Author: electroid, 2020-07-14 15:33:47