Como criar um desenvolvimento de módulo personalizado no magento 2 a partir do zero?


15

Como criar desenvolvimento de módulo personalizado a partir do zero no magento 2 com o seguinte ponto.

1.Como criar o módulo

2.Como instalar e atualizar o banco de dados

3.Como criar módulos, visualizar e camadas do controlador

4.Como testar a integração de todos os componentes do módulo

6.Como criar o comando da CLI do Magento

7.Como configurar tarefas agendadas no Magento 2

8.Como criar uma entrada de menu

9.Como criar recurso ACL

  1. Como implementar a API da web no Magento com tabela personalizada

11.Como criar uma grade personalizada no administrador

  1. Como criar o componente Form usando interface do usuário e salvar e redirecionar para a grade

Eu gostaria de compartilhar o código fonte com todos os caras


Qual a sua pergunta? O que é problema?
Sohel Rana

@SohelRana Senhor, eu sou novo no magento 2. basicamente novos candidatos obtêm vários problemas enquanto desenvolvem módulos personalizados, então pensei em compartilhar meu código-fonte que ajudará alguém. se você tem alguma sugestão para mim, por favor, me avise.
Pramod Kharade 4/11

@PramodKharade, a fim de melhorar a clareza da sua pergunta e receber uma reputação maior nessa pilha, pode valer a pena perguntar e responder a cada um desses pontos como perguntas separadas. Sua resposta é exatamente o que eu estava procurando para resolver muitos problemas, mas é muito difícil encontrar usando o mecanismo de pesquisa stackexchange.
Joshua Flood

@JoshuaFlood thanks. da próxima vez, trarei novo conceito com perguntas e ans separados. Por favor vote em ans para que ele ajude outro leitor.
Pramod Kharade

Estou recebendo o 404, algum outro passo precisa fazer?
Vivek Pandian

Respostas:


18

Espaço para nome: Mastering \ Itdesire

1.Como criar o módulo

Masterização / Itdesire / etc / module.xml

    <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
        <module name="Mastering_Itdesire" setup_version="1.0.1">
            <sequence>
                <module name="Magento_Catalog"/>
            </sequence>
        </module>
    </config>

Masterização / Itdesire / registration.php

    <?php
    \Magento\Framework\Component\ComponentRegistrar::register(
        \Magento\Framework\Component\ComponentRegistrar::MODULE,
        'Mastering_Itdesire',
        __DIR__
    );

2.Como instalar e atualizar o banco de dados:

Esquema de instalação:

Masterização / Itdesire / Setup / InstallSchema.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of InstallSchema
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Ddl\Table;

class InstallSchema implements InstallSchemaInterface
{
    /**
     * {@inheritdoc}
     */
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        $table = $setup->getConnection()->newTable(
            $setup->getTable('mastering_itdesire_item')
        )->addColumn(
            'id',
            Table::TYPE_INTEGER,
            null,
            ['identity' => true, 'nullable' => false, 'primary' => true],
            'Item ID'
        )->addColumn(
            'name',
            Table::TYPE_TEXT,
            255,
            ['nullable' => false],
            'Item Name'
        )->addIndex(
            $setup->getIdxName('mastering_itdesire_item', ['name']),
            ['name']
        )->setComment(
            'itdesire Items'
        );
        $setup->getConnection()->createTable($table);

        $setup->endSetup();
    }
}

Instalar dados:

Masterização / Itdesire / Setup / InstallData.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

namespace Mastering\Itdesire\Setup;

/**
 * Description of InstallData
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Setup;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

class InstallData implements InstallDataInterface
{
    /**
     * {@inheritdoc}
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        $setup->getConnection()->insert(
            $setup->getTable('mastering_itdesire_item'),
            [
                'name' => 'Item 1'
            ]
        );

        $setup->getConnection()->insert(
            $setup->getTable('mastering_itdesire_item'),
            [
                'name' => 'Item 2'
            ]
        );

        $setup->endSetup();
    }
}

Esquema de atualização:

Masterização / Itdesire / Setup / UpgradeSchema.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

namespace Mastering\Itdesire\Setup;

/**
 * Description of UpgradeSchema
 *
 * @author pramod
 */
use Magento\Framework\DB\Ddl\Table;
use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

