I have created one module about product question.
Issue: When I click on any column for sort, it gives result once or twice.
But when I click three times, it gives the grid with all same data.
Same issue as, Magento Grid Component not Sorting Correctly
But my di.xml is different than above question's answer so I can't figure out.
My di.xml file is as below:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
<type name="Magento\Backend\Controller\Adminhtml\Index\GlobalSearch">
 <arguments>
 <argument name="searchModules" xsi:type="array">
 <item name="prince_productquestions_question" xsi:type="array">
 <item name="class" xsi:type="string">Prince\Productquestions\Model\Adminhtml\Search\Question</item>
 <item name="acl" xsi:type="string">Prince_Productquestions::question</item>
 </item>
 </argument>
 </arguments>
</type>
<virtualType name="PrinceProductquestionsGirdFilterPool" 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 name="Prince\Productquestions\Model\ResourceModel\Question\Grid\Collection">
 <arguments>
 <argument name="mainTable" xsi:type="string">prince_productquestions_question</argument>
 <argument name="eventPrefix" xsi:type="string">prince_productquestions_question_grid_collection</argument>
 <argument name="eventObject" xsi:type="string">question_grid_collection</argument>
 <argument name="resourceModel" xsi:type="string">Prince\Productquestions\Model\ResourceModel\Question</argument>
 </arguments>
</type>
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
 <arguments>
 <argument name="collections" xsi:type="array">
 <item name="prince_productquestions_question_listing_data_source" xsi:type="string">Prince\Productquestions\Model\ResourceModel\Question\Grid\Collection</item>
 </argument>
 </arguments>
</type>
 </config>
