Add filters on a adminhtml grid
On this grid, we will have 2 filters :
– ID
– Name
These filters are added on our XML after the node <container name="columns_controls">
on the file :
app/code/Maxime/Jobs/view/adminhtml/ui_component/jobs_department_listing.xml
<!-- Filters --> <filters name="listing_filters"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing.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">jobs_department_listing.jobs_department_listing.listing_top.listing_filters</item> <item name="imports" xsi:type="array"> <item name="visible" xsi:type="string">jobs_department_listing.jobs_department_listing.listing_top.bookmarks:current.columns.${ $.index }.visible</item> </item> </item> </item> </argument> <!-- Department ID Filter --> <filterRange name="department_id"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="dataScope" xsi:type="string">entity_id</item> <!-- Column name in DB --> <item name="label" xsi:type="string" translate="true">ID</item> <!-- Label on grid --> <item name="childDefaults" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing.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> <!-- Department name Filter --> <filterInput name="department_name"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="dataScope" xsi:type="string">name</item> <!-- Column name in DB --> <item name="label" xsi:type="string" translate="true">Name</item> <!-- Label on grid --> </item> </argument> </filterInput> </filters>
The “ID” filter is “range” type. So we have 2 fields : “from” and “to”.
If you want to filter on only one ID, you must put the same value on the 2 fields.
The “name” filter is a classic text field. The search inside is a “LIKE %%” on SQL.
For your information, the full xml at this step :
<?xml version="1.0" encoding="UTF-8"?> <!-- /** * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ --> <listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <!-- Integration --> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> <!-- we define a provider --> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing_data_source</item> <!-- same string as above --> <item name="deps" xsi:type="string">jobs_department_listing.jobs_department_listing_data_source</item> </item> <!-- define column type --> <item name="spinner" xsi:type="string">jobs_department_columns</item> <!-- Button to add new 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 Department</item> <item name="class" xsi:type="string">primary</item> <item name="url" xsi:type="string">*/*/new</item> <!-- magento will translate it by jobs/department/new --> </item> </item> </argument> <!-- Data source --> <dataSource name="jobs_department_listing_data_source"> <argument name="dataProvider" xsi:type="configurableObject"> <argument name="class" xsi:type="string">DepartmentGridDataProvider</argument> <!-- Data provider class --> <argument name="name" xsi:type="string">jobs_department_listing_data_source</argument> <!-- provider defined above --> <argument name="primaryFieldName" xsi:type="string">entity_id</argument> <!-- Primary key --> <argument name="requestFieldName" xsi:type="string">id</argument> <!-- URL name parameter --> <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"> <!-- Primary key column name --> <item name="indexField" xsi:type="string">entity_id</item> </item> </item> </argument> </argument> </dataSource> <!-- Container Listing Top --> <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> <!-- Button to manage views --> <bookmark name="bookmarks"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="component" xsi:type="string">Magento_Ui/js/grid/controls/bookmarks/bookmarks</item> <item name="displayArea" xsi:type="string">dataGridActions</item> <item name="storageConfig" xsi:type="array"> <item name="saveUrl" xsi:type="url" path="mui/bookmark/save"/> <item name="deleteUrl" xsi:type="url" path="mui/bookmark/delete"/> <item name="namespace" xsi:type="string">jobs_department_listing</item> </item> </item> </argument> </bookmark> <!-- Button to manage columns --> <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">jobs_department_listing.jobs_department_listing.jobs_department_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 --> <filters name="listing_filters"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing.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">jobs_department_listing.jobs_department_listing.listing_top.listing_filters</item> <item name="imports" xsi:type="array"> <item name="visible" xsi:type="string">jobs_department_listing.jobs_department_listing.listing_top.bookmarks:current.columns.${ $.index }.visible</item> </item> </item> </item> </argument> <!-- Department ID Filter --> <filterRange name="department_id"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="dataScope" xsi:type="string">entity_id</item> <!-- Column name in DB --> <item name="label" xsi:type="string" translate="true">ID</item> <!-- Label on grid --> <item name="childDefaults" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing.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> <!-- Department name Filter --> <filterInput name="department_name"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="dataScope" xsi:type="string">name</item> <!-- Column name in DB --> <item name="label" xsi:type="string" translate="true">Name</item> <!-- Label on grid --> </item> </argument> </filterInput> </filters> </container> <!-- Columns --> <columns name="jobs_department_columns"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <!-- Bookmarks behaviour --> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing.listing_top.bookmarks</item> <item name="namespace" xsi:type="string">current</item> </item> <item name="childDefaults" xsi:type="array"> <item name="controlVisibility" xsi:type="boolean">true</item> <!-- Bookmarks behaviour --> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_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> <!-- Add columns with checkboxes --> <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> <!-- ID Column --> <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> <!-- Name 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> <!-- Action columns --> <actionsColumn name="actions" class="Maxime\Jobs\Ui\Component\Listing\Column\DepartmentActions"> <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">entity_id</item> </item> </argument> </actionsColumn> </columns> </listing>
And the Magento display :
Fulltext filter on our grid (search by Keywords)
We will add a new type of filter on Magento 2.
Add the following XML after the “filters” node :
<!-- Filter Search --> <filterSearch name="fulltext"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing_data_source</item> <item name="chipsProvider" xsi:type="string">jobs_department_listing.jobs_department_listing.listing_top.listing_filters_chips</item> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing.listing_top.bookmarks</item> <item name="namespace" xsi:type="string">current.search</item> </item> </item> </argument> </filterSearch>
So you have the following XML :
<?xml version="1.0" encoding="UTF-8"?> <!-- /** * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ --> <listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <!-- Integration --> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> <!-- we define a provider --> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing_data_source</item> <!-- same string as above --> <item name="deps" xsi:type="string">jobs_department_listing.jobs_department_listing_data_source</item> </item> <!-- define column type --> <item name="spinner" xsi:type="string">jobs_department_columns</item> <!-- Button to add new 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 Department</item> <item name="class" xsi:type="string">primary</item> <item name="url" xsi:type="string">*/*/new</item> <!-- magento will translate it by jobs/department/new --> </item> </item> </argument> <!-- Data source --> <dataSource name="jobs_department_listing_data_source"> <argument name="dataProvider" xsi:type="configurableObject"> <argument name="class" xsi:type="string">DepartmentGridDataProvider</argument> <!-- Data provider class --> <argument name="name" xsi:type="string">jobs_department_listing_data_source</argument> <!-- provider defined above --> <argument name="primaryFieldName" xsi:type="string">entity_id</argument> <!-- Primary key --> <argument name="requestFieldName" xsi:type="string">id</argument> <!-- URL name parameter --> <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"> <!-- Primary key column name --> <item name="indexField" xsi:type="string">entity_id</item> </item> </item> </argument> </argument> </dataSource> <!-- Container Listing Top --> <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> <!-- Button to manage views --> <bookmark name="bookmarks"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="component" xsi:type="string">Magento_Ui/js/grid/controls/bookmarks/bookmarks</item> <item name="displayArea" xsi:type="string">dataGridActions</item> <item name="storageConfig" xsi:type="array"> <item name="saveUrl" xsi:type="url" path="mui/bookmark/save"/> <item name="deleteUrl" xsi:type="url" path="mui/bookmark/delete"/> <item name="namespace" xsi:type="string">jobs_department_listing</item> </item> </item> </argument> </bookmark> <!-- Button to manage columns --> <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">jobs_department_listing.jobs_department_listing.jobs_department_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 --> <filters name="listing_filters"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing.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">jobs_department_listing.jobs_department_listing.listing_top.listing_filters</item> <item name="imports" xsi:type="array"> <item name="visible" xsi:type="string">jobs_department_listing.jobs_department_listing.listing_top.bookmarks:current.columns.${ $.index }.visible</item> </item> </item> </item> </argument> <!-- Department ID Filter --> <filterRange name="department_id"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="dataScope" xsi:type="string">entity_id</item> <!-- Column name in DB --> <item name="label" xsi:type="string" translate="true">ID</item> <!-- Label on grid --> <item name="childDefaults" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing.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> <!-- Department name Filter --> <filterInput name="department_name"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="dataScope" xsi:type="string">name</item> <!-- Column name in DB --> <item name="label" xsi:type="string" translate="true">Name</item> <!-- Label on grid --> </item> </argument> </filterInput> </filters> <!-- Filter Search --> <filterSearch name="fulltext"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing_data_source</item> <item name="chipsProvider" xsi:type="string">jobs_department_listing.jobs_department_listing.listing_top.listing_filters_chips</item> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing.listing_top.bookmarks</item> <item name="namespace" xsi:type="string">current.search</item> </item> </item> </argument> </filterSearch> </container> <!-- Columns --> <columns name="jobs_department_columns"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <!-- Bookmarks behaviour --> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_listing.listing_top.bookmarks</item> <item name="namespace" xsi:type="string">current</item> </item> <item name="childDefaults" xsi:type="array"> <item name="controlVisibility" xsi:type="boolean">true</item> <!-- Bookmarks behaviour --> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">jobs_department_listing.jobs_department_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> <!-- Add columns with checkboxes --> <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> <!-- ID Column --> <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> <!-- Name 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> <!-- Action columns --> <actionsColumn name="actions" class="Maxime\Jobs\Ui\Component\Listing\Column\DepartmentActions"> <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">entity_id</item> </item> </argument> </actionsColumn> </columns> </listing>
Now, you can see the new filter :
If you type a keyword like “marketing”, the filter does not work.
We have to declare some columns on database with “fulltext” index.
We will update our module to a new version, and adding these indexes on our UpgradeSchema class.
At the same time, we will create its for the “jobs” table.
Open the file :
app/code/Maxime/Jobs/etc/module.xml
And change module version to 1.0.0.2
Now open the setup :
app/code/Maxime/Jobs/Setup/UpgradeSchema.php
Our update is :
if (version_compare($context->getVersion(), '1.0.0.2') < 0) { /** * Add full text index to our table department */ $tableName = $installer->getTable('maxime_department'); $fullTextIntex = array('name'); // Column with fulltext index, you can put multiple fields $setup->getConnection()->addIndex( $tableName, $installer->getIdxName($tableName, $fullTextIntex, \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT), $fullTextIntex, \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT ); /** * Add full text index to our table jobs */ $tableName = $installer->getTable('maxime_job'); $fullTextIntex = array('title', 'type', 'location', 'description'); // Column with fulltext index, you can put multiple fields $setup->getConnection()->addIndex( $tableName, $installer->getIdxName($tableName, $fullTextIntex, \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT), $fullTextIntex, \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT ); }
For departments, we use only the “name” column.
For jobs, we use many columns : ‘title’, ‘type’, ‘location’, ‘description’.
Here is the full PHP code of the class :
<?php namespace Maxime\Jobs\Setup; use Magento\Framework\Setup\UpgradeSchemaInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\SchemaSetupInterface; use Magento\Framework\DB\Ddl\Table; class UpgradeSchema implements UpgradeSchemaInterface { /** * Upgrades DB schema for a module * * @param SchemaSetupInterface $setup * @param ModuleContextInterface $context * @return void */ public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context) { $installer = $setup; $installer->startSetup(); // Action to do if module version is less than 1.0.0.0 if (version_compare($context->getVersion(), '1.0.0.0') < 0) { /** * Create table 'maxime_jobs' */ $tableName = $installer->getTable('maxime_job'); $tableComment = 'Job management on Magento 2'; $columns = array( 'entity_id' => array( 'type' => Table::TYPE_INTEGER, 'size' => null, 'options' => array('identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true), 'comment' => 'Job Id', ), 'title' => array( 'type' => Table::TYPE_TEXT, 'size' => 255, 'options' => array('nullable' => false, 'default' => ''), 'comment' => 'Job Title', ), 'type' => array( 'type' => Table::TYPE_TEXT, 'size' => 255, 'options' => array('nullable' => false, 'default' => ''), 'comment' => 'Job Type (CDI, CDD...)', ), 'location' => array( 'type' => Table::TYPE_TEXT, 'size' => 255, 'options' => array('nullable' => false, 'default' => ''), 'comment' => 'Job Location', ), 'date' => array( 'type' => Table::TYPE_DATE, 'size' => null, 'options' => array('nullable' => false), 'comment' => 'Job date begin', ), 'status' => array( 'type' => Table::TYPE_BOOLEAN, 'size' => null, 'options' => array('nullable' => false, 'default' => 0), 'comment' => 'Job status', ), 'description' => array( 'type' => Table::TYPE_TEXT, 'size' => 2048, 'options' => array('nullable' => false, 'default' => ''), 'comment' => 'Job description', ), 'department_id' => array( 'type' => Table::TYPE_INTEGER, 'size' => null, 'options' => array('unsigned' => true, 'nullable' => false), 'comment' => 'Department linked to the job', ), ); $indexes = array( 'title', ); $foreignKeys = array( 'department_id' => array( 'ref_table' => 'maxime_department', 'ref_column' => 'entity_id', 'on_delete' => Table::ACTION_CASCADE, ) ); /** * We can use the parameters above to create our table */ // Table creation $table = $installer->getConnection()->newTable($tableName); // Columns creation foreach($columns AS $name => $values){ $table->addColumn( $name, $values['type'], $values['size'], $values['options'], $values['comment'] ); } // Indexes creation foreach($indexes AS $index){ $table->addIndex( $installer->getIdxName($tableName, array($index)), array($index) ); } // Foreign keys creation foreach($foreignKeys AS $column => $foreignKey){ $table->addForeignKey( $installer->getFkName($tableName, $column, $foreignKey['ref_table'], $foreignKey['ref_column']), $column, $foreignKey['ref_table'], $foreignKey['ref_column'], $foreignKey['on_delete'] ); } // Table comment $table->setComment($tableComment); // Execute SQL to create the table $installer->getConnection()->createTable($table); } if (version_compare($context->getVersion(), '1.0.0.2') < 0) { /** * Add full text index to our table department */ $tableName = $installer->getTable('maxime_department'); $fullTextIntex = array('name'); // Column with fulltext index, you can put multiple fields $setup->getConnection()->addIndex( $tableName, $installer->getIdxName($tableName, $fullTextIntex, \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT), $fullTextIntex, \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT ); /** * Add full text index to our table jobs */ $tableName = $installer->getTable('maxime_job'); $fullTextIntex = array('title', 'type', 'location', 'description'); // Column with fulltext index, you can put multiple fields $setup->getConnection()->addIndex( $tableName, $installer->getIdxName($tableName, $fullTextIntex, \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT), $fullTextIntex, \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT ); } $installer->endSetup(); } }
Now, go on the Magento root folder and launch the upgrade shell :
./bin/magento setup:upgrade
Our fulltext indexes are now created, and if you type “marketing” like before, our list is filtered :
You can save a filtered view with the button : “Default view” > “Save view as”
We have finished with filters !
Next time we will add massactions and paging !
how can I get the filters (a object) that I’ve applied to a grid in the backend.
Code from this page causes duplicated fields in filters area.
To solve this problem, you can remove:
1. from “id” column node
textRange
2. from “name” column node
text
Fulltext search is working for one column in a grid.
I was tried for 2 column its not working, is there any limitation like one table can have one column as fulltext.
Also I observed in customer listing page, customer name and email is searchable, but that is not fulltext.
I have add custom date-filter in filter section. But after selection of date filter grid data not updated.Please let me know we need to required to change other place.