Skip to content

Commit f9be062

Browse files
committed
MAGETWO-91337: Admin global search preview works inconsistently.
- Added fulltext search by title in the CMS pages grid
1 parent 595d271 commit f9be062

File tree

7 files changed

+226
-1
lines changed

7 files changed

+226
-1
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Cms\Ui\Component;
9+
10+
use Magento\Framework\Api\Filter;
11+
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
12+
13+
/**
14+
* Provides extension point to add additional filters to search criteria.
15+
*/
16+
interface AddFilterInterface
17+
{
18+
/**
19+
* Adds custom filter to search criteria builder based on received filter.
20+
*
21+
* @param SearchCriteriaBuilder $searchCriteriaBuilder
22+
* @param Filter $filter
23+
* @return void
24+
*/
25+
public function addFilter(SearchCriteriaBuilder $searchCriteriaBuilder, Filter $filter);
26+
}

app/code/Magento/Cms/Ui/Component/DataProvider.php

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
namespace Magento\Cms\Ui\Component;
77

8+
use Magento\Framework\Api\Filter;
89
use Magento\Framework\Api\FilterBuilder;
910
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
1011
use Magento\Framework\App\ObjectManager;
@@ -19,6 +20,11 @@ class DataProvider extends \Magento\Framework\View\Element\UiComponent\DataProvi
1920
*/
2021
private $authorization;
2122

