Wednesday, 16 January 2019

Grid in magento 2


1. Create registration.php file.
-----------------------------------------------
<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Krupa_Customcontact',
    __dir__
);

2. Define module.xml file. in etc directory
---------------------------------------------------------------
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNameSchemaLocation ="urn:magento:framework:Module/etc/module.xsd">
    <module name="Krupa_Customcontact" setup_version="2.2.2">
        <sequence>
            <module name="Magento_Contact"/>
        </sequence>
    </module>   
</config>

3. Create setup script (setup/InstallSchema.php)
-------------------------------------------------------------
<?php
namespace Krupa\Customcontact\Setup;

use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

class InstallSchema implements \Magento\Framework\Setup\InstallSchemaInterface {
   
    public function install(
        SchemaSetupInterface $setup,
        ModuleContextInterface $context
    ) {
        $installer = $setup;
       
        $installer->startSetup();
       
        $table = $installer->getConnection()
                ->newTable($installer->getTable('customcontact'))
                ->addColumn(
                    'entity_id',
                    \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                    null,
                    ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary'=>true ],
                    'Entity Id'
                )
                ->addColumn(
                    'name',
                    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                    150,
                    ['unsigned'=>true, 'nullable' => false],
                    'Name'
                )
                ->addColumn(
                    'email',
                    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                    150,
                    ['nullable' => false],
                    'Email'
                )
                ->addColumn(
                    'telephone',
                    \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                    null,
                    ['unsigned'=>true, 'nullable' => false],
                    'Telephone'
                )
                ->addColumn(
                    'comment',
                    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                    '64K',
                    ['nullable' => false],
                    'Comment'
                )
                ->setComment('Custom Contact');
               
        $installer->getConnection()->createTable($table);
       
        $installer->endSetup();
    }
   
}

