How to create custom Module Development in magento 2 from Scratch?
Namespace: Mastering\Itdesire
1.How to Create Module
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.How to Install and Upgrade Database :
Install Schema :
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();
}
}
Install Data :
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();
}
}
Upgrade Schema :
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();
}
}
Upgrade Data :
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.How to Create Model,view and Controller Layers
Controller :
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>
Model, Resource Model and 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();
}
}
View :
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.How to create Magento CLI command :
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.How to Configure scheduled task in 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.How to create Menu entry :
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.How to Create ACL resource :
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.How to Implement web API in Magento with custom table :
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>
11.Custom Grid In admin as continued here exceeding length of file in above ans:
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
);
}
}
12.How to create Form Using UI component and save and redirect to Grid
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');
}
}