Where I am doing wrong ?
Thanks in advanced !
EDIT
File Name : prince_productquestions_question_listing.xml
Location : Prince/Productquestions/view/adminhtml/ui_component/
<?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">prince_productquestions_question_listing.prince_productquestions_question_listing_data_source</item>
 <item name="deps" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_listing_data_source</item>
 </item>
 <item name="spinner" xsi:type="string">prince_productquestions_question_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 Question</item>
 <item name="class" xsi:type="string">primary</item>
 <item name="url" xsi:type="string">*/*/new</item>
 </item>
 </item>
</argument>
<dataSource name="prince_productquestions_question_listing_data_source">
 <argument name="dataProvider" xsi:type="configurableObject">
 <argument name="class" xsi:type="string">Prince\Productquestions\Ui\Component\DataProvider</argument>
 <argument name="name" xsi:type="string">prince_productquestions_question_listing_data_source</argument>
 <argument name="primaryFieldName" xsi:type="string">question_id</argument>
 <argument name="requestFieldName" xsi:type="string">question_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">question_id</item> 
 </item>
 </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>
<listingToolbar name="listing_top">
 <argument name="data" xsi:type="array">
 <item name="config" xsi:type="array">
 <item name="sticky" xsi:type="boolean">true</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">prince_productquestions_question_listing</item>
 </item>
 </item>
 </argument>
 </bookmark>
 <component 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">prince_productquestions_question_listing.prince_productquestions_question_listing.prince_productquestions_question_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>
 </component>
 <exportButton name="export_button">
 <argument name="data" xsi:type="array">
 <item name="config" xsi:type="array">
 <item name="selectProvider" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_listing.prince_productquestions_question_columns.ids</item>
 </item>
 </argument>
 </exportButton>
 <filterSearch name="fulltext">
 <argument name="data" xsi:type="array">
 <item name="config" xsi:type="array">
 <item name="provider" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_listing_data_source</item>
 <item name="chipsProvider" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_listing.listing_top.listing_filters_chips</item>
 <item name="storageConfig" xsi:type="array">
 <item name="provider" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_listing.listing_top.bookmarks</item>
 <item name="namespace" xsi:type="string">current.search</item>
 </item>
 </item>
 </argument>
 </filterSearch>
 <filters name="listing_filters">
 <argument name="data" xsi:type="array">
 <item name="config" xsi:type="array">
 <item name="columnsProvider" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_listing.prince_productquestions_question_columns</item>
 <item name="storageConfig" xsi:type="array">
 <item name="provider" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_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">prince_productquestions_question_listing.prince_productquestions_question_listing.listing_top.listing_filters</item>
 <item name="imports" xsi:type="array">
 <item name="visible" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_listing.prince_productquestions_question_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">prince_productquestions_question_listing.prince_productquestions_question_listing.prince_productquestions_question_columns.ids</item>
 <item name="indexField" xsi:type="string">question_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="prince_productquestions/question/massDelete"/>
 <item name="confirm" xsi:type="array">
 <item name="title" xsi:type="string" translate="true">Delete Questions</item>
 <item name="message" xsi:type="string" translate="true">Are you sure you wan't to delete selected Questions?</item>
 </item>
 </item>
 </argument>
 </action>
 <action name="edit">
 <argument name="data" xsi:type="array">
 <item name="config" xsi:type="array">
 <item name="type" xsi:type="string">edit</item>
 <item name="label" xsi:type="string" translate="true">Edit</item>
 <item name="callback" xsi:type="array">
 <item name="provider" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_listing.prince_productquestions_question_columns_editor</item>
 <item name="target" xsi:type="string">editSelected</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">prince_productquestions_question_listing.prince_productquestions_question_listing.listing_top.bookmarks</item>
 <item name="namespace" xsi:type="string">current.paging</item>
 </item>
 <item name="selectProvider" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_listing.prince_productquestions_question_columns.ids</item>
 </item>
 </argument>
 </paging>
</listingToolbar>
<columns name="prince_productquestions_question_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">prince_productquestions_question_listing.prince_productquestions_question_listing.listing_top.bookmarks</item>
 <item name="namespace" xsi:type="string">current</item>
 </item>
 <item name="editorConfig" xsi:type="array">
 <item name="selectProvider" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_listing.prince_productquestions_question_columns.ids</item>
 <item name="enabled" xsi:type="boolean">true</item>
 <item name="indexField" xsi:type="string">question_id</item>
 <item name="clientConfig" xsi:type="array">
 <item name="saveUrl" xsi:type="url" path="prince_productquestions/question/inlineEdit"/>
 <item name="validateBeforeSave" xsi:type="boolean">false</item>
 </item>
 </item>
 <item name="childDefaults" xsi:type="array">
 <item name="fieldAction" xsi:type="array">
 <item name="provider" xsi:type="string">prince_productquestions_question_listing.prince_productquestions_question_listing.prince_productquestions_question_columns_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">prince_productquestions_question_listing.prince_productquestions_question_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">question_id</item>
 </item>
 </argument>
 </selectionsColumn>
 <column name="question_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="product_id">
 <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">Product 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">Username</item>
 <item name="dataType" xsi:type="string">text</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="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">Email</item>
 <item name="dataType" xsi:type="string">text</item>
 </item>
 </argument>
 </column>
 <column name="subject">
 <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="string">text</item>
 <item name="label" xsi:type="string" translate="true">Subject</item>
 <item name="dataType" xsi:type="string">text</item>
 </item>
 </argument>
 </column>
 <column name="question">
 <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">Question</item>
 <item name="dataType" xsi:type="string">text</item>
 </item>
 </argument>
 </column>
 <column name="is_private">
 <argument name="data" xsi:type="array">
 <item name="options" xsi:type="object">Magento\Config\Model\Config\Source\Yesno</item>
 <item name="config" xsi:type="array">
 <item name="filter" xsi:type="string">select</item>
 <item name="editor" xsi:type="array">
 <item name="editorType" xsi:type="string">select</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">Is Private</item>
 <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
 <item name="dataType" xsi:type="string">select</item>
 </item>
 </argument>
 </column>
 <column name="status">
 <argument name="data" xsi:type="array">
 <item name="options" xsi:type="object">Prince\Productquestions\Model\Question\Source\Status</item>
 <item name="config" xsi:type="array">
 <item name="filter" xsi:type="string">select</item>
 <item name="editor" xsi:type="array">
 <item name="editorType" xsi:type="string">select</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">Status</item>
 <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
 <item name="dataType" xsi:type="string">select</item>
 </item>
 </argument>
 </column>
 <column name="posted_on">
 <argument name="data" xsi:type="array">
 <item name="config" xsi:type="array">
 <item name="filter" xsi:type="string">dateRange</item>
 <item name="editor" xsi:type="array">
 <item name="editorType" xsi:type="string">date</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">Posted On</item>
 <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/date</item>
 <item name="dataType" xsi:type="string">date</item>
 </item>
 </argument>
 </column>
 <column name="created_at" class="Magento\Ui\Component\Listing\Columns\Date">
 <argument name="data" xsi:type="array">
 <item name="config" xsi:type="array">
 <item name="filter" xsi:type="string">dateRange</item>
 <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/date</item>
 <item name="dataType" xsi:type="string">date</item>
 <item name="label" xsi:type="string" translate="true">Created</item>
 </item>
 </argument>
 </column>
 <column name="updated_at" class="Magento\Ui\Component\Listing\Columns\Date">
 <argument name="data" xsi:type="array">
 <item name="config" xsi:type="array">
 <item name="filter" xsi:type="string">dateRange</item>
 <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/date</item>
 <item name="dataType" xsi:type="string">date</item>
 <item name="label" xsi:type="string" translate="true">Modified</item>
 </item>
 </argument>
 </column>
 <actionsColumn name="actions" class="Prince\Productquestions\Ui\Component\Listing\Column\QuestionActions">
 <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">question_id</item>
 </item>
 </argument>
 </actionsColumn>
</columns>
</listing>
- 
 show your grid codePriyank– Priyank2017年04月26日 06:19:18 +00:00Commented Apr 26, 2017 at 6:19
- 
 I have read that sorting is default in Admin grid columns. If not, where should that grid code is. In which path, grid code should be ? So I can find that file.Prince– Prince2017年04月26日 06:25:07 +00:00Commented Apr 26, 2017 at 6:25
- 
 have you created your grid using ui_component ? then post that code the error seems to be there.Priyank– Priyank2017年04月26日 06:30:08 +00:00Commented Apr 26, 2017 at 6:30
- 
 Ok. I have edited the quetion.Prince– Prince2017年04月26日 06:36:20 +00:00Commented Apr 26, 2017 at 6:36
- 
 show your layout file how you have displayed your grid.Priyank– Priyank2017年04月26日 06:38:34 +00:00Commented Apr 26, 2017 at 6:38
1 Answer 1
I assume You are joining product collection with your custom collection which is causing issue
try placing product_id in your storegeconfig and try
 <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">
 <!-- Change this --> 
 <item name="indexField" xsi:type="string">product_id</item> 
 </item>
 </item>
</argument>
- 
 Thanks @userpk, it works ! There was also some issue in /Ui/Component/DataProvider.php file. After edit, sorting problem is solved.Prince– Prince2017年04月26日 07:16:49 +00:00Commented Apr 26, 2017 at 7:16