Magento – Invalid Method name delete in magento 2

magento2massaction

I'm trying to perform mass delete action on my custom admin grid in Magento 2. but while I try to perform it displays this error.

Exception #0 (Magento\Framework\Exception\LocalizedException): Invalid method Magento\Framework\View\Element\UiComponent\DataProvider\Document::delete

MassDelete.php

<?php
namespace Helios\RequestQuote\Controller\Adminhtml\Post;

use Magento\Framework\Controller\ResultFactory;
use Magento\Backend\App\Action\Context;
use Magento\Ui\Component\MassAction\Filter;
use Helios\RequestQuote\Model\ResourceModel\RequestQuote\CollectionFactory;

class MassDelete extends \Magento\Backend\App\Action
{
/**
 * @var Filter
 */
protected $filter;

/**
 * @var CollectionFactory
 */
protected $collectionFactory;

/**
 * @param Context $context
 * @param Filter $filter
 * @param CollectionFactory $collectionFactory
 */
public function __construct(Context $context, Filter $filter, CollectionFactory $collectionFactory)
{
    $this->filter = $filter;
    $this->collectionFactory = $collectionFactory;
    parent::__construct($context);
}

/**
 * This is Execute Action.
 */
public function execute()
{
    $collection = $this->filter->getCollection($this->collectionFactory->create());
    $collectionSize = $collection->getSize();

    foreach ($collection as $item) {
        $item->delete();
    }

    $this->messageManager->addSuccess(__('A total of %1 record(s) have been deleted.', $collectionSize));

   }
}

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">
    <virtualType name="Helios\RequestQuote\Model\ResourceModel\RequestQuote\Collection" type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
        <arguments>
            <argument name="mainTable" xsi:type="string">requestquote</argument>
            <argument name="resourceModel" xsi:type="string">Helios\RequestQuote\Model\ResourceModel\RequestQuote</argument>
        </arguments>
    </virtualType>
    <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="example_post_grid_data_source" xsi:type="string">Helios\RequestQuote\Model\ResourceModel\RequestQuote\Collection</item>
            </argument>
        </arguments>
    </type>
</config>

Collextion.php

      <?php
  /**
  * Resource Quote Resource Collection
  */
  namespace Helios\RequestQuote\Model\ResourceModel\RequestQuote;

  class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
  {
    /**
    * Resource initialization.
    */
    protected $_idFieldName = 'post_id';

    protected function _construct()
    {
        $this->_init('Helios\RequestQuote\Model\RequestQuote','Helios\RequestQuote\Model\ResourceModel\RequestQuote');
    }
  }

