4 Steps to Create Mass Action and Save Custom Attributes to Customer Grid

Nhận xét sản phẩm này

Tình trạng: Còn hàng

0,00 US$
Hoặc

4 Steps to Create Mass Action and Save Custom Attributes to Customer Grid

4 Steps to Create Mass Action and Save Custom Attributes to Customer Grid

Magento có rất nhiều cách để tạo custom customer attribute và thêm nó vào customer grid thông qua  Setup Script. Vậy làm thế nào để tạo mass action và save custom attributes to customer grid?  

Chỉ với 4 bước ở bài viết này, bạn có thể thực hiện điều đó một cách dễ dàng.

 

Bước 1: Tạo InstallData

Tạo folder app/code/Bss/Mymodule/Setup/InstallData.php

Example:

<?php

namespace Bss\Mymodule\Setup;

 

use Magento\Customer\Model\Customer;

use Magento\Customer\Setup\CustomerSetupFactory;

use Magento\Framework\Setup\InstallDataInterface;

use Magento\Framework\Setup\ModuleContextInterface;

use Magento\Framework\Setup\ModuleDataSetupInterface;

 

class InstallData implements InstallDataInterface

{

    private $customerSetupFactory;

 

    public function __construct(

        CustomerSetupFactory $customerSetupFactory

    ) {

        $this->customerSetupFactory = $customerSetupFactory;

    }

 

    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)

    {

        $setup->startSetup();

        /** @var CustomerSetup $customerSetup */

        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

 

        $customerSetup->addAttribute(Customer::ENTITY, 'your_attributes', [

                'label' => 'Your Label',

                'input' => 'select',

                'required' => false,

                'sort_order' => 100,

                'visible' => true,

                'system' => false,

                'type' => 'int',

                'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Table',

                'is_used_in_grid' => true,

                'is_visible_in_grid' => true,

                'is_filterable_in_grid' => true,

                'is_searchable_in_grid' => true,

                'option' => ['values' => ['Text1', 'Text2']],

            ]);

 

           $setup->endSetup();

    }

}

 

File này sẽ được thực thi khi bạn thực hiện quá trình install module

Attributes của bạn sẽ được lưu vào database thông qua model đã hỗ trợ sẵn của Magento: Magento\Customer\Model\Customer.

+       your_attributes sẽ lưu vào bảng customer_eav_attribute và eav_attribute

+       Mối quan hệ giữa attribute_code và attribute_option_id  sẽ lưu vào bảng eav_attribute_option.

+       Mối quan hệ giữa attribute_option_id và attribute_value sẽ lưu vào bảng eav_attribute_option_value.

Một số lưu ý:

+       'input' => 'select' : Kiểu của attribute. Ban có thể chọn kiểu attribute của mình có thể là select, text, textarea, multiselect, date, hidden, boolean, image, int, price … Bạn có thể xem thêm các kiểu default ở bảng eav_attribute

+       'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Table': Cái này chỉ dùng cho attribute có dạng là dropdown và multiselect.

+       'option' => ['values' => ['Text1', 'Text2']]: Đây là giá trị cho các attribute dưới dạng dropdown. Text 1, Text 2 là giá trị attribute của bạn.

 

 Bước 2: Tạo MassAction bằng Ui Component

Tạo folder: app/code/BSS/Mymodule/view/adminhtml/ui_component/customer_listing.xml

Ở bản Magento 2.1.x

<?xml version="1.0" encoding="UTF-8"?>

<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">

    <listingToolbar name="listing_top">

        <massaction name="listing_massaction">

            <action name="text1">

                <argument name="data" xsi:type="array">

                    <item name="config" xsi:type="array">

                        <item name="type" xsi:type="string">text1</item>

                        <item name="label" xsi:type="string" translate="true">Action 1</item>

                        <item name="url" xsi:type="url" path="mymodule/index/massAction1"/>

                        <item name="confirm" xsi:type="array">

                            <item name="title" xsi:type="string" translate="true">Action 1</item>

                            <item name="message" xsi:type="string" translate="true">Are you sure to Action 1 selected customers?</item>

                        </item>

                    </item>

                </argument>

            </action>

            <action name="text2">

                <argument name="data" xsi:type="array">

                    <item name="config" xsi:type="array">

                        <item name="type" xsi:type="string">text2</item>

                        <item name="label" xsi:type="string" translate="true">Action2</item>

                        <item name="url" xsi:type="url" path="mymodule/index/massAction2"/>

                        <item name="confirm" xsi:type="array">

                            <item name="title" xsi:type="string" translate="true">Action 2</item>

                            <item name="message" xsi:type="string" translate="true">Are you sure to Action 2 selected customers?</item>

                        </item>

                    </item>

                </argument>

            </action>

        </massaction>

    </listingToolbar>