4. Create a front end router (etc/frontend/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="standard">
        <route id="customcontact" frontName="customcontact">
            <module name='Krupa_Customcontact'/>
        </route>
    </router>
</config>

5. Create a front end Di.xml file
------------------------------------------------
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
   
    <type name="Magento\Contact\Controller\Index\Post">
        <plugin name="custom_contact_action" type="Krupa\Customcontact\Plugin\Post"/>
    </type>
</config>

6. create a Plugin
----------------------------------
<?php

namespace Krupa\Customcontact\Plugin;

class Post
{
    /**
* contact Factory
*
* @var \Krupa\Customcontact\Model\CustomcontactFactory
*/
protected $_contactsFactory;
   
    /**
     * @var \Magento\Framework\Controller\Result\RedirectFactory
     */
    protected $resultRedirectFactory;

    /**
     * @var \Magento\Framework\Message\ManagerInterface
     */
    protected $messageManager;

    /**
     * @var \Magento\Framework\Translate\Inline\StateInterface
     */
    protected $inlineTranslation;

    /**
     * @var \Magento\Framework\Mail\Template\TransportBuilder
     */
    protected $transportBuilder;

    /**
     * Core store config
     *
     * @var \Magento\Framework\App\Config\ScopeConfigInterface
     */
    protected $scopeConfig;

    /**
     * Post constructor.
     *
     * @param \Magento\Framework\Controller\Result\RedirectFactory $resultRedirectFactory
     * @param \Magento\Framework\Message\ManagerInterface $messageManager
     * @param \Magento\Framework\Translate\Inline\StateInterface $inlineTranslation
     * @param \Magento\Framework\Mail\Template\TransportBuilder $transportBuilderd
     * @param \Krupa\Customcontact\Model\CustomcontactFactory $contactFactory
     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
     */
    public function __construct(
        \Magento\Framework\Controller\Result\RedirectFactory $resultRedirectFactory,
        \Magento\Framework\Message\ManagerInterface $messageManager,
        \Magento\Framework\Translate\Inline\StateInterface $inlineTranslation,
        \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
        \Krupa\Customcontact\Model\CustomcontactFactory $contactFactory,
        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
    ) {
        $this->_contactsFactory           = $contactFactory;
        $this->resultRedirectFactory = $resultRedirectFactory;
        $this->messageManager = $messageManager;
        $this->inlineTranslation = $inlineTranslation;
        $this->transportBuilder = $transportBuilder;
        $this->scopeConfig = $scopeConfig;
    }

    /**
     * @param \Magento\Contact\Controller\Index\Post $subject
     * @return $this|void
     */
    public function aroundExecute(
        \Magento\Contact\Controller\Index\Post $subject
    ) {

        $post = $subject->getRequest()->getPostValue();
       // var_dump($post); die;
        if (!$post) {
            return $this->resultRedirectFactory->create()->setPath('customcontact/index/index');
        }
        $this->inlineTranslation->suspend();
        try {
            $postObject = new \Magento\Framework\DataObject();
            $postObject->setData($post);

            $error = false;

            if (!\Zend_Validate::is(trim($post['name']), 'NotEmpty')) {
                $error = true;
            }
            if (!\Zend_Validate::is(trim($post['comment']), 'NotEmpty')) {
                $error = true;
            }
            if (!\Zend_Validate::is(trim($post['email']), 'EmailAddress')) {
                $error = true;
            }
            /* if (\Zend_Validate::is(trim($post['hideit']), 'NotEmpty')) {
                $error = true;
            } */
            if ($error) {
                throw new \Exception();
            }
            $contact  = $this->_contactsFactory->create();
            $contact->setName($post['name']);
            $contact->setEmail($post['email']);
            $contact->setTelephone($post['telephone']);
            $contact->setComment($post['comment']);
               
            $contact->save();
           
           /* $storeScope = \Magento\Store\Model\ScopeInterface::SCOPE_STORE;
            $transport = $this->transportBuilder
                ->setTemplateIdentifier($this->scopeConfig->getValue(\Magento\Contact\Controller\Index\Post::XML_PATH_EMAIL_TEMPLATE, $storeScope))
                ->setTemplateOptions(
                    [
                        'area' => \Magento\Backend\App\Area\FrontNameResolver::AREA_CODE,
                        'store' => \Magento\Store\Model\Store::DEFAULT_STORE_ID,
                    ]
                )
                ->setTemplateVars(['data' => $postObject])
                ->setFrom($this->scopeConfig->getValue(\Magento\Contact\Controller\Index\Post::XML_PATH_EMAIL_SENDER, $storeScope))
                ->addTo($this->scopeConfig->getValue(\Magento\Contact\Controller\Index\Post::XML_PATH_EMAIL_RECIPIENT, $storeScope))
                ->setReplyTo($post['email'])
                ->getTransport();

            $transport->sendMessage();
            $this->inlineTranslation->resume();*/
            $this->messageManager->addSuccess(
                __('Thanks for contacting us with your comments and questions. We\'ll respond to you very soon.')
            );
            return $this->resultRedirectFactory->create()->setPath('customcontact/index/index');
        } catch (\Exception $e) {
            //$this->inlineTranslation->resume();
            $this->messageManager->addError(
                __('We can\'t process your request right now. Sorry, that\'s all we know.')
            );
            return $this->resultRedirectFactory->create()->setPath('customcontact/index/index');
        }
    }
}

7. create a front controller index action
--------------------------------------------------------
<?php
namespace Krupa\Customcontact\Controller\Index;

class Index extends \Magento\Framework\App\Action\Action
{
    protected $forwardFactory;
    protected $pageFactory;
   
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPagefactory
    ) {
        $this->pageFactory = $resultPagefactory;
        return parent::__construct($context);
    }
   
    public function execute() {
        //echo 'hello ';
        $resultPage = $this->pageFactory->create();
$resultPage->addHandle('contact_index_index'); //loads the layout of module_custom_customlayout.xml file with its name
return $resultPage;        
    }
}

8. Create di.xml file. in etc
--------------------------------------------