ui_component/layout.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">
      <!--Declare data source, columns list, button...-->
      <argument name="data" xsi:type="array">
          <item name="js_config" xsi:type="array">
              <item name="provider" xsi:type="string">helios_requestquote_grid.example_post_grid_data_source</item>
              <item name="deps" xsi:type="string">helios_requestquote_grid.example_post_grid_data_source</item>
          </item>

          <!--Declare the data source name which will be defined below-->
          <item name="spinner" xsi:type="string">example_post_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 Blog</item>
                  <item name="class" xsi:type="string">primary</item>
                  <item name="url" xsi:type="string">*/*/new</item>
              </item>
          </item>
      </argument>

      <!--The data source-->
      <dataSource name="example_post_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">example_post_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="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
                      <item name="update_url" xsi:type="url" path="mui/index/render"/>
                      <item name="storageConfig" xsi:type="array">
                          <item name="indexField" xsi:type="string">id</item>
                      </item>
                  </item>
              </argument>
          </argument>
      </dataSource>

      <!-- For Creating a container -->
      <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>
      </container>

      <!-- For Displaying Bookmarks -->
      <container name="listing_top">
          <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">helios_requestquote_post_listing</item>
                      </item>
                  </item>
              </argument>
          </bookmark>
      </container>

      <!-- For Displying Paging -->
      <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">helios_requestquote_grid.helios_requestquote_grid.listing_top.bookmarks</item>
                      <item name="namespace" xsi:type="string">current.paging</item>
                  </item>
                  <item name="selectProvider" xsi:type="string">helios_requestquote_grid.helios_requestquote_grid.example_post_columns.ids</item>
              </item>
          </argument>
      </paging>

      <!-- For Displaying Mass Action -->
      <massaction name="listing_massaction">
          <argument name="data" xsi:type="array">
              <item name="config" xsi:type="array">
                  <item name="selectProvider" xsi:type="string">helios_requestquote_grid.helios_requestquote_grid.example_post_columns.ids</item>
                  <item name="component" xsi:type="string">Magento_Ui/js/grid/tree-massactions</item>
                  <item name="indexField" xsi:type="string">post_id</item>
              </item>
          </argument>
          <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="*/*/delete" />
                      <item name="confirm" xsi:type="array">
                          <item name="title" xsi:type="string" translate="true">Delete items</item>
                          <item name="message" xsi:type="string" translate="true">Are you sure to delete selected posts?</item>
                      </item>
                  </item>
              </argument>
          </action>
      </massaction>

      <!-- For Displaying Filters -->
     <filters name="listing_filters">
          <argument name="data" xsi:type="array">
              <item name="config" xsi:type="array">
                  <item name="columnsProvider" xsi:type="string">helios_requestquote_grid.helios_requestquote_grid.example_post_columns</item>
                  <item name="storageConfig" xsi:type="array">
                      <item name="provider" xsi:type="string">helios_requestquote_grid.helios_requestquote_grid.listing_top.bookmarks</item>
                      <item name="namespace" xsi:type="string">current.filters</item>
                  </item>
                  <item name="childDefaults" xsi:type="array">
                      <item name="provider" xsi:type="string">helios_requestquote_grid.helios_requestquote_grid.listing_top.listing_filters</item>
                      <item name="imports" xsi:type="array">
                          <item name="visible" xsi:type="string">helios_requestquote_grid.helios_requestquote_grid.example_post_columns.${ $.index }:visible</item>
                      </item>
                  </item>
              </item>
          </argument>
      </filters>

      <columns name="example_post_columns">
          <!--The list of columns-->
          <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="id">
              <argument name="data" xsi:type="array">
                  <item name="config" xsi:type="array">
                      <item name="filter" xsi:type="string">text</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="sorting" xsi:type="string">asc</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="sorting" xsi:type="string">asc</item>
                      <item name="label" xsi:type="string" translate="true">Email</item>
                  </item>
              </argument>
          </column>
          <column name="company">
              <argument name="data" xsi:type="array">
                  <item name="config" xsi:type="array">
                      <item name="filter" xsi:type="string">text</item>
                      <item name="sorting" xsi:type="string">asc</item>
                      <item name="label" xsi:type="string" translate="true">Company</item>
                  </item>
              </argument>
          </column>
          <column name="phone">
              <argument name="data" xsi:type="array">
                  <item name="config" xsi:type="array">
                      <item name="filter" xsi:type="string">text</item>
                      <item name="sorting" xsi:type="string">asc</item>
                      <item name="label" xsi:type="string" translate="true">Phone</item>
                  </item>
              </argument>
          </column>
          <column name="website">
              <argument name="data" xsi:type="array">
                  <item name="config" xsi:type="array">
                      <item name="filter" xsi:type="string">text</item>
                      <item name="sorting" xsi:type="string">asc</item>
                      <item name="label" xsi:type="string" translate="true">Website</item>
                  </item>
              </argument>
          </column>
          <actionsColumn name="actions">
              <argument name="data" xsi:type="array">
                  <item name="config" xsi:type="array">
                      <item name="indexField" xsi:type="string">id</item>
                      <item name="sortOrder" xsi:type="number">200</item>
                  </item>
              </argument>
          </actionsColumn>
      </columns>
  </listing>

I tried each and every solutions on stack but it's not working.
I tried using custom query at that time it's worknig perfectly but i dont want custom queries.

Best Answer

you need to make change in di.xml file.

Replace this Line: Company\Module\Model\ResourceModel\Test\Collection

Replace With this: Company\Module\Model\ResourceModel\Test\Grid\Collection

In virtual type: you need to add \Grid\ before collection

<virtualType name="Company\Module\Model\ResourceModel\Test\Grid\Collection" type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">

Same in type:

<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="company_module_listing_data_source" xsi:type="string">Company\Module\Model\ResourceModel\Test\Grid\Collection</item>
            </argument>
        </arguments>
    </type>

Run the command : php bin/magento setup:di:compile

Related Topic