class UpgradeSchema implements UpgradeSchemaInterface
{
    /**
     * {@inheritdoc}
     */
    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        if (version_compare($context->getVersion(), '1.0.1', '<')) {
            $setup->getConnection()->addColumn(
                $setup->getTable('mastering_itdesire_item'),
                'description',
                [
                    'type' => Table::TYPE_TEXT,
                    'nullable' => true,
                    'comment' => 'Item Description'
                ]
            );
        }

        $setup->endSetup();
    }
}

Dados de atualização:

Masterização / Itdesire / Setup / UpgradeData.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

namespace Mastering\Itdesire\Setup;

/**
 * Description of UpgradeData
 *
 * @author pramod
 */
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;

class UpgradeData implements UpgradeDataInterface
{
    /**
     * {@inheritdoc}
     */
    public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        if (version_compare($context->getVersion(), '1.0.1', '<')) {
            $setup->getConnection()->update(
                $setup->getTable('mastering_itdesire_item'),
                [
                    'description' => 'Default description'
                ],
                $setup->getConnection()->quoteInto('id = ?', 1)
            );
        }

        $setup->endSetup();
    }
}

3.Como criar camadas de modelo, visualização e controlador

Controlador:

Masterização / Itdesire / Controller / Adminhtml / Index / Index.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Index
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Controller\Adminhtml\Index;
use Magento\Framework\Controller\ResultFactory;
use Magento\Backend\App\Action;
class Index extends Action{
    //put your code here
    public function execute() {
        /** @var \Magento\Framework\Controller\Result\Raw $result */
        $result = $this->resultFactory->create(ResultFactory::TYPE_RAW);
        $result->setContents('Hello Admins!');
        return $result;
    }

}

Masterização / Itdesire / Controller / Index / Index.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Index
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Controller\Index;
use Magento\Framework\Controller\ResultFactory;
use Magento\Framework\App\Action\Action;
class Index extends Action{
    //put your code here
    public function execute() {
        /** @var \Magento\Framework\Controller\Result\Raw $result */
        /*
        $result = $this->resultFactory->create(ResultFactory::TYPE_RAW);
        $result->setContents('Hello World!');
        return $result; */
      return $this->resultFactory->create(ResultFactory::TYPE_PAGE);
    }

}

Masterização / Itdesire / etc / adminhtml / routes.xml

<?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 id="mastering" frontName="mastering">
            <module name="Mastering_Itdesire"/>
        </route>
    </router>
</config>

Masterização / Itdesire / view / frontend / layout / mastering_index_index.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
            <block name="mastering_hello" class="Mastering\Itdesire\Block\Hello" template="hello.phtml"/>
        </referenceContainer>
    </body>
</page>

Modelo, Modelo de Recursos e API:

Masterização / Itdesire / Model / ResourceModel / Item / Collection.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Collection
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Model\ResourceModel\Item;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
use Mastering\Itdesire\Model\Item;
use Mastering\Itdesire\Model\ResourceModel\Item as ItemResource;
class Collection extends AbstractCollection {
    protected $_idFieldName = 'id';

    protected function _construct()
    {
        $this->_init(Item::class, ItemResource::class);
    }
}

Masterização / Itdesire / Model / ResourceModel / Item.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Item
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Model\ResourceModel;
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
class Item extends AbstractDb {
   protected function _construct()
    {
        $this->_init('mastering_itdesire_item', 'id');
    }

}

Masterização / Itdesire / Model / Config.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

namespace Mastering\Itdesire\Model;
use Magento\Framework\App\Config\ScopeConfigInterface;

/**
 * Description of Config
 *
 * @author pramod
 */
class Config {
    const XML_PATH_ENABLED = 'mastering/general/enabled';

    private $config;

    public function __construct(ScopeConfigInterface $config)
    {
        $this->config = $config;
    }

    public function isEnabled()
    {
        return $this->config->getValue(self::XML_PATH_ENABLED);
    }
}

Masterização / Itdesire / Model / Item.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Item
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Model;
use Magento\Framework\Model\AbstractModel;
class Item extends AbstractModel{
    //put your code here
    protected function _construct() {
        $this->_init(\Mastering\Itdesire\Model\ResourceModel\Item::class);
    }
}

