Skip to content

Commit 19b0c89

Browse files
dhorytskyiigrybkov
authored andcommitted
MAGETWO-72863: Attribute values on store view level not searchable
1 parent 87e96d3 commit 19b0c89

File tree

5 files changed

+140
-12
lines changed

5 files changed

+140
-12
lines changed

app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/DataProvider.php

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -307,28 +307,40 @@ public function getProductAttributes($storeId, array $productIds, array $attribu
307307
foreach ($attributeTypes as $backendType => $attributeIds) {
308308
if ($attributeIds) {
309309
$tableName = $this->getTable('catalog_product_entity_' . $backendType);
310-
$selects[] = $this->connection->select()->from(
311-
['t_default' => $tableName],
312-
[$linkField, 'attribute_id']
310+
311+
$select = $this->connection->select()->from(
312+
['t' => $tableName],
313+
[
314+
$linkField => 't.' . $linkField,
315+
'attribute_id' => 't.attribute_id',
316+
'value' => $this->unifyField($ifStoreValue, $backendType),
317+
]
313318
)->joinLeft(
314319
['t_store' => $tableName],
315320
$this->connection->quoteInto(
316-
't_default.' . $linkField . '=t_store.' . $linkField .
317-
' AND t_default.attribute_id=t_store.attribute_id' .
321+
't.' . $linkField . '=t_store.' . $linkField .
322+
' AND t.attribute_id=t_store.attribute_id' .
318323
' AND t_store.store_id = ?',
319324
$storeId
320325
),
321-
['value' => $this->unifyField($ifStoreValue, $backendType)]
322-
)->where(
323-
't_default.store_id = ?',
324-
0
326+
[]
327+
)->joinLeft(
328+
['t_default' => $tableName],
329+
$this->connection->quoteInto(
330+
't.' . $linkField . '=t_default.' . $linkField .
331+
' AND t.attribute_id=t_default.attribute_id' .
332+
' AND t_default.store_id = ?',
333+
0
334+
),
335+
[]
325336
)->where(
326-
't_default.attribute_id IN (?)',
337+
't.attribute_id IN (?)',
327338
$attributeIds
328339
)->where(
329-
't_default.' . $linkField . ' IN (?)',
340+
't.' . $linkField . ' IN (?)',
330341
array_keys($productLinkFieldsToEntityIdMap)
331-
);
342+
)->distinct();
343+
$selects[] = $select;
332344
}
333345
}
334346

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\CatalogSearch\Model\Indexer\Fulltext\Action;
7+
8+
class DataProviderTest extends \PHPUnit\Framework\TestCase
9+
{
10+
/**
11+
* @magentoDataFixture Magento/CatalogSearch/_files/product_for_search.php
12+
* @magentoDbIsolation disabled
13+
*/
14+
public function testSearchProductByAttribute()
15+
{
16+
/** @var $objectManager \Magento\TestFramework\ObjectManager */
17+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
18+
19+
$config = $objectManager->create(\Magento\Framework\Search\Request\Config::class);
20+
/** @var \Magento\Framework\Search\Request\Builder $requestBuilder */
21+
$requestBuilder = $objectManager->create(
22+
\Magento\Framework\Search\Request\Builder::class,
23+
['config' => $config]
24+
);
25+
$requestBuilder->bind('search_term', 'VALUE1');
26+
$requestBuilder->setRequestName('quick_search_container');
27+
$queryRequest = $requestBuilder->create();
28+
/** @var \Magento\Framework\Search\Adapter\Mysql\Adapter $adapter */
29+
$adapter = $objectManager->create(\Magento\Framework\Search\Adapter\Mysql\Adapter::class);
30+
$queryResponse = $adapter->query($queryRequest);
31+
$actualIds = [];
32+
foreach ($queryResponse as $document) {
33+
/** @var \Magento\Framework\Api\Search\Document $document */
34+
$actualIds[] = $document->getId();
35+
}
36+
37+
/** @var \Magento\Catalog\Model\Product $product */
38+
$product = $objectManager->create(\Magento\Catalog\Model\ProductRepository::class)->get('simple');
39+
$this->assertContains($product->getId(), $actualIds, 'Product not found by searchable attribute.');
40+
}
41+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
require 'searchable_attribute.php';
8+
require __DIR__ . '/../../../Magento/Catalog/_files/product_simple.php';
9+
10+
/** @var $objectManager \Magento\TestFramework\ObjectManager */
11+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
12+
13+
/** @var \Magento\Store\Model\StoreManager $storeManager */
14+
$storeManager = $objectManager->get(\Magento\Store\Model\StoreManager::class);
15+
$storeManager->setIsSingleStoreModeAllowed(false);
16+
/** @var \Magento\Store\Model\Store $store */
17+
$store = $storeManager->getStore('default');
18+
19+
/** @var \Magento\Catalog\Model\Product $product */
20+
$product = $objectManager->create(\Magento\Catalog\Model\ProductRepository::class)->get('simple');
21+
/** @var \Magento\Catalog\Model\Product\Action $productAction */
22+
$productAction = $objectManager->create(\Magento\Catalog\Model\Product\Action::class);
23+
$productAction->updateAttributes([$product->getId()], ['test_searchable_attribute' => 'VALUE1'], $store->getId());
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+
7+
/** @var $objectManager \Magento\TestFramework\ObjectManager */
8+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
9+
$registry = $objectManager->get(\Magento\Framework\Registry::class);
10+
11+
$registry->unregister('isSecureArea');
12+
$registry->register('isSecureArea', true);
13+
14+
/** @var \Magento\Catalog\Model\Product $product */
15+
$product = $objectManager->create(\Magento\Catalog\Model\ProductRepository::class)->get('simple');
16+
/** @var \Magento\Catalog\Model\ResourceModel\Product $productResource */
17+
$productResource = $objectManager->create(\Magento\Catalog\Model\ResourceModel\Product::class);
18+
$productResource->delete($product);
19+
20+
$eavSetupFactory = $objectManager->create(\Magento\Eav\Setup\EavSetupFactory::class);
21+
/** @var \Magento\Eav\Setup\EavSetup $eavSetup */
22+
$eavSetup = $eavSetupFactory->create();
23+
$eavSetup->removeAttribute(\Magento\Catalog\Model\Product::ENTITY, 'test_searchable_attribute');
24+
25+
$registry->unregister('isSecureArea');
26+
$registry->register('isSecureArea', false);
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+
7+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
8+
$eavSetupFactory = $objectManager->create(\Magento\Eav\Setup\EavSetupFactory::class);
9+
/** @var \Magento\Eav\Setup\EavSetup $eavSetup */
10+
$eavSetup = $eavSetupFactory->create();
11+
$eavSetup->addAttribute(
12+
\Magento\Catalog\Model\Product::ENTITY,
13+
'test_searchable_attribute',
14+
[
15+
'label' => 'Test-attribute',
16+
'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE,
17+
'required' => 0,
18+
'user_defined' => 1,
19+
'searchable' => 1,
20+
'visible_on_front' => 1,
21+
'filterable_in_search' => 1,
22+
'used_in_product_listing' => 1,
23+
'is_used_in_grid' => 1,
24+
'is_filterable_in_grid' => 1,
25+
]
26+
);

0 commit comments

Comments
 (0)