Question

How to Implement massactions in grid using ui_component magento2. I have created my ui_component and need to implement massactions. I have also created controllers for the required paths. But, somehow it is just not working. I'm using magento 2.1 C.E.

ui_component/test_grid.xml

<massaction name="listing_massaction">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="selectProvider" xsi:type="string">test_grid.test_grid.test_grid_columns.ids</item>
            <item name="component" xsi:type="string">Magento_Ui/js/grid/tree-massactions</item>
            <item name="indexField" xsi:type="string">entity_id</item>
        </item>
    </argument>
    <action name="accept">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="type" xsi:type="string">accepted</item>
                <item name="label" xsi:type="string" translate="true">Accept</item>
                <item name="url" xsi:type="string">test/Index/Massaccept</item>
            </item>
        </argument>
    </action>
</massaction>

Index/Massaccept.php

<?php
    namespace Vendor\Module\Controller\Adminhtml\Index;
    use \Vendor\Module\Model\TestFactory;

    class Massaccept extends \Magento\Backend\App\Action {

        protected $resultPageFactory = false;
        protected $_fasctcureFactory;

        public function __construct(
            TestFactory $testFactory,
            \Magento\Framework\View\Result\PageFactory $resultPageFactory,
            \Magento\Backend\App\Action\Context $context
            ) {
            $this->_testFactory = $testFactory;
            $this->resultPageFactory = $resultPageFactory;
            parent::__construct($context);
        }

        public function execute() {
            die("working");
            $ids = $this->getRequest()->getParam('id');
            $model = $this->_testFactory->create();

            foreach($ids as $id) {
                $model->load($id);
                $model->getStatus();
                $model->setStatus('Processing');
                $model->save();         
            }
            $resultRedirect = $this->resultRedirectFactory->create();
            $resultRedirect->setRefererOrBaseUrl();
            return $resultRedirect;
        }
    }

My controllers are in the path:

Vendor/Module/Controller/Adminhtml/Index/Massaccept.php Vendor/Module/Controller/Adminhtml/Index/Massreject.php

The mass actions are visible on the grid, but are not redirecting anywhere.Redirect is not working for using above code.

All I'm getting is this error:

Uncaught TypeError: Cannot read property 'total' of undefined in massactions.js:52

Was it helpful?

Solution

Please try this. It's working fine for me.

<massaction name="listing_massaction">
        <action name="delete">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="type" xsi:type="string">delete</item>
                    <item name="label" xsi:type="string" translate="true">Delete</item>
                    <item name="url" xsi:type="url" path="test/index/massDelete"/>
                    <item name="confirm" xsi:type="array">
                        <item name="title" xsi:type="string" translate="true">Delete Items</item>
                        <item name="message" xsi:type="string" translate="true">Are you sure you wan't to delete selected items?</item>
                    </item>
                </item>
            </argument>
        </action>
    </massaction>

Your controller name like MassDelete.php

This is my MassActive.php

Please refer this and change your massaccept.php file and then check after that.

namespace Dedicated\Grid\Controller\Adminhtml\Item;
use Magento\Framework\Controller\ResultFactory;
use Magento\Backend\App\Action\Context;
use Magento\Ui\Component\MassAction\Filter;
use Dedicated\Grid\Model\ResourceModel\Grid\CollectionFactory;

class MassActive extends \Dedicated\Grid\Controller\Adminhtml\Item
{

/**
 * @var Filter
 */
protected $filter;

/**
 * @var CollectionFactory
 */
protected $collectionFactory;

/**
 * @param Context $context
 * @param Filter $filter
 * @param CollectionFactory $collectionFactory
 */
public function __construct(Context $context, Filter $filter, CollectionFactory $collectionFactory)
{
    $this->filter = $filter;
    $this->collectionFactory = $collectionFactory;
    parent::__construct($context);
}
/**
 * Delete action
 *
 * @return \Magento\Backend\Model\View\Result\Redirect
 */
public function execute()
{
    $collection = $this->filter->getCollection($this->collectionFactory->create());
    $collectionSize = $collection->getSize();

    foreach ($collection as $template) {
        $template->setIsActive(true);
        $template->save();
    }

    $this->messageManager->addSuccess(__('A total of %1 record(s) have been changed.', $collectionSize));

    /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
    $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
    return $resultRedirect->setPath('*/*/');
}
}

OTHER TIPS

You have to pass path like test/index/massdelete and test/index/massaccept in below arguments.

 <action name="reject">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="type" xsi:type="string">rejected</item>
                <item name="label" xsi:type="string" translate="true">Reject</item>
                <item name="url" xsi:type="url" path="*/*/MassDelete"><item/>
                <item name="confirm" xsi:type="array">
                    <item name="title" xsi:type="string" translate="true">Reject items</item>
                    <item name="message" xsi:type="string" translate="true">Are you sure to reject selected Requests?</item>
                </item>
            </item>
        </argument>
    </action>
    <action name="accept">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="type" xsi:type="string">accepted</item>
                <item name="label" xsi:type="string" translate="true">Accept</item>
                <item name="url" xsi:type="string">test/Index/Massaccept</item>                        
            </item>
        </argument>
    </action>

You have to replace with below code,

 <action name="reject">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="type" xsi:type="string">rejected</item>
                <item name="label" xsi:type="string" translate="true">Reject</item>
                <item name="url" xsi:type="url" path="test/index/massDelete"><item/>
                <item name="confirm" xsi:type="array">
                    <item name="title" xsi:type="string" translate="true">Reject items</item>
                    <item name="message" xsi:type="string" translate="true">Are you sure to reject selected Requests?</item>
                </item>
            </item>
        </argument>
    </action>
    <action name="accept">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="type" xsi:type="string">accepted</item>
                <item name="label" xsi:type="string" translate="true">Accept</item>
                <item name="url" xsi:type="string">test/index/massAccept</item>                        
            </item>
        </argument>
    </action>

Your controller file path should be MassDelete.php and MassAccept.php

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top