Masterização / Itdesire / Model / ItemRepository.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

namespace Mastering\Itdesire\Model;

/**
 * Description of ItemRepository
 *
 * @author pramod
 */
use Mastering\Itdesire\Api\ItemRepositoryInterface;
use Mastering\Itdesire\Model\ResourceModel\Item\CollectionFactory;
class ItemRepository implements ItemRepositoryInterface {
    private $collectionFactory;

    public function __construct(CollectionFactory $collectionFactory) {
        $this->collectionFactory = $collectionFactory;
    }

    public function getList() {
        return $this->collectionFactory->create()->getItems();
    }

}

Visão :

Masterização / Itdesire / Block / Hello.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Hello
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Block;
use Magento\Framework\View\Element\Template;
use Magento\Framework\View\Element\Template\Context;
use Mastering\Itdesire\Model\ResourceModel\Item\Collection;
use Mastering\Itdesire\Model\ResourceModel\Item\CollectionFactory;
class Hello extends Template{
    //put your code here
    private $collectionFactory;
    public function __construct(Context $context,
            CollectionFactory $collectionFactory,
            array $data = array()) {
        $this->collectionFactory = $collectionFactory;
        parent::__construct($context, $data);
    }

   /**
     * @return \Mastering\Itdesire\Model\Item[]
     */
    public function getItems()
    {
        return $this->collectionFactory->create()->getItems();
    }
}

Masterização / Itdesire / view / frontend / templates / hello.phtml

<?php 
/***
 * @var \Mastering\Itdesire\Block\Hello $block
 * ***/

?>
<?php foreach ($block->getItems() as $item){

    ?>
<p>
    <?php echo $item->getName();?>: <?php echo $item->getDescription();?>
</p>
<?php } ?>

4.Como criar o comando da CLI do Magento:

Masterização / Itdesire / Console / Comando / AddItem.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of AddItem
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Console\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Mastering\Itdesire\Model\ItemFactory;
use Magento\Framework\Console\Cli;

class AddItem extends Command{

    const INPUT_KEY_NAME ="name";
    const INPUT_KEY_DESCRIPTION ="description";
    private $itemFactory;

    public function __construct(ItemFactory $itemFactory) {
        $this->itemFactory = $itemFactory;
        parent::__construct();
    }

    protected function configure() {
        $this->setName("itdesire:item:add")
                ->addArgument(
                               self::INPUT_KEY_NAME,
                               InputArgument::REQUIRED,
                               'Input Name'
                             )->addArgument(
                                     self::INPUT_KEY_DESCRIPTION,
                                     InputArgument::OPTIONAL,
                                     "Input Description"
                            );
        parent::configure();
    }

    protected function execute(InputInterface $input, OutputInterface $output) {
        $item = $this->itemFactory->create();
        $item->setName($input->getArgument(self::INPUT_KEY_NAME));
        $item->setDescription($input->getArgument(self::INPUT_KEY_DESCRIPTION));
        $item->setIsObjectNew(true);
        $item->save();
        return Cli::RETURN_SUCCESS;
    }
}

5.Como configurar a tarefa agendada no Magento 2:

Masterização / Itdesire / Cron / AddItem.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of addItem
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Cron;
use Mastering\Itdesire\Model\ItemFactory;
use Mastering\Itdesire\Model\Config;
class AddItem {
    private $itemFactory;
    private  $config;
    public function __construct(ItemFactory $itemFactory,Config $config) {
        $this->itemFactory = $itemFactory;
        $this->config = $config;
    }

    public function execute()
    {
        if($this->config->isEnabled()){
            $this->itemFactory->create()
            ->setName('Scheduled item')
            ->setDescription('Created at ' . time())
            ->save();
        }

    }
}

Masterização / Itdesire / etc / config.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
    <default>
        <mastering>
            <general>
                <enabled>0</enabled>
                <cron_expression>* * * * *</cron_expression>
            </general>
        </mastering>
    </default>
</config>

Masterização / Itdesire / etc / crontab.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
    <group id="default">
        <job name="masteringAddItem" instance="Mastering\Itdesire\Cron\AddItem" method="execute">
            <config_path>mastering/general/cron_expression</config_path>
        </job>
    </group>
</config>

