Quantcast
Channel: Webkul Blog
Viewing all articles
Browse latest Browse all 5488

Create Dynamic Mass Action In Magento2 Grid

$
0
0

Create Dynamic Mass Action In Magento2 Grid : if you want to create dynamic mass action in any custom grid of magento2, to achieve this you have to follow some steps .

1. Write mass action code in your ui component phtml file

<massaction name="listing_massaction">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="selectProvider" xsi:type="string">dynamicmassaction_massaction_listing.dynamicmassaction_massaction_listing.dynamicmassaction_massaction_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="assign_badge">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="type" xsi:type="string">assign_badge</item>
                <item name="label" xsi:type="string" translate="true">Assign badge</item>
            </item>
        </argument>
        <argument name="actions" xsi:type="configurableObject">
            <argument name="class" xsi:type="string">Webkul\DynamicMassaction\Ui\Component\MassAction\Badge\Assignoptions</argument>
            <argument name="data" xsi:type="array">
                <item name="urlPath" xsi:type="string">dynamicmassaction/managemassaction/massAssignBadge</item>
                <item name="paramName" xsi:type="string">entity_id</item>
                <item name="confirm" xsi:type="array">
                    <item name="title" xsi:type="string" translate="true">Assign badge</item>
                    <item name="message" xsi:type="string" translate="true">Are you sure to assign selected badge to customer?</item>
                </item>
            </argument>
        </argument>
    </action>
</massaction>

Lets take chunk of the above code for better understanding

<argument name="actions" xsi:type="configurableObject">
    <argument name="class" xsi:type="string">Webkul\DynamicMassaction\Ui\Component\MassAction\Badge\Assignoptions</argument>
    <argument name="data" xsi:type="array">
        <item name="urlPath" xsi:type="string">dynamicmassaction/managemassaction/massAssignBadge</item>
        <item name="paramName" xsi:type="string">entity_id</item>
        <item name="confirm" xsi:type="array">
            <item name="title" xsi:type="string" translate="true">Assign badge</item>
            <item name="message" xsi:type="string" translate="true">Are you sure to assign selected badge to customer?</item>
        </item>
    </argument>
</argument>

here you will see a line, where you have to set the path for manipulation of dynamic massaction
<argument name="class" xsi:type="string">Webkul\DynamicMassaction\Ui\Component\MassAction\Badge\Assignoptions</argument>
    <argument name="data" xsi:type="array">

2. in this path Webkul\DynamicMassaction\Ui\Component\MassAction\Badge\Assignoptions you need to manipulate your massaction

<?php

namespace Webkul\DynamicMassaction\Ui\Component\MassAction\Badge;

use Magento\Framework\UrlInterface;
use Zend\Stdlib\JsonSerializable;
use Webkul\DynamicMassaction\Model\ResourceModel\Badge\CollectionFactory;

/**
 * Class Options
 */
class Assignoptions implements JsonSerializable
{
    /**
     * @var array
     */
    protected $options;

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

    /**
     * Additional options params
     *
     * @var array
     */
    protected $data;

    /**
     * @var UrlInterface
     */
    protected $urlBuilder;

    /**
     * Base URL for subactions
     *
     * @var string
     */
    protected $urlPath;

    /**
     * Param name for subactions
     *
     * @var string
     */
    protected $paramName;

    /**
     * Additional params for subactions
     *
     * @var array
     */
    protected $additionalData = [];

    /**
     * Constructor
     *
     * @param CollectionFactory $collectionFactory
     * @param UrlInterface $urlBuilder
     * @param array $data
     */
    public function __construct(
        CollectionFactory $collectionFactory,
        UrlInterface $urlBuilder,
        array $data = []
    ) {
        $this->collectionFactory = $collectionFactory;
        $this->data = $data;
        $this->urlBuilder = $urlBuilder;
    }

    /**
     * Get action options
     *
     * @return array
     */
    public function jsonSerialize()
    {
        $i=0;
        if ($this->options === null) {
            // get the massaction data from the database table
            $badgeColl = $this->collectionFactory->create()->addFieldToFilter('status',['eq'=>1]);
            
            if(!count($badgeColl)){
                return $this->options;
            }
            //make a array of massaction
            foreach ($badgeColl as $key => $badge) {
                $options[$i]['value']=$badge->getEntityId();
                $options[$i]['label']=$badge->getBadgeName();
                $i++;
            }
            $this->prepareData();
            foreach ($options as $optionCode) {
                $this->options[$optionCode['value']] = [
                    'type' => 'badge_' . $optionCode['value'],
                    'label' => $optionCode['label'],
                ];

                if ($this->urlPath && $this->paramName) {
                    $this->options[$optionCode['value']]['url'] = $this->urlBuilder->getUrl(
                        $this->urlPath,
                        [$this->paramName => $optionCode['value']]
                    );
                }

                $this->options[$optionCode['value']] = array_merge_recursive(
                    $this->options[$optionCode['value']],
                    $this->additionalData
                );
            }
            
            // return the massaction data
            $this->options = array_values($this->options);
        }
        return $this->options;
    }

    /**
     * Prepare addition data for subactions
     *
     * @return void
     */
    protected function prepareData()
    {
         
        foreach ($this->data as $key => $value) {
            switch ($key) {
                case 'urlPath':
                    $this->urlPath = $value;
                    break;
                case 'paramName':
                    $this->paramName = $value;
                    break;
                default:
                    $this->additionalData[$key] = $value;
                    break;
            }
        }
    }
}

3. Now you will see your dynamically added mass actions are displaying on grid.

dynamic massactions

So in this way, you can add dynamic massaction in your grid.Hope this blog will help you.


Viewing all articles
Browse latest Browse all 5488

Trending Articles