¿Cómo crear un desarrollo de módulo personalizado en magento 2 desde cero?

15

Cómo crear desarrollo de módulos personalizados desde cero en magento 2 con el siguiente punto.

1. Cómo Crear Módulo

2. Cómo instalar y actualizar la base de datos

3. Cómo Crear Módulo, ver y Capas de Controlador

4. Cómo probar la integración de todos los componentes del módulo

6. Cómo crear el comando CLI de Magento

7. Cómo configurar la tarea programada en Magento 2

8.Cómo crear una entrada de menú

9. Cómo crear un recurso ACL

  1. Cómo implementar API web en Magento con tabla personalizada

11.Cómo crear una cuadrícula personalizada en admin

  1. Cómo crear un formulario usando el componente UI y guardar y redirigir a la cuadrícula

Me gustaría compartir el código fuente con todos los chicos

Pramod Kharade
fuente
¿Cuál es tu pregunta? ¿Cuál es el problema?
Sohel Rana
@SohelRana Señor, soy nuevo en magento 2. Básicamente, los nuevos candidatos obtienen varios problemas mientras desarrollan el Módulo personalizado, así que pensé en compartir mi código fuente que ayudará a alguien. Si tiene alguna sugerencia para mí, hágamelo saber.
Pramod Kharade
@PramodKharade para mejorar la claridad de su pregunta y recibir una mayor reputación en esta pila, puede valer la pena preguntar y responder a cada uno de estos puntos como preguntas separadas. Su respuesta es exactamente lo que he estado buscando para resolver muchos problemas, pero es bastante difícil de encontrar usando el motor de búsqueda stackexchange.
Joshua Flood
@ JoshuaFlood gracias. la próxima vez hablaré sobre un nuevo concepto con preguntas y respuestas separadas. Por favor vote por ans para que ayude a otros lectores.
Pramod Kharade
Estoy obteniendo el 404, ¿hay algún otro paso que deba hacer?
Vivek Pandian

Respuestas:

18

Espacio de nombres: Mastering \ Itdesire

1. Cómo Crear Módulo

Mastering / 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>

Mastering / Itdesire / Registration.php

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

2. Cómo instalar y actualizar la base de datos:

Instalar esquema:

Mastering / 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 datos:

Mastering / 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 actualización:

Mastering / 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();
    }
}

Datos de actualización:

Mastering / 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.Cómo crear modelos, ver y capas de controlador

Controlador :

Mastering / 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;
    }

}

Mastering / 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);
    }

}

Mastering / 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>

Mastering / 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 y API:

Mastering / 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);
    }
}

Mastering / 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');
    }

}

Mastering / 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);
    }
}

Mastering / 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);
    }
}

Mastering / 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();
    }

}

Vista:

Mastering / 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();
    }
}

Mastering / 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. Cómo crear el comando CLI de Magento:

Mastering / Itdesire / Console / Command / 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. Cómo configurar la tarea programada en Magento 2:

Mastering / 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();
        }

    }
}

Mastering / 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>

Mastering / 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>

Mastering / 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. Cómo crear una entrada de menú:

Mastering / 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. Cómo crear un recurso ACL:

Mastering / 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. Cómo implementar API web en Magento con tabla personalizada:

Mastering / 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>

Mastering / 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>

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Pramod Kharade
fuente
2
Puede obtener todo el código fuente aquí también: github.com/pramodkharade/Magento2
Pramod Kharade
Hola @Pramod :) Excelente respuesta! Todavía estoy un poco confundido sobre mi problema particular. ¿Tendría que implementar esta misma solución si mi objetivo fuera asignar un código de descuento a un producto aleatorio diferente cada semana? ¿O podría almacenar y recuperar datos sobre el producto de esa semana sin usar una API? Mi pregunta está aquí: magento.stackexchange.com/questions/212734/… ¡ Gracias de nuevo!
Joshua Flood
@PramodKharade ItemFactory no existe en el modelo
Masud Shaikh
Cuando ejecuté el comando de actualización recibí el error [ReflectionException] Class Mastering \ Itdesire \ Console \ Command \ AddItem no existe @PramodKharade
Masud Shaikh
pero no ha explicado el funcionamiento del código :(
Rahul Singh
5

11.Cuadro personalizado en el administrador como se continúa aquí, excediendo la longitud del archivo en las respuestas anteriores :

Mastering / 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>

Mastering / 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>

Mastering / 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>

Mastering / 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
        );
    }
}

ingrese la descripción de la imagen aquí

12.Cómo crear un formulario con el componente UI y guardar y redirigir a la cuadrícula

Mastering / 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>

Mastering / 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>

Mastering / 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;
    }
}

Mastering / 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);
    }
}

Mastering / 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');
    }
}

ingrese la descripción de la imagen aquí

Pramod Kharade
fuente
1
Hola @Pramod Kharade :). Acabo de notar que su primera respuesta sube al paso 8. pero esta respuesta continúa en el paso 11. ¿Le faltan pasos o hubo un error tipográfico?
Joshua Flood
Hola, ¿cómo puedo agregar acciones de edición y eliminación en la columna de cuadrícula?
Ashna
Sí, podemos agregarlo.
Pramod Kharade