Masterização / Itdesire / etc / adminhtml / system.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
    <system>
        <tab id="mastering" translate="label" sortOrder="10000">
            <label>Mastering</label>
        </tab>
        <section id="mastering" translate="label" sortOrder="10" showInDefault="1" showInWebsite="0" showInStore="0">
            <label>Mastering</label>
            <tab>mastering</tab>
            <resource>Mastering_Itdesire::mastering</resource>
            <group id="general" translate="label" sortOrder="10" showInDefault="1" showInWebsite="0" showInStore="0">
                <label>Item creation by schedule</label>
                <field id="enabled" translate="label" type="select" sortOrder="10" showInDefault="1" showInWebsite="0" showInStore="0">
                    <label>Enabled</label>
                    <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
                </field>
                <field id="cron_expression" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="0" showInStore="0" canRestore="1">
                    <label>Add Item Cron Expression</label>
                </field>
            </group>
        </section>
    </system>
</config>

6.Como criar a entrada do menu:

Masterização / Itdesire / etc / adminhtml / menu.xml

 <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
        <menu>
            <add id="Mastering_Itdesire::mastering" title="Mastering"
                 module="Mastering_Itdesire" resource="Mastering_Itdesire::mastering"
                 translate="title" sortOrder="900" action="mastering"/>
        </menu>
    </config>

7.Como criar um recurso ACL:

Masterização / Itdesire / etc / acl.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
    <acl>
        <resources>
            <resource id="Magento_Backend::admin">
                <resource id="Masteting_Itdesire::mastering" title="Mastering"
                          translate="title" sortOrder="900"/>
            </resource>
        </resources>
    </acl>
</config>

8.Como implementar a API da web no Magento com tabela personalizada:

Masterização / Itdesire / etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\Console\CommandList">
        <arguments>
           <argument name="commands" xsi:type="array">
                <item name="masteringAddItem" xsi:type="object">Mastering\Itdesire\Console\Command\AddItem</item>
            </argument>
        </arguments>
    </type>
    <preference type="Mastering\Itdesire\Model\Item" for="Mastering\Itdesire\Api\Data\ItemInterface"/>
    <preference type="Mastering\Itdesire\Model\ItemRepository" for="Mastering\Itdesire\Api\ItemRepositoryInterface"/>
</config>

Masterização / Itdesire / etc / webapi.xml

<?xml version="1.0"?>
<routes>
    <route url="/V1/mastering" method="GET">
        <service class="Mastering\Itdesire\Api\ItemRepositoryInterface" method="getList"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>

insira a descrição da imagem aqui

insira a descrição da imagem aqui insira a descrição da imagem aqui

insira a descrição da imagem aqui insira a descrição da imagem aqui


2
Você pode obter todo o código fonte aqui também: github.com/pramodkharade/Magento2
Pramod Kharade

Olá @Pramod :). Excelente resposta! Ainda estou um pouco confuso sobre o meu problema em particular. Eu precisaria implementar essa mesma solução se meu objetivo fosse atribuir um código de desconto a um produto aleatório diferente a cada semana? Ou seria capaz de armazenar e recuperar dados sobre o produto dessa semana sem usar uma API? Minha pergunta está aqui: magento.stackexchange.com/questions/212734/… Obrigado novamente!
Joshua Flood

O @PramodKharade ItemFactory não existe no modelo
Masud Shaikh

Quando executei o comando upgrade, obtive o erro [ReflectionException] Classe Mastering \ Itdesire \ Console \ Command \ AddItem não existe @PramodKharade
Masud Shaikh

