Skip to content

Commit e02fe8e

Browse files
ENGCOM-8204: #274 Admin Global Search: Search categories #28588
- Merge Pull Request #28588 from FredericMartinez/magento2:global_search_categories - Merged commits: 1. 86fb80c 2. 5025776 3. 72dc2dd 4. 20d6fdf 5. 3f37b18 6. 104685a 7. f12c4e9 8. 2e88be5 9. 41ac919 10. cd4bc05 11. 1a69c20 12. 3c2c5ee
2 parents 51b53be + 3c2c5ee commit e02fe8e

File tree

5 files changed

+199
-0
lines changed

5 files changed

+199
-0
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
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\CatalogSearch\Model\Search;
9+
10+
use Magento\Backend\Helper\Data;
11+
use Magento\Catalog\Api\CategoryListInterface;
12+
use Magento\Framework\Api\FilterBuilder;
13+
use Magento\Framework\Api\SearchCriteriaBuilder;
14+
use Magento\Framework\Api\SearchCriteriaBuilderFactory;
15+
use Magento\Framework\DataObject;
16+
use Magento\Framework\Stdlib\StringUtils;
17+
18+
/**
19+
* Search model for backend search
20+
*/
21+
class Category extends DataObject
22+
{
23+
/**
24+
* @var Data
25+
*/
26+
private $adminhtmlData = null;
27+
28+
/**
29+
* @var CategoryListInterface
30+
*/
31+
private $categoryRepository;
32+
33+
/**
34+
* @var FilterBuilder
35+
*/
36+
private $filterBuilder;
37+
38+
/**
39+
* @var SearchCriteriaBuilderFactory
40+
*/
41+
private $searchCriteriaBuilderFactory;
42+
43+
/**
44+
* @var StringUtils
45+
*/
46+
private $string;
47+
48+
/**
49+
* @var SearchCriteriaBuilder|void
50+
*/
51+
private $searchCriteriaBuilder;
52+
53+
/**
54+
* @param Data $adminhtmlData
55+
* @param CategoryListInterface $categoryRepository
56+
* @param SearchCriteriaBuilder $searchCriteriaBuilder
57+
* @param SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory
58+
* @param FilterBuilder $filterBuilder
59+
* @param StringUtils $string
60+
*/
61+
public function __construct(
62+
Data $adminhtmlData,
63+
CategoryListInterface $categoryRepository,
64+
SearchCriteriaBuilder $searchCriteriaBuilder,
65+
SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory,
66+
FilterBuilder $filterBuilder,
67+
StringUtils $string
68+
) {
69+
$this->adminhtmlData = $adminhtmlData;
70+
$this->categoryRepository = $categoryRepository;
71+
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
72+
$this->searchCriteriaBuilderFactory = $searchCriteriaBuilderFactory;
73+
$this->filterBuilder = $filterBuilder;
74+
$this->string = $string;
75+
}
76+
77+
/**
78+
* Load search results
79+
*
80+
* @return $this
81+
*/
82+
public function load()
83+
{
84+
$result = [];
85+
if (!$this->hasStart() || !$this->hasLimit() || !$this->hasQuery()) {
86+
$this->setResults($result);
87+
return $this;
88+
}
89+
$this->searchCriteriaBuilder = $this->searchCriteriaBuilderFactory->create();
90+
$this->searchCriteriaBuilder->setCurrentPage($this->getStart());
91+
$this->searchCriteriaBuilder->setPageSize($this->getLimit());
92+
$searchFields = ['name'];
93+
94+
$filters = [];
95+
foreach ($searchFields as $field) {
96+
$filters[] = $this->filterBuilder
97+
->setField($field)
98+
->setConditionType('like')
99+
->setValue(sprintf("%%%s%%", $this->getQuery()))
100+
->create();
101+
}
102+
$this->searchCriteriaBuilder->addFilters($filters);
103+
104+
$searchCriteria = $this->searchCriteriaBuilder->create();
105+
$searchResults = $this->categoryRepository->getList($searchCriteria);
106+
107+
foreach ($searchResults->getItems() as $category) {
108+
$description = $category->getDescription() ? strip_tags($category->getDescription()) : '';
109+
$result[] = [
110+
'id' => sprintf('category/1/%d', $category->getId()),
111+
'type' => __('Category'),
112+
'name' => $category->getName(),
113+
'description' => $this->string->substr($description, 0, 30),
114+
'url' => $this->adminhtmlData->getUrl('catalog/category/edit', ['id' => $category->getId()]),
115+
];
116+
}
117+
$this->setResults($result);
118+
return $this;
119+
}
120+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
11+
<test name="AdminCategorySearchTest">
12+
<annotations>
13+
<features value="Search Category"/>
14+
<stories value="Search categories in admin panel"/>
15+
<title value="Search for categories"/>
16+
<description value="Global search in backend can search into Categories."/>
17+
<severity value="MINOR"/>
18+
<group value="Search"/>
19+
<testCaseId value="MC-37809"/>
20+
</annotations>
21+
<before>
22+
<!-- Login as admin -->
23+
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
24+
25+
<!-- Create Simple Category -->
26+
<createData entity="SimpleSubCategory" stepKey="createSimpleCategory"/>
27+
</before>
28+
<after>
29+
<!-- Delete created category -->
30+
<deleteData createDataKey="createSimpleCategory" stepKey="deleteCreatedCategory"/>
31+
32+
<!-- Log out -->
33+
<actionGroup ref="AdminLogoutActionGroup" stepKey="logout"/>
34+
</after>
35+
<!-- Add created category name in the search field-->
36+
<actionGroup ref="AdminSetGlobalSearchValueActionGroup" stepKey="setSearch">
37+
<argument name="textSearch" value="$$createSimpleCategory.name$$"/>
38+
</actionGroup>
39+
40+
<!-- Wait for suggested results-->
41+
<waitForElementVisible selector="{{AdminGlobalSearchSection.globalSearchSuggestedCategoryText}}" stepKey="waitForSuggestions"/>
42+
43+
<!-- Click on suggested result in category URL-->
44+
<click selector="{{AdminGlobalSearchSection.globalSearchSuggestedCategoryLink}}" stepKey="openCategory"/>
45+
46+
<!-- Wait for suggested results-->
47+
<waitForPageLoad stepKey="waitForPageLoad"/>
48+
49+
<!-- Loaded page should be edit page of created category -->
50+
<seeInField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="$$createSimpleCategory.name$$" stepKey="checkCategoryName"/>
51+
</test>
52+
</tests>

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@
6666
<item name="class" xsi:type="string">Magento\CatalogSearch\Model\Search\Catalog</item>
6767
<item name="acl" xsi:type="string">Magento_Catalog::catalog</item>
6868
</item>
69+
<item name="categories" xsi:type="array">
70+
<item name="class" xsi:type="string">Magento\CatalogSearch\Model\Search\Category</item>
71+
<item name="acl" xsi:type="string">Magento_Catalog::categories</item>
72+
</item>
6973
</argument>
7074
</arguments>
7175
</type>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="AdminSetGlobalSearchValueActionGroup">
12+
<arguments>
13+
<argument name="textSearch" type="string" defaultValue=""/>
14+
</arguments>
15+
16+
<click selector="{{AdminGlobalSearchSection.globalSearch}}" stepKey="clickSearchBtn"/>
17+
<waitForElementVisible selector="{{AdminGlobalSearchSection.globalSearchActive}}" stepKey="waitForSearchInputVisible"/>
18+
<fillField selector="{{AdminGlobalSearchSection.globalSearchInput}}" userInput="{{textSearch}}" stepKey="fillSearch"/>
19+
</actionGroup>
20+
</actionGroups>

app/code/Magento/Search/Test/Mftf/Section/AdminGlobalSearchSection.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,8 @@
1111
<section name="AdminGlobalSearchSection">
1212
<element name="globalSearch" type="button" selector=".search-global-label"/>
1313
<element name="globalSearchActive" type="block" selector=".search-global-field._active"/>
14+
<element name="globalSearchInput" type="input" selector=".search-global-input"/>
15+
<element name="globalSearchSuggestedCategoryText" type="text" selector="//span[contains(text(), 'Category')]"/>
16+
<element name="globalSearchSuggestedCategoryLink" type="text" selector="//span[contains(text(), 'Category')]/preceding-sibling::a"/>
1417
</section>
1518
</sections>

0 commit comments

Comments
 (0)