📊 Magento 2 Custom Admin Grids – Display Data in Backend
Want to show a list of your custom entity records in the Magento admin panel? You need a custom admin grid. Magento 2 provides a powerful UI component system that helps you display data with filters, sorting, actions, and even inline editing.
🎯 What We’ll Build
We’ll create a grid to list all “Notices” added via our custom module, with columns like ID, Title, Status, and Actions (Edit/Delete).
🗂 Folder Structure Overview
app/code/Vendor/AdminGrid/ ├── view/adminhtml/ui_component/notice_listing.xml ├── Controller/Adminhtml/Notice/Index.php ├── view/adminhtml/layout/notice_index.xml ├── Model/ResourceModel/Notice/Collection.php ├── registration.php, module.xml
🔧 Example: UI Component Grid XML
This file defines the structure and behavior of the grid.
<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">notice_listing.notice_listing_data_source</item> <item name="deps" xsi:type="string">notice_listing.notice_listing_data_source</item> </item> <item name="spinner" xsi:type="string">notice_columns</item> </argument> <dataSource name="notice_listing_data_source"> <argument name="dataProvider" xsi:type="configurableObject"> <argument name="class" xsi:type="string">Vendor\AdminGrid\Model\Notice\DataProvider</argument> <argument name="name" xsi:type="string">notice_listing_data_source</argument> <argument name="primaryFieldName" xsi:type="string">id</argument> <argument name="requestFieldName" xsi:type="string">id</argument> </argument> </dataSource> <columns name="notice_columns"> <column name="id"> <settings> <label translate="true">ID</label> <sortable>true</sortable> </settings> </column> <column name="title"> <settings> <label translate="true">Title</label> <sortable>true</sortable> </settings> </column> <column name="status"> <settings> <label translate="true">Status</label> <options> <option name="1" xsi:type="array"> <item name="value" xsi:type="number">1</item> <item name="label" xsi:type="string">Enabled</item> </option> <option name="0" xsi:type="array"> <item name="value" xsi:type="number">0</item> <item name="label" xsi:type="string">Disabled</item> </option> </options> </settings> </column> </columns> </listing>
🧠 Controller for Grid Page
/* File: Controller/Adminhtml/Notice/Index.php */ namespace Vendor\AdminGrid\Controller\Adminhtml\Notice; use Magento\Backend\App\Action; use Magento\Framework\View\Result\PageFactory; class Index extends Action { protected $resultPageFactory; public function __construct(Action\Context $context, PageFactory $resultPageFactory) { parent::__construct($context); $this->resultPageFactory = $resultPageFactory; } public function execute() { $resultPage = $this->resultPageFactory->create(); $resultPage->setActiveMenu('Vendor_AdminGrid::notice'); $resultPage->getConfig()->getTitle()->prepend(__('Notices')); return $resultPage; } }
📦 Layout File
<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="notice_listing"/> </referenceContainer> </body> </page>
📋 Data Provider for Grid
/* File: Model/Notice/DataProvider.php */ namespace Vendor\AdminGrid\Model\Notice; use Magento\Ui\DataProvider\AbstractDataProvider; class DataProvider extends AbstractDataProvider { public function __construct( $name, $primaryFieldName, $requestFieldName, \Vendor\AdminGrid\Model\ResourceModel\Notice\CollectionFactory $collectionFactory, array $meta = [], array $data = [] ) { $this->collection = $collectionFactory->create(); parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data); } public function getData() { return ['items' => $this->collection->getItems(), 'totalRecords' => $this->collection->getSize()]; } }
✅ Summary
- Magento 2 Admin Grids are based on UI Components
- They require XML for layout and UI definition
- Controllers, layout XML, and data providers link everything
Admin grids are perfect for managing and listing data quickly in Magento’s backend. You can add mass actions, export options, and filters too!