<?xml version='1.0' ?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <!-- create virtualType ContactGridDataProvider -->
   
    <virtualType name="ContactGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider">
        <arguments>
            <argument name="collection" xsi:type="object" shared="false">Krupa\Customcontact\Model\ResourceModel\Customcontact\Collection</argument>
            <argument name="filterpool" xsi:type="object" shared="false"> ContactGridFilterPool</argument>
        </arguments>
    </virtualType>

 
    <!-- create ContactGridFilterPool -->
   
    <virtualType name="ContactGridFilterPool" type="Magento\Framework\View\Element\UiComponent\DataProvider\FilterPool">
        <arguments>
            <argument name="appliers" xsi:type="array">
                <item name="regular" xsi:type="object">Magento\Framework\View\Element\UiComponent\DataProvider\RegularFilter</item>
                <item name="fulltext" xsi:type="object">Magento\Framework\View\Element\UiComponent\DataProvider\FulltextFilter</item>
            </argument>
        </arguments>
    </virtualType>


   
    <!-- type for contacts_listing_data_source -->
    <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="contacts_listing_data_source" xsi:type="string">Krupa\Customcontact\Model\ResourceModel\Customcontact\Grid\Collection</item>
            </argument>
        </arguments>
    </type>


   
    <!-- simulate Krupa\Customcontact\Model\ResourceModel\Customcontact\Grid\Collection -->
    <virtualType name="Krupa\Customcontact\Model\ResourceModel\Customcontact\Grid\Collection" type ="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
        <arguments>
            <argument name="mainTable" xsi:type="string">customcontact</argument>
<argument name="eventPrefix" xsi:type="string">contact_grid_collection</argument>
            <argument name="eventObject" xsi:type="string">contact_grid_collection</argument>
            <argument name="resourceModel" xsi:type="string">Krupa\Customcontact\Model\ResourceModel\Customcontact\Collection</argument>
        </arguments>
    </virtualType>


   
</config>

