Magento 2 create basic module part 1
Today we discuss how in magento 2 create basic module. This tutorial include the complete module sections frontend, admin end, custom model, custom admin grid, custom admin form, frontend controller, admin controller and admin menu. I already posted a tutorial about create a hello world module. Now we will go one step further and create a complete basic module. So let start with our example. My module name is hello world.
Module registration
First you register your module or extension. Create registration.php in following directory
QaisarSatti/HelloWorld/
/**
* Hello World
*
* @category QaisarSatti
* @package QaisarSatti_HelloWorld
* @author Muhammad Qaisar Satti
* @Email qaisarssatti@gmail.com
*
*/
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'QaisarSatti_HelloWorld',
__DIR__
);
Module declaration
First you declare your module or extension. In module.xml you declare your schema_version and setup_version of module that are stored in setup_module table . Now Create module.xml in following directory
QaisarSatti/HelloWorld/etc/
<!--
/**
* Hello World
*
* @category QaisarSatti
* @package QaisarSatti_HelloWorld
* @author Muhammad Qaisar Satti
* @Email qaisarssatti@gmail.com
*
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="QaisarSatti_HelloWorld" schema_version="0.0.1" setup_version="0.0.1"/>
</config>
Module Setup
Now we create custom table sample_posts for module. You can read further on tutorial Magento 2 Create a install Schema. Now we Create InstallSchema.php in following directory
QaisarSatti/HelloWorld/Setup/
/**
* Hello World
*
* @category QaisarSatti
* @package QaisarSatti_HelloWorld
* @author Muhammad Qaisar Satti
* @Email qaisarssatti@gmail.com
*
*/
namespace QaisarSatti\HelloWorld\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 {
public function install( SchemaSetupInterface $setup, ModuleContextInterface $context ) {
$installer = $setup;
$installer->startSetup();
$table = $installer->getConnection()->newTable(
$installer->getTable( 'sample_posts' )
)->addColumn(
'post_id',
Table::TYPE_SMALLINT,
null,
[ 'identity' => true, 'nullable' => false, 'primary' => true ],
'Post ID'
)->addColumn(
'title',
Table::TYPE_TEXT,
255,
[ 'nullable' => false ],
'Post Title'
)->addColumn(
'content',
Table::TYPE_TEXT,
'2M',
[ ],
'Post Content'
)->setComment(
'Sample Post Table'
);
$installer->getConnection()->createTable( $table );
$installer->endSetup();
}
}
Module Model
I already discuss model in Magento 2 create custom model tutorial. So we go to directly creating models file.
Model File
Create HelloWorld.php in following directory
QaisarSatti/HelloWorld/Model/
/**
* Hello World
*
* @category QaisarSatti
* @package QaisarSatti_HelloWorld
* @author Muhammad Qaisar Satti
* @Email qaisarssatti@gmail.com
*
*/
namespace QaisarSatti\HelloWorld\Model;
class HelloWorld extends \Magento\Framework\Model\AbstractModel
{
protected function _construct()
{
$this->_init('QaisarSatti\HelloWorld\Model\ResourceModel\HelloWorld');
}
}
ResouceModel File
Create HelloWorld.php in following directory
QaisarSatti/HelloWorld/Model/ResourceModel/
/**
* Hello World
*
* @category QaisarSatti
* @package QaisarSatti_HelloWorld
* @author Muhammad Qaisar Satti
* @Email qaisarssatti@gmail.com
*
*/
namespace QaisarSatti\HelloWorld\Model\ResourceModel;
use \Magento\Framework\Model\ResourceModel\Db\AbstractDb;
class HelloWorld extends AbstractDb
{
protected function _construct()
{
$this->_init('sample_posts', 'post_id');
}
}
AbstractCollection Model File
Create AbstractCollection.php in following directory
QaisarSatti/HelloWorld/Model/ResourceModel/
/**
* Hello World
*
* @category QaisarSatti
* @package QaisarSatti_HelloWorld
* @author Muhammad Qaisar Satti
* @Email qaisarssatti@gmail.com
*
*/
namespace QaisarSatti\HelloWorld\Model\ResourceModel;
use Magento\Store\Model\Store;
/**
* Abstract collection of CMS pages and blocks
*/
abstract class AbstractCollection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
/**
* Store manager
*
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* @var \Magento\Framework\EntityManager\MetadataPool
*/
protected $metadataPool;
public function __construct(
\Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
\Psr\Log\LoggerInterface $logger,
\Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
\Magento\Framework\Event\ManagerInterface $eventManager,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\EntityManager\MetadataPool $metadataPool,
\Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
\Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
) {
$this->storeManager = $storeManager;
$this->metadataPool = $metadataPool;
parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
}
/**
* Perform operations after collection load
*
* @param string $tableName
* @param string|null $linkField
* @return void
*/
protected function performAfterLoad($tableName, $linkField)
{
$linkedIds = $this->getColumnValues($linkField);
}
/**
* Add field filter to collection
*
* @param array|string $field
* @param string|int|array|null $condition
* @return $this
*/
public function addFieldToFilter($field, $condition = null)
{
return parent::addFieldToFilter($field, $condition);
}
/**
* Add filter by store
*
* @param int|array|Store $store
* @param bool $withAdmin
* @return $this
*/
abstract public function addStoreFilter($store, $withAdmin = true);
/**
* Perform adding filter by store
*
* @param int|array|Store $store
* @param bool $withAdmin
* @return void
*/
protected function performAddStoreFilter($store, $withAdmin = true)
{
if ($store instanceof Store) {
$store = [$store->getId()];
}
if (!is_array($store)) {
$store = [$store];
}
if ($withAdmin) {
$store[] = Store::DEFAULT_STORE_ID;
}
$this->addFilter('store', ['in' => $store], 'public');
}
/**
* Join store relation table if there is store filter
*
* @param string $tableName
* @param string|null $linkField
* @return void
*/
protected function joinStoreRelationTable($tableName, $linkField)
{
if ($this->getFilter('store')) {
$this->getSelect()->join(
['store_table' => $this->getTable($tableName)],
'main_table.' . $linkField . ' = store_table.' . $linkField,
[]
)->group(
'main_table.' . $linkField
);
}
parent::_renderFiltersBefore();
}
/**
* Get SQL for get record count
*
* Extra GROUP BY strip added.
*
* @return \Magento\Framework\DB\Select
*/
public function getSelectCountSql()
{
$countSelect = parent::getSelectCountSql();
$countSelect->reset(\Magento\Framework\DB\Select::GROUP);
return $countSelect;
}
}
Collection Model File
Create Collection.php in following directory
QaisarSatti/HelloWorld/Model/ResouceModel/HelloWorld/
/**
* Hello World
*
* @category QaisarSatti
* @package QaisarSatti_HelloWorld
* @author Muhammad Qaisar Satti
* @Email qaisarssatti@gmail.com
*
*/
namespace QaisarSatti\HelloWorld\Model\ResourceModel\HelloWorld;
use QaisarSatti\HelloWorld\Model\ResourceModel\AbstractCollection;
class Collection extends AbstractCollection
{
/**
* @var string
*/
protected $_idFieldName = 'post_id';
/**
* Load data for preview flag
*
* @var bool
*/
protected $_previewFlag;
/**
* Define resource model
*
* @return void
*/
protected function _construct()
{
$this->_init('QaisarSatti\HelloWorld\Model\HelloWorld', 'QaisarSatti\HelloWorld\Model\ResourceModel\HelloWorld');
}
public function setFirstStoreFlag($flag = false)
{
$this->_previewFlag = $flag;
return $this;
}
/**
* Add filter by store
*
* @param int|array|\Magento\Store\Model\Store $store
* @param bool $withAdmin
* @return $this
*/
public function addStoreFilter($store, $withAdmin = true)
{
return $this;
}
/**
* Perform operations after collection load
*
* @return $this
*/
protected function _afterLoad()
{
return parent::_afterLoad();
}
/**
* Perform operations before rendering filters
*
* @return void
*/
protected function _renderFiltersBefore()
{
return parent::_renderFiltersBefore();
}
}
Now the part 1 is complete now we got part 2 Magento 2 create basic module admin.
5 thoughts on “Magento 2 create basic module part 1”
Leave a Reply
You must be logged in to post a comment.
kindly in model setup ,misspelled from InstallSchema.php to InstallSchema.xml
thanks in anticiapation
Thanks for pointing out mistake.
Its not a mistake ,but a part from an error,
thanks for reply
Hi Dear,Thanks for Your Posts ,Blog is good but today i am very angry upon you,
Because of your spelling mistake, I stuck for last 60 hours in finding the problem because i am a newbie in magento 2 from Islamabad.
Kindly update namespace from “QaisarSatti/HelloWorld/Model/ResouceModel/” to “QaisarSatti/HelloWorld/Model/ResourceModel/”
[not ResouceModel ]
Thanks
I hope you never mind
Thanks for correction and sorry for mistake.