23+
/**
24+
* @var AddFilterInterface[]
25+
*/
26+
private $additionalFilterPool;
27+
2228
/**
2329
* @param string $name
2430
* @param string $primaryFieldName
@@ -29,6 +35,8 @@ class DataProvider extends \Magento\Framework\View\Element\UiComponent\DataProvi
2935
* @param FilterBuilder $filterBuilder
3036
* @param array $meta
3137
* @param array $data
38+
* @param array $additionalFilterPool
39+
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
3240
*/
3341
public function __construct(
3442
$name,
@@ -39,7 +47,8 @@ public function __construct(
3947
RequestInterface $request,
4048
FilterBuilder $filterBuilder,
4149
array $meta = [],
42-
array $data = []
50+
array $data = [],
51+
array $additionalFilterPool = []
4352
) {
4453
parent::__construct(
4554
$name,
@@ -54,6 +63,7 @@ public function __construct(
5463
);
5564

5665
$this->meta = array_replace_recursive($meta, $this->prepareMetadata());
66+
$this->additionalFilterPool = $additionalFilterPool;
5767
}
5868

5969
/**
@@ -95,4 +105,16 @@ public function prepareMetadata()
95105

96106
return $metadata;
97107
}
108+
109+
/**
110+
* @inheritdoc
111+
*/
112+
public function addFilter(Filter $filter)
113+
{
114+
if (!empty($this->additionalFilterPool[$filter->getField()])) {
115+
$this->additionalFilterPool[$filter->getField()]->addFilter($this->searchCriteriaBuilder, $filter);
116+
} else {
117+
parent::addFilter($filter);
118+
}
119+
}
98120
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Cms\Ui\Component\Page;
9+
10+
use Magento\Cms\Ui\Component\AddFilterInterface;
11+
use Magento\Framework\Api\Filter;
12+
use Magento\Framework\Api\FilterBuilder;
13+
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
14+
15+
/**
16+
* Adds fulltext filter for CMS Page title attribute.
17+
*/
18+
class FulltextFilter implements AddFilterInterface
19+
{
20+
/**
21+
* @var FilterBuilder
22+
*/
23+
private $filterBuilder;
24+
25+
/**
26+
* @param FilterBuilder $filterBuilder
27+
*/
28+
public function __construct(FilterBuilder $filterBuilder)
29+
{
30+
$this->filterBuilder = $filterBuilder;
31+
}
32+
33+
/**
34+
* @inheritdoc
35+
*/
36+
public function addFilter(SearchCriteriaBuilder $searchCriteriaBuilder, Filter $filter)
37+
{
38+
$titleFilter = $this->filterBuilder->setField('title')
39+
->setValue(sprintf('%%%s%%', $filter->getValue()))
40+
->setConditionType('like')
41+
->create();
42+
$searchCriteriaBuilder->addFilter($titleFilter);
43+
}
44+
}

app/code/Magento/Cms/etc/di.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,5 +225,13 @@
225225
<argument name="collectionProcessor" xsi:type="object">Magento\Cms\Model\Api\SearchCriteria\BlockCollectionProcessor</argument>
226226
</arguments>
227227
</type>
228+
229+
<type name="Magento\Cms\Ui\Component\DataProvider">
230+
<arguments>
231+
<argument name="additionalFilterPool" xsi:type="array">
232+
<item name="fulltext" xsi:type="object">Magento\Cms\Ui\Component\Page\FulltextFilter</item>
233+
</argument>
234+
</arguments>
235+
</type>
228236
</config>
229237

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Cms\Controller\Adminhtml;
9+
10+
use Magento\TestFramework\TestCase\AbstractBackendController;
11+
12+
/**
13+
* @magentoDataFixture Magento/Cms/Fixtures/page_list.php
14+
*/
15+
class FulltextGridSearchTest extends AbstractBackendController
16+
{
17+
/**
18+
* Checks a fulltext grid search by CMS page title.
19+
*
20+
* @param string $query
21+
* @param int $expectedRows
22+
* @param array $expectedTitles
23+
* @dataProvider queryDataProvider
24+
*/
25+
public function testSearchByTitle(string $query, int $expectedRows, array $expectedTitles)
26+
{
27+
$url = 'backend/mui/index/render/?namespace=cms_page_listing&search=' . $query;
28+
29+
$this->getRequest()
30+
->getHeaders()
31+
->addHeaderLine('Accept', 'application/json');
32+
$this->dispatch($url);
33+
$response = $this->getResponse();
34+
$data = json_decode($response->getBody(), true);
35+
self::assertEquals($expectedRows, $data['totalRecords']);
36+
37+
$titleList = array_column($data['items'], 'title');
38+
self::assertEquals($expectedTitles, $titleList);
39+
}
40+
41+
/**
42+
* Gets list of variations with different search queries.
43+
*
44+
* @return array
45+
*/
46+
public function queryDataProvider(): array
47+
{
48+
return [
49+
[
50+
'query' => 'simple',
51+
'expectedRows' => 3,
52+
'expectedTitles' => ['simplePage', 'simplePage01', '01simplePage']
53+
],
54+
[
55+
'query' => 'page01',
56+
'expectedRows' => 1,
57+
'expectedTitles' => ['simplePage01']
58+
],
59+
[
60+
'query' => '01simple',
61+
'expectedRows' => 1,
62+
'expectedTitles' => ['01simplePage']
63+
],
64+
];
65+
}
66+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Cms\Api\Data\PageInterface;
9+
use Magento\Cms\Api\PageRepositoryInterface;
10+
use Magento\TestFramework\Helper\Bootstrap;
11+
12+
$objectManager = Bootstrap::getObjectManager();
13+
14+
$data = [
15+
[
16+
'title' => 'simplePage',
17+
'is_active' => 1
18+
],
19+
[
20+
'title' => 'simplePage01',
21+
'is_active' => 1
22+
],
23+
[
24+
'title' => '01simplePage',
25+
'is_active' => 1
26+
],
27+
];
28+
29+
/** @var PageRepositoryInterface $pageRepository */
30+
$pageRepository = $objectManager->get(PageRepositoryInterface::class);
31+
foreach ($data as $item) {
32+
$page = $objectManager->create(PageInterface::class, ['data' => $item]);
33+
$pageRepository->save($page);
34+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Cms\Api\PageRepositoryInterface;
9+
use Magento\Framework\Api\SearchCriteriaBuilder;
10+
use Magento\TestFramework\Helper\Bootstrap;
11+
12+
$objectManager = Bootstrap::getObjectManager();
13+
14+
/** @var PageRepositoryInterface $pageRepository */
15+
$pageRepository = $objectManager->get(PageRepositoryInterface::class);
16+
17+
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
18+
$searchCriteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
19+
$searchCriteria = $searchCriteriaBuilder->addFilter('title', ['simplePage', 'simplePage01', '01simplePage'], 'in')
20+
->create();
21+
$result = $pageRepository->getList($searchCriteria);
22+
23+
foreach ($result->getItems() as $item) {
24+
$pageRepository->delete($item);
25+
}

0 commit comments

Comments
 (0)