9.  create admin route (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="customcontact" frontName="customcontact">
            <module name="Krupa_Customcontact" before="Magento_Backend"/>
        </route>
    </router>
</config>

10. Create admin menu
-------------------------------
<?xml version="1.0" ?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instamce" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
    <menu>
        <add id ="Krupa_Customcontact::contacts" title="Contact Manager" module="Krupa_Customcontact" sortOrder='10' resource="Krupa_Customcontact::contacts" />
        <add id ="Krupa_Customcontact::contact" title="contacts" module="Krupa_Customcontact" sortOrder='1' resource="Krupa_Customcontact::contact" action="customcontact/index/index" parent="Krupa_Customcontact::contacts" />     
    </menu>
</config>

11. Create admin action
--------------------------------------------
<?php
namespace Krupa\Customcontact\Controller\Adminhtml\Index;

class Index extends \Magento\Backend\App\Action
{
   
     /**
     * Page result factory
     *
     * @var \Magento\Framework\View\Result\PageFactory
     */
    protected $_resultPageFactory; 
    /**
     * Page factory
     *
     * @var \Magento\Backend\Model\View\Result\Page
     */
    protected $_resultPage;
   
    public function __construct(
        \Magento\Backend\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory
       
    ){
         parent::__construct($context);
         $this->_resultPageFactory = $resultPageFactory;
       
    }
   
    public function execute()
    {
        /* echo 'hello admin';
        exit; */
$this->_setPageData();
        return $this->getResultPage();
    }
   
    public function getResultPage(){
        if(is_null($this->_resultPage)){
            $this->_resultPage = $this->_resultPageFactory->create();
        }
        return $this->_resultPage;
    }
   
    public function _setPageData(){
        $resultPage = $this->getResultPage();
        $resultPage->setActiveMenu('Krupa_Customcontact::contacts');
       
$title = 'View Contacts';
$resultPage->getConfig()->getTitle()->prepend($title);
       
        $resultPage->addBreadcrumb(__('Krupa'), __('Krupa'));
        $resultPage->addBreadcrumb(__('Contacts'), __('View Contacts'));

        return $this;
    }
   
}

12. Create admin layout (view/adminhtml/layout/customcontact_index_index)
--------------------------------------------------------------------------
<?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">
    <update handle='styles'/>
   
    <body>
       
        <referenceBlock name='menu'>
            <action method='setActiveMenu'>
                <argument name='itemId' xsi:type='string'> Krupa_Customcontact::contacts</argument>
            </action>
        </referenceBlock>
       
        <referenceBlock name='page.title'>
            <action method='setTitleClass'>
                <argument name='class' xsi:type='string'>complex</argument>
            </action>
        </referenceBlock>
       
        <referenceContainer name='content'>
            <uiComponent name='contacts_listing' />
        </referenceContainer>
       
    </body>
   
</page>

12. Create Ui listing for grid (view/adminhtml/ui_component/contacts_listing.xml)
----------------------------------------------------------------------
<?xml version='1.0' ?>
<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">contacts_listing.contacts_listing_data_source</item>
            <item name="deps" xsi:type="string">contacts_listing.contacts_listing_data_source</item>   
        </item>
        <item name="spinner" xsi:type="string">contact_colums</item>
       
    </argument>
   
    <dataSource name="contacts_listing_data_source">
        <argument name="dataProvider" xsi:type="configurableObject">
            <argument name="class" xsi:type="string">ContactGridDataProvider</argument>
            <argument name="name" xsi:type="string">contacts_listing_data_source</argument>
            <argument name="primaryFieldName" xsi:type="string">entity_id</argument>
            <argument name="requestFieldName" xsi:type="string">entity_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>
        </argument>
       
        <bookmark name="bookmarks">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="storageConfig" xsi:type="array">
                        <item name="namespace" xsi:type="string">contacts_listing</item>
                    </item>
                </item>
            </argument>
        </bookmark>
       
        <component name="columns_control">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="columnsData" xsi:type="array">
                        <item name="provider" xsi:type="string">
                            contacts_listing.contacts_listing.contact_colums
                        </item>
                    </item>
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/controls/columns</item>
                    <item name="displayArea" xsi:type="string">dataGridAction</item>
                </item>
            </argument>
        </component>
       
        <exportButton name="export_button">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="selectProvider" xsi:type="array">
                        contacts_listing.contacts_listing.contact_colums.ids
                    </item>
                </item>
            </argument>           
        </exportButton>
       
        <filterSearch name="fulltext" />
        <filters name="listing_filters"/>
             
        <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">contacts_listing.contacts_listing.listing_top.bookmarks</item>
                        <item name="namespace" xsi:type="string">current.paging</item>
                    </item>
                    <item name="selectProvider" xsi:type="string">contacts_listing.contacts_listing.contact_colums.ids</item>
                </item>
            </argument>
        </paging>
       
    </container>
   
    <columns name="contact_colums">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="storageConfig" xsi:type="array">
                    <item name="provider" xsi:type="string">contacts_listing.contacts_listing.listing_top.bookmarka</item>
                    <item name="namespace" xsi:type="string">current</item>
                </item>
           
                <!-- <item name="editorConfig" xsi:type="array">
                    <item name="selectorProvider" xsi:type="string">contacts_listing.contacts_listing.contact_colums.ids</item>
                    <item name="enabled" xsi:type="boolean"> true</item>
                    <item name="indexField" xsi:type="string">entity_id</item>
                    <item name="clientConfig" xsi:type="array">
                        <item name="saveUrl" xsi:type="url" path="events/events/inlineEdit"/>
                        <item name="ValidateBeforeSave" xsi:type="boolean">true</item>
                    </item>
                </item> -->
               
                <item name="childDefaults" xsi:type="array">
                    <item name="fieldAction" xsi:type="array">
                        <item name="provider" xsi:type="string">contacts_listing.contacts_listing.contact_colums_editor</item>
                        <item name="target" xsi:type="string">startEdit</item>
                        <item name="params" xsi:type="array">
                            <item name="0" xsi:type="string">${ $.$data.rowIndex }</item>
                            <item name="1" xsi:type="boolean">true</item>
                        </item>
                    </item>
                    <item name="storageConfig" xsi:type="array">
                        <item name="provider" xsi:type="string">contacts_listing.contacts_listing.listing_top.bookmarks</item>
                        <item name="root" xsi:type="string">columns.${ $.index }</item>
                        <item name="namespace" xsi:type="string">current.${ $.storageConfig.root}</item>
                    </item>
                </item>
            </item>
        </argument>
       
        <selectionsColumn name='ids'>
            <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">55</item>
                    <item name="indexField" xsi:type="string">entity_id</item>
                </item>
            </argument>
        </selectionsColumn>
       
        <column name="entity_id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">textRange</item>
                    <item name="sorting" xsi:type="string">asc</item>
                    <item name="label" xsi:type="string" translate="true">ID</item>
                </item>
            </argument>
        </column>
       
        <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="editor" xsi:type="array">
                        <item name="editorType" xsi:type="string">text</item>
                        <item name="validation" xsi:type="array">
                            <item name="required-entry" xsi:type="boolean">true</item>
                        </item>
                    </item>
                    <item name="label" xsi:type="string" translate="true">Name</item>
                </item>
            </argument>
        </column>
       
        <column name="email">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <!-- <item name="visible" xsi:type="boolean">true</item> -->
                    <item name="label" xsi:type="string" translate="true">E-mail</item>
<!-- <item name="editor" xsi:type="array">
                        <item name="editorType" xsi:type="string">text</item>
                        <item name="validation" xsi:type="array">
                            <item name="required-entry" xsi:type="boolean">true</item>
                        </item>
                    </item> -->
                    <item name="dataType" xsi:type="string">text</item>
                </item>
            </argument>
        </column>
        <column name="telephone">
            <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">Telephone</item>
<!-- <item name="editor" xsi:type="array">
                        <item name="editorType" xsi:type="string">text</item>
                        <item name="validation" xsi:type="array">
                            <item name="required-entry" xsi:type="boolean">true</item>
                        </item>
                    </item> -->
                    <item name="dataType" xsi:type="string">text</item>
                </item>
            </argument>
        </column>
<column name="comment">
            <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">Comment</item>
<!-- <item name="editor" xsi:type="array">
                        <item name="editorType" xsi:type="string">text</item>
                        <item name="validation" xsi:type="array">
                            <item name="required-entry" xsi:type="boolean">true</item>
                        </item>
                    </item> -->
                    <item name="dataType" xsi:type="string">text</item>
                </item>
            </argument>
        </column>     
    </columns>
   
</listing>

13. Create model
----------------------------
<?php
namespace Krupa\Customcontact\Model;

class Customcontact extends \Magento\Framework\Model\AbstractModel implements \Magento\Framework\DataObject\IdentityInterface {
   
    protected $_cacheTag ='customcontact';
   
    protected $_eventPrefix ='customcontact';
   
    protected function _construct(){
        $this->_init('Krupa\Customcontact\Model\ResourceModel\Customcontact');
    }
   
    /**
     * Get identities
     *
     * @return array
     */
public function getIdentities()
{
return [self::CACHE_TAG .'_'.$this->getId()];
}
/**
     * get entity default values
     *
     * @return array
     */
public function getDefaultvalues()
{
$values =[];
return $values;
}
}

14. Create resource model
---------------------------------------
<?php

namespace Krupa\Customcontact\Model\ResourceModel;

class Customcontact extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
                       
{
    public function __construct(
        \Magento\Framework\Model\ResourceModel\Db\Context $context
    ) {
        parent::__construct($context);
    }
   
    protected function _construct()
    {
        $this->_init('customcontact','entity_id');
    }
   
   
public function getConatctNameById($id)
{
$adapter = $this->getConnection();
$select = $adapter->select()
->from($this->getMainTabel(),'name')
->where('entity_id : (int)$id');
$binds = ['entity_id'=> (int)$id];
return $adapter->fetchOne($select,$binds);
}


protected function _beforeSave(\Magento\Framework\Model\AbstractModel $object)
{
return parent::_beforeSave($object);
}
}

15. create collection
-------------------------
<?php

namespace Krupa\Customcontact\Model\ResourceModel\Customcontact;

class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
    /**
     * ID Field Name
     * 
     * @var string
     */
protected $_idFieldName ='entity_id';
  /**
     * Event prefix
     * 
     * @var string
     */

protected $_eventPrefix = 'contact_collection';
/**
     * Event object
     * 
     * @var string
     */

protected $_eventObject ='contact_collection';
    
      
    protected function _construct()
    {
        $this->_init('Krupa\Customcontact\Model\Customcontact','Krupa\Customcontact\Model\ResourceModel\Customcontact');
    }
    
    /**
* Get SQL for get recoed count.
* Extra GROUP BY strip added. 
*
* @return \Magento\Framework\DB\Select
*/

public function getSelectCountSql()
{
$countSelect = Parent::getSelectCountSql();
return $countSelect;
}

/**
     * @param string $valueField
     * @param string $labelField
     * @param array $additional
     * @return array
     */
    protected function _toOptionArray($valueField = 'entity_id', $labelField = 'name', $additional = [])
    {
        return parent::_toOptionArray($valueField, $labelField, $additional);
    }
}

