I've created custom Admin Grid with Default Magento's Customer Collection.
I am sharing my code for this.
Vendor/Module/etc/di.xml
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
<arguments>
<argument name="collections" xsi:type="array">
<item name="credit_grid_listing_data_source" xsi:type="string">Magento\Customer\Model\ResourceModel\Customer\Collection</item>
</argument>
</arguments>
</type>
<virtualType name="Magento\Customer\Model\ResourceModel\Customer\Collection" type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
<arguments>
<argument name="mainTable" xsi:type="string">customer_entity</argument>
<argument name="resourceModel" xsi:type="string">Magento\Customer\Model\ResourceModel\Customer</argument>
</arguments>
</virtualType>
<preference for="Vendor\Module\Api\Data\GridInterface" type="Vendor\Module\Model\Grid" />
Below is Layout for adminhtml
<body>
<referenceContainer name="content">
<uiComponent name="credit_grid_listing"/>
</referenceContainer>
</body>
../layout/credit_grid_addrow.xml
<referenceContainer name="content">
<block class="Vednor\Module\Block\Adminhtml\Grid\AddRow" name="add_row" />
</referenceContainer>
ui_component/credit_grid_listing.xml
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Ui/etc/ui_configuration.xsd">
<argument name="data" xsi:type="array">
<item name="js_config" xsi:type="array">
<item name="provider" xsi:type="string">credit_grid_listing.credit_grid_listing_data_source</item>
<item name="deps" xsi:type="string">credit_grid_listing.credit_grid_listing_data_source</item>
</item>
<item name="spinner" xsi:type="string">grid_records_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 New Row</item>
<item name="class" xsi:type="string">primary</item>
<item name="url" xsi:type="string">*/*/addrow</item>
</item>
</item>
</argument>
<dataSource name="credit_grid_listing_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">credit_grid_listing_data_source</argument>
<argument name="primaryFieldName" xsi:type="string">entity_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>
</argument>
</argument>
<argument name="data" xsi:type="array">
<item name="js_config" xsi:type="array">
<item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
</item>
</argument>
</dataSource>
<container name="listing_top">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="template" xsi:type="string">ui/grid/toolbar</item>
<item name="stickyTmpl" xsi:type="string">ui/grid/sticky/toolbar</item>
</item>
</argument>
<bookmark name="bookmarks"/>
<columnsControls name="columns_controls"/>
<filters name="listing_filters">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="columnsProvider" xsi:type="string">credit_grid_listing.credit_grid_listing.grid_records_columns</item>
<item name="storageConfig" xsi:type="array">
<item name="provider" xsi:type="string">credit_grid_listing.credit_grid_listing.listing_top.bookmarks</item>
<item name="namespace" xsi:type="string">current.filters</item>
</item>
<item name="templates" xsi:type="array">
<item name="filters" xsi:type="array">
<item name="select" xsi:type="array">
<item name="component" xsi:type="string">Magento_Ui/js/form/element/ui-select</item>
<item name="template" xsi:type="string">ui/grid/filters/elements/ui-select</item>
</item>
</item>
</item>
<item name="childDefaults" xsi:type="array">
<item name="provider" xsi:type="string">credit_grid_listing.credit_grid_listing.listing_top.listing_filters</item>
<item name="imports" xsi:type="array">
<item name="visible" xsi:type="string">credit_grid_listing.credit_grid_listing.grid_records_columns.${ $.index }:visible</item>
</item>
</item>
</item>
<item name="observers" xsi:type="array">
<item name="column" xsi:type="string">column</item>
</item>
</argument>
</filters>
<massaction name="listing_massaction">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="selectProvider" xsi:type="string">credit_grid_listing.credit_grid_listing.grid_records_columns.ids</item>
<item name="component" xsi:type="string">Magento_Ui/js/grid/tree-massactions</item>
<item name="indexField" xsi:type="string">id</item>
</item>
</argument>
<!-- Mass actions which you want to add in your grid-->
<action name="delete">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">delete</item>
<item name="label" xsi:type="string" translate="true">Delete</item>
<item name="url" xsi:type="url" path="grid/grid/massdelete"/>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Delete</item>
<item name="message" xsi:type="string" translate="true">Do you want to delete selected row record?</item>
</item>
</item>
</argument>
</action>
</massaction>
<paging name="listing_paging">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="storageConfig" xsi:type="array">
<item name="provider" xsi:type="string">credit_grid_listing.credit_grid_listing.listing_top.bookmarks</item>
<item name="namespace" xsi:type="string">current.paging</item>
</item>
<item name="selectProvider" xsi:type="string">credit_grid_listing.credit_grid_listing.grid_records_columns.ids</item>
</item>
</argument>
</paging>
</container>
<columns name="grid_records_columns">
<selectionsColumn name="ids">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="indexField" xsi:type="string">entity_id</item>
<item name="sorting" xsi:type="string">desc</item>
<item name="sortOrder" xsi:type="number">0</item>
</item>
</argument>
</selectionsColumn>
<column name="firstname">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">textRange</item>
<item name="label" xsi:type="string" translate="true">firstname</item>
</item>
</argument>
</column>
<column name="lastname" >
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">false</item>
<item name="label" xsi:type="string" translate="true">lastname</item>
</item>
</argument>
</column>
<actionsColumn name="actions" class="Vendor\Module\Ui\Component\Listing\Grid\Column\Action">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="resizeEnabled" xsi:type="boolean">false</item>
<item name="resizeDefaultWidth" xsi:type="string">107</item>
<item name="indexField" xsi:type="string">id</item>
</item>
</argument>
</actionsColumn>
</columns>
../Model/ResourceModel/Grid.php
protected function _construct()
{
$this->_init('customer_entity', 'entity_id');
}
../Model/Grid.php
protected function _construct()
{
$this->_init('Vendor\Module\Model\ResourceModel\Grid');
}
public function getEntityId()
{
return $this->getData(self::ENTITY_ID);
}
public function setEntityId($entityId)
{
return $this->setData(self::ENTITY_ID, $entityId);
}
public function getFirstname()
{
return $this->getData(self::FIRSTNAME);
}
public function setFirstname($firstName)
{
return $this->setData(self::FIRSTNAME, $firstName);
}
public function getLastname()
{
return $this->getData(self::LASTNAME);
}
public function setLastname($lastName)
{
return $this->setData(self::LASTNAME, $lastName);
}
../Controller/Adminhtml/Grid/AddRow.php
public function execute()
{
$rowId = (int) $this->getRequest()->getParam('id');
$rowData = $this->gridFactory->create();
if ($rowId) {
$rowData = $rowData->load($rowId);
$rowTitle = $rowData->getFirstname().' '.$rowData->getLastname();
if (!$rowData->getFirstName()) {
$this->messageManager->addError(__('row data no longer exist.'));
$this->_redirect('credit/grid/rowdata');
return;
}
}
$this->coreRegistry->register('row_data', $rowData);
$resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE);
$title = $rowId ? __('Edit Customer ').$rowTitle : __('Add Row Data');
$resultPage->getConfig()->getTitle()->prepend($title);
return $resultPage;
}
../Block/Adminhtml/Grid/Edit/Form.php
protected function _prepareForm()
{
$id = $this->request->getParam('id');
$dateFormat = $this->_localeDate->getDateFormat(\IntlDateFormatter::SHORT);
$model = $this->_coreRegistry->registry('row_data');
//print_r($model->getData()); exit;
$form = $this->_formFactory->create(
['data' => [
'id' => 'edit_form',
'enctype' => 'multipart/form-data',
'action' => $this->getData('action'),
'method' => 'post'
]
]
);
$form->setHtmlIdPrefix('troogrid__');
if ($model->getFirstName()) {
$fieldset = $form->addFieldset(
'base_fieldset',
['legend' => __('Edit Customer Social Details'), 'class' => 'fieldset-wide']
);
$fieldset->addField('entity_id', 'hidden', ['name' => 'entity_id']);
} else {
$fieldset = $form->addFieldset(
'base_fieldset',
['legend' => __('Add Row Data'), 'class' => 'fieldset-wide']
);
}
$fieldset->addField(
'First Name',
'text',
[
'name' => 'firstname',
'label' => __('First Name'),
'value' => 'Data',
'id' => 'firstname',
'title' => __('First Name'),
'class' => 'required-entry',
'required' => true
]
);
$fieldset->addField(
'Last Name',
'text',
[
'name' => 'lastname',
'label' => __('Last Name'),
'id' => 'lastname',
'title' => __('Last Name'),
'class' => 'required-entry',
'required' => true,
]
);
$form->setValues($model->getData());
$form->setUseContainer(true);
$this->setForm($form);
return parent::_prepareForm();
//return $form;
}
Now, If i am printing model than it will return me all details but when i edit row data isn't filling up with form.
Is there anything i am missing with this ??
Also Model can also able to update data.
but fails to render data.