</listing>

 

Trong đó:

<action name="text1"> : Tên massAction của bạn.

<item name="type" xsi:type="string">text1</item> : Tên của item.

<item name="label" xsi:type="string" translate="true">Action 1</item>: Label của massAction bạn thêm vào.

<item name="url" xsi:type="url" path="mymodule/index/massAction1"/>: Bạn có thể điền controller mà bạn gửi đến. VD: mymodule/index/massAction1

<item name="title" xsi:type="string" translate="true">Action 1</item>: Nhãn sau khi bạn click vào massAction nó sẽ hiện lên 1 thông báo confirm.

<item name="message" xsi:type="string" translate="true">Are you sure to Action 1 selected customers?</item>: Tin nhắn hiện lên trong lúc confirm.

 

Ở bản Magento  2.0.x: 

Bạn cần chuyển <listingToolbar name="listing_top"> sang  <container name="listing_top">

 

Bước 3: Tạo Router cho Controller trong Amin

Tạo app/code/Bss/Mymodule/etc/adminhtml/routes.xml

Ta sẽ sử dụng mymodule router cho admin và massAction sẽ hướng tới Controller: mymodule/index/massAction1

Làm tương tự đối với mymodule/index/massAction2

Example

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">

    <router id="admin">

        <route frontName="mymodule" id="mymodule">

            <module name="Bss_Mymodule"/>

        </route>

    </router>

</config>

 

Bước 4: Tạo Controller để lưu custom customer attribute

Bạn có thể lưu lại custom customer attribute mà bạn mới thêm vào customer grid bằng cách tạo Controller. Ở Controller bạn sẽ Set lại giá trị cho attribute bạn mới thêm vào và lưu lại customer data.

Tạo app/code/Bss/Mymodule/Controller/Adminhtml/Index/MassAction1.php

 

<?php

namespace Bss\YourModule\Controller\Adminhtml\Index;

 

use Magento\Backend\App\Action\Context;

use Magento\Customer\Model\ResourceModel\Customer\CollectionFactory;

use Magento\Eav\Model\Entity\Collection\AbstractCollection;

use Magento\Ui\Component\MassAction\Filter;

use Magento\Customer\Api\CustomerRepositoryInterface;

use Magento\Framework\Controller\ResultFactory;

use Magento\Eav\Model\Config;

 

class MassAction1 extends \Magento\Customer\Controller\Adminhtml\Index\AbstractMassAction

{

    protected $customerRepository;

    protected $eavConfig;

 

    public function __construct(

        Context $context,

        Filter $filter,

        CollectionFactory $collectionFactory,

        CustomerRepositoryInterface $customerRepository,

        Config $eavConfig

    ) {

        parent::__construct($context, $filter, $collectionFactory);

        $this->customerRepository = $customerRepository;

        $this->eavConfig = $eavConfig;

    }

 

    protected function massAction(AbstractCollection $collection)

    {

        $customersUpdated = 0;

        $collection = $this->filter->getCollection($this->collectionFactory->create());

        foreach ($collection->getAllIds() as $customerId) {

                // Verify customer exists

            try {

                $customer = $this->customerRepository->getById($customerId);

                $value = $this->UpdateText();

                $customer->setCustomAttribute("your_attributes", $value);

                $this->saveAttribute($customer);

                $customersUpdated++;

                if ($customersUpdated) {

                        $this->messageManager->addSuccess(__('A total of %1 record(s) were updated.', $customersUpdated));

                }

            } catch (\Exception $e) {

                $this->messageManager->addError(__('Something went wrong when save customer'));

            }

            /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */

            $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);

            $resultRedirect->setPath($this->getComponentRefererUrl());

 

            return $resultRedirect;

        }

    }

 

    protected function saveAttribute($customer)

    {

        return $this->customerRepository->save($customer);

    }

 

    protected function UpdateText()

    {

        $attribute = $this->eavConfig->getAttribute('customer', 'your_attributes');

        $options = $attribute->getSource()->getAllOptions();

        foreach ($options as $option) {

            if ($option['label'] == 'Text1') {

                $value = $option['value'];

            }

        }

        return $value;

    }

}

 

Ta có thể lấy được attribute code của attribute thông qua getAttribute() trong Magento\Eav\Model\Config. Ở đây ta sẽ tạo function UpdateText() để lấy attribute code đó

Để lưu lại attribute code cho customer. Ta sử dụng hàm setCustomAttribute("your_attributes", $value). Sau đó ta có lưu lại customer thông qua hàm save($customer) của Magento\Customer\Api\CustomerRepositoryInterface

Thông tin kỹ thuật

Author BSS Member
(0)

Questions and Answers

add your question

There are no entries.