16 create grid collection
--------------------------------
<?php
namespace Krupa\Customcontact\Model\ResourceModel\Customcontact\Grid;

class Collection extends \Krupa\Customcontact\Model\ResourceModel\Customcontact\Collection implements \Magento\Framework\Api\Search\SearchResultInterface
{
/**
* Aggregations
*
    * @var \Magento\Framework\Search\AggregationInterface
*/
protected $_aggregations;

/**
* constructor
*
* @ param \magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory
* @ param \Psr\Log\LoggerInterface $logger
* @ param \magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchstrategy
* @ param \magento\Framework\Event\ManagerInterface $eventManager
* @ param $mainTable
* @ param $eventPrefix
* @ param $eventObject
* @ param $resourceModel
* @ param $model
* @ param $connection
*
* @ param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource
*/
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,
$mainTable,
$eventPrefix,
    $eventObject,
    $resourceModel,
    $model ='Magento\Framework\View\Element\UiComponnet\DataProvider\Document',
    $connection = null,
\Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource =null
)
{
parent::__construct($entityFactory,$logger,$fetchstrategy,$eventManager, $connection, $resource);
$this->_eventPrefix = $eventPrefix;
$this->_eventObject = $eventObject;
$this->_init($model,$resourceModel);
$this->setMainTable($mainTable);

}
/**
*
* @ return \Magento\Framework\Search\AggregationInterface
*
*/

