I'm working through some ui component issues with an adminhtml ui component/grid I've been trying to get working. Let me toss out the error and then some code. Let me know if I need to post more code/info.
Error:
Fatal error: Method
Magento\Ui\TemplateEngine\Xhtml\Result::__toString() must not throw an
exception, caught TypeError: Argument 1 passed to
Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider::searchResultToOutput()
must implement interface
Magento\Framework\Api\Search\SearchResultInterface, instance of
Wundercarparts\Makeanoffer\Model\ResourceModel\Offers\Collection\Interceptor
given, called in
/var/www/danwcpdev/html/vendor/magento/framework/View/Element/UiComponent/DataProvider/DataProvider.php
on line 284 in
/var/www/danwcpdev/html/vendor/magento/module-ui/Component/Wrapper/UiComponent.php
on line 0
<?xml version="1.0" encoding="UTF-8"?>
<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">offers_ui.offers_ui_listing_data_source</item>
<item name="deps" xsi:type="string">offers_ui.offers_ui_listing_data_source</item>
</item>
<item name="spinner" xsi:type="string">offers_ui_data_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 Offer</item>
<item name="class" xsi:type="string">primary</item>
<item name="url" xsi:type="string">*/*/new</item>
</item>
</item>
</argument>
<dataSource name="offers_ui_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">offers_ui_listing_data_source</argument>
<argument name="primaryFieldName" xsi:type="string">offers_id</argument>
<argument name="requestFieldName" xsi:type="string">offers_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">offers_ui</item>
</item>
</item>
</argument>
</bookmark>
<container name="columns_controls">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="columnsData" xsi:type="array">
<item name="provider" xsi:type="string">offers_ui.offers_ui.offers_ui_data_columns</item>
</item>
<item name="component" xsi:type="string">Magento_Ui/js/grid/controls/columns</item>
<item name="displayArea" xsi:type="string">dataGridActions</item>
</item>
</argument>
</container>
<filters name="listing_filters">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="displayArea" xsi:type="string">dataGridFilters</item>
<item name="dataScope" xsi:type="string">filters</item>
<item name="storageConfig" xsi:type="array">
<item name="provider" xsi:type="string">offers_ui.offers_ui.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">offers_ui.offers_ui.listing_top.listing_filters</item>
<item name="imports" xsi:type="array">
<item name="visible" xsi:type="string">offers_ui.offers_ui.listing_top.bookmarks:current.columns.${ $.index }.visible</item>
</item>
</item>
</item>
</argument>
<filterRange name="offers_id">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataScope" xsi:type="string">offers_id</item>
<item name="label" xsi:type="string" translate="true">ID</item>
<item name="childDefaults" xsi:type="array">
<item name="provider" xsi:type="string">offers_ui.offers_ui.listing_top.listing_filters</item>
</item>
</item>
</argument>
<filterInput name="from">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataScope" xsi:type="string">from</item>
<item name="label" xsi:type="string" translate="true">from</item>
<item name="placeholder" xsi:type="string" translate="true">From</item>
</item>
</argument>
</filterInput>
<filterInput name="to">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataScope" xsi:type="string">to</item>
<item name="label" xsi:type="string" translate="true">to</item>
<item name="placeholder" xsi:type="string" translate="true">To</item>
</item>
</argument>
</filterInput>
</filterRange>
<filterInput name="last_name">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataScope" xsi:type="string">last_name</item>
<item name="label" xsi:type="string" translate="true">Last Name</item>
</item>
</argument>
</filterInput>
<filterInput name="status">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataScope" xsi:type="string">status</item>
<item name="label" xsi:type="string" translate="true">Status</item>
</item>
</argument>
</filterInput>
</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">offers_ui.offers_ui.listing_top.bookmarks</item>
<item name="namespace" xsi:type="string">current.paging</item>
</item>
<item name="selectProvider" xsi:type="string">offers_ui.offers_ui.offers_ui_data_columns.ids</item>
<item name="displayArea" xsi:type="string">bottom</item>
</item>
</argument>
</paging>
</container>
<columns name="offers_ui_data_columns">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="storageConfig" xsi:type="array">
<item name="provider" xsi:type="string">offers_ui.offers_ui.listing_top.bookmarks</item>
<item name="namespace" xsi:type="string">current</item>
</item>
<item name="childDefaults" xsi:type="array">
<item name="fieldAction" xsi:type="array">
<item name="provider" xsi:type="string">offers_ui.offers_ui.offers_ui_data_columns.actions</item>
<item name="target" xsi:type="string">applyAction</item>
<item name="params" xsi:type="array">
<item name="0" xsi:type="string">edit</item>
<item name="1" xsi:type="string">${ $.$data.rowIndex }</item>
</item>
</item>
<item name="storageConfig" xsi:type="array">
<item name="provider" xsi:type="string">offers_ui.offers_ui.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="indexField" xsi:type="string">offers_id</item>
<item name="sortOrder" xsi:type="number">0</item>
</item>
</argument>
</selectionsColumn>
<column name="offers_id">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">text</item>
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item>
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">ID</item>
<item name="sortOrder" xsi:type="number">10</item>
</item>
</argument>
</column>
<column name="first_name">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">text</item>
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item>
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">first_name</item>
<item name="sortOrder" xsi:type="number">20</item>
</item>
</argument>
</column>
<column name="last_name">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">text</item>
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item>
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">last_name</item>
<item name="sortOrder" xsi:type="number">25</item>
</item>
</argument>
</column>
<column name="customer_email">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">text</item>
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item>
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">customer_email</item>
<item name="sortOrder" xsi:type="number">20</item>
</item>
</argument>
</column>
<column name="message">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">text</item>
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item>
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">message</item>
<item name="sortOrder" xsi:type="number">30</item>
</item>
</argument>
</column>
<column name="offer_amount">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">text</item>
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item>
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">Offer</item>
<item name="sortOrder" xsi:type="number">90</item>
</item>
</argument>
</column>
<column name="status">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Wundercarparts\Makeanoffer\Model\Status</item>
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">select</item>
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
<item name="editor" xsi:type="string">select</item>
<item name="dataType" xsi:type="string">select</item>
<item name="label" xsi:type="string" translate="true">Status</item>
<item name="sortOrder" xsi:type="number">100</item>
</item>
</argument>
</column>
<actionsColumn name="actions" class="Wundercarparts\Makeanoffer\Ui\Component\Listing\Column\OffersActions">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="indexField" xsi:type="string">offers_id</item>
<item name="sortOrder" xsi:type="number">200</item>
</item>
</argument>
</actionsColumn>
</columns>
</listing>
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">
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
<arguments>
<argument name="collections" xsi:type="array">
<item name="offers_ui_listing_data_source" xsi:type="string">Wundercarparts\Makeanoffer\Model\ResourceModel\Offers\Collection</item>
</argument>
</arguments>
</type>
<type name="Wundercarparts\Makeanoffer\Model\ResourceModel\Offers\Collection">
<arguments>
<argument name="mainTable" xsi:type="string">wcp_offers</argument>
<argument name="eventPrefix" xsi:type="string">offesr_ui_grid_collection</argument>
<argument name="eventObject" xsi:type="string">offers_grid_collection</argument>
<argument name="resourceModel" xsi:type="string">Wundercarparts\Makeanoffer\Model\ResourceModel\Offers</argument>
</arguments>
</type>
<virtualType name="MenuGirdFilterPool" 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>
<virtualType name="MenuGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider">
<arguments>
<argument name="collection" xsi:type="object" shared="false">Wundercarparts\Makeanoffer\Model\ResourceModel\Offers\Collection</argument>
<argument name="filterPool" xsi:type="object" shared="false">MenuGirdFilterPool</argument>
</arguments>
</virtualType>
</config>
Best Answer
Create a new class called
Wundercarparts\Makeanoffer\Model\ResourceModel\Offers\Grid\Collection
(place it in the proper file to match the file path).The class should look like this
then replace in
di.xml
thiswith this
and this line
with
For this last line, if your Offers collection expects the parameters
mainTable
and others, instead of changing the line, duplicate the section that starts with<type name="Wundercarparts\Makeanoffer\Model\ResourceModel\Offers\Collection">
and then replace the line for the one you just cloned.