mas você não explicou o funcionamento do código :(
Rahul Singh 29/11

5

11.Grade personalizada Em admin, como continuado aqui, excedendo o tamanho do arquivo acima e ans :

Masterização / Itdesire / etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\Console\CommandList">
        <arguments>
           <argument name="commands" xsi:type="array">
                <item name="masteringAddItem" xsi:type="object">Mastering\Itdesire\Console\Command\AddItem</item>
            </argument>
        </arguments>
    </type>
    <preference type="Mastering\Itdesire\Model\Item" for="Mastering\Itdesire\Api\Data\ItemInterface"/>
    <preference type="Mastering\Itdesire\Model\ItemRepository" for="Mastering\Itdesire\Api\ItemRepositoryInterface"/>
    <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="mastering_item_grid_data_source" xsi:type="string">Mastering\Itdesire\Model\ResourceModel\Item\Grid\Collection</item>
            </argument>
        </arguments>
    </type>
</config>

Masterização / Itdesire / view / adminhtml / ui_component / mastering_item_grid.xml

<?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">
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="provider" xsi:type="string">mastering_item_grid.mastering_item_grid_data_source</item>
            <item name="deps" xsi:type="string">mastering_item_grid.mastering_item_grid_data_source</item>
        </item>
        <item name="spinner" xsi:type="string">mastering_item_columns</item>
        <item name="buttons" xsi:type="array">
            <item name="add" xsi:type="array">
                <item name="name" xsi:type="string">add</item>
                <item name="label" xsi:type="string" translate="true">Add Item</item>
                <item name="class" xsi:type="string">primary</item>
                <item name="url" xsi:type="string">*/item/new</item>
            </item>
        </item>
    </argument>
    <dataSource name="mastering_item_grid_data_source">
        <argument name="dataProvider" xsi:type="configurableObject">
            <argument name="class" xsi:type="string">Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider</argument>
            <argument name="name" xsi:type="string">mastering_item_grid_data_source</argument>
            <argument name="primaryFieldName" xsi:type="string">id</argument>
            <argument name="requestFieldName" xsi:type="string">id</argument>
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="update_url" xsi:type="url" path="mui/index/render"/>
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
                </item>
            </argument>
        </argument>
    </dataSource>
    <listingToolbar name="listing_top">
        <bookmark name="bookmarks"/>
        <columnsControls name="columns_controls"/>
        <exportButton name="export_button"/>
        <filterSearch name="fulltext"/>
        <filters name="listing_filters"/>
        <paging name="listing_paging"/>
        <frontendLink name="frontend_link"/>
    </listingToolbar>
    <columns name="mastering_item_columns">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="childDefaults" xsi:type="array">
                    <item name="fieldAction" xsi:type="array">
                        <item name="provider" xsi:type="string">mastering_item_grid.mastering_item_grid.mastering_item_columns.actions</item>
                        <item name="target" xsi:type="string">applyAction</item>
                        <item name="params" xsi:type="array">
                            <item name="0" xsi:type="string">view</item>
                            <item name="1" xsi:type="string">${ $.$data.rowIndex }</item>
                        </item>
                    </item>
                </item>
            </item>
        </argument>
        <selectionsColumn name="ids">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="indexField" xsi:type="string">id</item>
                </item>
            </argument>
        </selectionsColumn>
        <column name="name">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Name</item>
                </item>
            </argument>
        </column>
        <column name="description">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Description</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

Masterização / Itdesire / view / adminhtml / layout / mastering_index_index.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
            <uiComponent name="mastering_item_grid"/>
        </referenceContainer>
    </body>
</page>

Masterização / Itdesire / Model / ResourceModel / Item / Grid / Collection.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Collection
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Model\ResourceModel\Item\Grid;
use Magento\Framework\Data\Collection\Db\FetchStrategyInterface as FetchStrategy;
use Magento\Framework\Data\Collection\EntityFactoryInterface as EntityFactory;
use Magento\Framework\Event\ManagerInterface as EventManager;
use Psr\Log\LoggerInterface as Logger;

class Collection extends \Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult
{
    public function __construct(
        EntityFactory $entityFactory,
        Logger $logger,
        FetchStrategy $fetchStrategy,
        EventManager $eventManager,
        $mainTable = 'mastering_itdesire_item',
        $resourceModel = 'Mastering\Itdesire\Model\ResourceModel\Item'
    ) {
        parent::__construct(
            $entityFactory,
            $logger,
            $fetchStrategy,
            $eventManager,
            $mainTable,
            $resourceModel
        );
    }
}

insira a descrição da imagem aqui

12.Como criar o componente Form Using UI e salvar e redirecionar para o Grid

Masterização / Itdesire / view / adminhtml / layout / mastering_item_new.xml

<?xml version="1.0"?>
<page layout="admin-2columns-left" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
            <uiComponent name="mastering_item_form"/>
        </referenceContainer>
    </body>
</page>

Masterização / Itdesire / view / adminhtml / ui_component / mastering_item_form.xml

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="provider" xsi:type="string">mastering_item_form.mastering_item_form_data_source</item>
            <item name="deps" xsi:type="string">mastering_item_form.mastering_item_form_data_source</item>
        </item>
        <item name="label" xsi:type="string" translate="true">General</item>
        <item name="layout" xsi:type="array">
            <item name="type" xsi:type="string">tabs</item>
            <item name="navContainerName" xsi:type="string">left</item>
        </item>
        <item name="buttons" xsi:type="array">
            <item name="save" xsi:type="array">
                <item name="name" xsi:type="string">save</item>
                <item name="label" xsi:type="string" translate="true">Save</item>
                <item name="class" xsi:type="string">primary</item>
                <item name="url" xsi:type="string">*/*/save</item>
            </item>
        </item>
    </argument>
    <dataSource name="mastering_item_form_data_source">
        <argument name="dataProvider" xsi:type="configurableObject">
            <argument name="class" xsi:type="string">Mastering\Itdesire\Ui\DataProvider</argument>
            <argument name="name" xsi:type="string">mastering_item_form_data_source</argument>
            <argument name="primaryFieldName" xsi:type="string">id</argument>
            <argument name="requestFieldName" xsi:type="string">id</argument>
            <argument name="collectionFactory" xsi:type="object">Mastering\Itdesire\Model\ResourceModel\Item\CollectionFactory</argument>
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="submit_url" xsi:type="url" path="mastering/item/save"/>
                </item>
            </argument>
        </argument>
        <argument name="data" xsi:type="array">
            <item name="js_config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/form/provider</item>
            </item>
        </argument>
    </dataSource>
    <fieldset name="general">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="label" xsi:type="string" translate="true">General</item>
            </item>
        </argument>
        <field name="name">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Name</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="formElement" xsi:type="string">input</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">true</item>
                    </item>
                </item>
            </argument>
        </field>
        <field name="description">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Description</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="formElement" xsi:type="string">input</item>
                </item>
            </argument>
        </field>
    </fieldset>
</form>

Masterização / Itdesire / Ui / DataProvider.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of DataProvider
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Ui;
use Magento\Ui\DataProvider\AbstractDataProvider;

class DataProvider extends AbstractDataProvider
{
    protected $collection;

    public function __construct(
        $name,
        $primaryFieldName,
        $requestFieldName,
        $collectionFactory,
        array $meta = [],
        array $data = []
    ) {
        parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
        $this->collection = $collectionFactory->create();
    }

    public function getData()
    {
        $result = [];
        foreach ($this->collection->getItems() as $item) {
            $result[$item->getId()]['general'] = $item->getData();
        }
        return $result;
    }
}

Masterização / Itdesire / Controller / Adminhtml / Item / NewAction.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of NewAction
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Controller\Adminhtml\Item;
use Magento\Framework\Controller\ResultFactory;
use Magento\Backend\App\Action;

class NewAction extends Action
{
    public function execute()
    {
        return $this->resultFactory->create(ResultFactory::TYPE_PAGE);
    }
}

Masterização / Itdesire / Controller / Adminhtml / Item / Save.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Save
 *
 * @author pramod
 */
namespace Mastering\Itdesire\Controller\Adminhtml\Item;

use Mastering\Itdesire\Model\ItemFactory;
use Magento\Backend\App\Action;

class Save extends Action
{
    private $itemFactory;

    public function __construct(
        \Magento\Backend\App\Action\Context $context,
        ItemFactory $itemFactory
    ) {
        $this->itemFactory = $itemFactory;
        parent::__construct($context);
    }

    public function execute()
    {
        $this->itemFactory->create()
            ->setData($this->getRequest()->getPostValue()['general'])
            ->save();
        return $this->resultRedirectFactory->create()->setPath('mastering/index/index');
    }
}

insira a descrição da imagem aqui


1
Olá @Pramod Kharade :). Acabei de notar que sua primeira resposta vai para a etapa 8. mas essa resposta continua na etapa 11. Você está faltando etapas ou houve um erro de digitação?
Joshua Flood

Oi, como posso adicionar editar e excluir ações na coluna da grade?
Ashna 30/07/2018

Sim, podemos adicioná-lo.
Pramod Kharade
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.