public function getAggregations()
{
return $this->_aggregations;
}

/**
* @ param \Magento\Framework\Api\Search\SearchResultInterface
* @ return $this
*
*/

public function setAggregations($aggregations)
{
$_aggregations = $aggregations;
}

/**
* Retrive all ids for collection
* Backward Compatibility with EAV collection
*
* @param int $limit
* @param int $offset
* @return array
*
*/

public function getAllIds($limit=null,$offset=null)
{
return $this->getConnection()->fetchCol($this->_getAllIdsSelect($limit,$offset),$this->_bindParams);
}

/**
* Get Search Criteria.
*
* @ return \Magento\Framework\Api\SearchCriteriaInterface |null
*
*/
public function getSearchCriteria()
{
return null;
}

/**
* Set Search Criteria
*
* @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
* @return $this
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*
*/
public function setSearchCriteria(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria =null)
{
return $this;
}

/**
* Get total count.
*
* @return int
*
*/

public function getTotalCount()
{
return $this->getSize();
}

/**
* set total count.
*
* @param int $totalCount
* @return $this
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*
*/
public function setTotalCount($totalCount)
{
return $this;
}

/**
* Set item list.
*
* @param \Magento\Framework\Api\ExtensibleDataInterface[] $items
* @retuen Sthis
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*
*/

public function setItems(array $items = null)
{
return $this;
}
}