DataProvider.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\AdvancedSearch\Model\Recommendations;
  7. use Magento\Framework\App\Config\ScopeConfigInterface;
  8. use Magento\Store\Model\ScopeInterface;
  9. use Magento\Search\Model\QueryInterface;
  10. use Magento\AdvancedSearch\Model\SuggestedQueriesInterface;
  11. /**
  12. * Class DataProvider
  13. */
  14. class DataProvider implements SuggestedQueriesInterface
  15. {
  16. /**
  17. * @deprecated
  18. * @see SuggestedQueriesInterface::SEARCH_RECOMMENDATIONS_ENABLED
  19. */
  20. const CONFIG_IS_ENABLED = 'catalog/search/search_recommendations_enabled';
  21. /**
  22. * @deprecated
  23. * @see SuggestedQueriesInterface::SEARCH_RECOMMENDATIONS_COUNT_RESULTS_ENABLED
  24. */
  25. const CONFIG_RESULTS_COUNT_ENABLED = 'catalog/search/search_recommendations_count_results_enabled';
  26. /**
  27. * @deprecated
  28. * @see SuggestedQueriesInterface::SEARCH_RECOMMENDATIONS_COUNT
  29. */
  30. const CONFIG_RESULTS_COUNT = 'catalog/search/search_recommendations_count';
  31. /**
  32. * @var \Magento\Search\Model\QueryResultFactory
  33. */
  34. private $queryResultFactory;
  35. /**
  36. * @var \Magento\Catalog\Model\Layer
  37. */
  38. protected $searchLayer;
  39. /**
  40. * @var ScopeConfigInterface
  41. */
  42. private $scopeConfig;
  43. /**
  44. * @var \Magento\AdvancedSearch\Model\ResourceModel\RecommendationsFactory
  45. */
  46. private $recommendationsFactory;
  47. /**
  48. * DataProvider constructor.
  49. *
  50. * @param ScopeConfigInterface $scopeConfig
  51. * @param \Magento\Catalog\Model\Layer\Resolver $layerResolver
  52. * @param \Magento\AdvancedSearch\Model\ResourceModel\RecommendationsFactory $recommendationsFactory
  53. * @param \Magento\Search\Model\QueryResultFactory $queryResultFactory
  54. */
  55. public function __construct(
  56. ScopeConfigInterface $scopeConfig,
  57. \Magento\Catalog\Model\Layer\Resolver $layerResolver,
  58. \Magento\AdvancedSearch\Model\ResourceModel\RecommendationsFactory $recommendationsFactory,
  59. \Magento\Search\Model\QueryResultFactory $queryResultFactory
  60. ) {
  61. $this->scopeConfig = $scopeConfig;
  62. $this->searchLayer = $layerResolver->get();
  63. $this->recommendationsFactory = $recommendationsFactory;
  64. $this->queryResultFactory = $queryResultFactory;
  65. }
  66. /**
  67. * Is Results Count Enabled
  68. *
  69. * @return bool
  70. */
  71. public function isResultsCountEnabled()
  72. {
  73. return $this->scopeConfig->isSetFlag(
  74. self::CONFIG_RESULTS_COUNT_ENABLED,
  75. ScopeInterface::SCOPE_STORE
  76. );
  77. }
  78. /**
  79. * @inheritdoc
  80. */
  81. public function getItems(QueryInterface $query)
  82. {
  83. $recommendations = [];
  84. if (!$this->isSearchRecommendationsEnabled()) {
  85. return [];
  86. }
  87. foreach ($this->getSearchRecommendations($query) as $recommendation) {
  88. $recommendations[] = $this->queryResultFactory->create(
  89. [
  90. 'queryText' => $recommendation['query_text'],
  91. 'resultsCount' => $recommendation['num_results'],
  92. ]
  93. );
  94. }
  95. return $recommendations;
  96. }
  97. /**
  98. * Return Search Recommendations
  99. *
  100. * @param QueryInterface $query
  101. * @return array
  102. */
  103. private function getSearchRecommendations(\Magento\Search\Model\QueryInterface $query)
  104. {
  105. $recommendations = [];
  106. if ($this->isSearchRecommendationsEnabled()) {
  107. $productCollection = $this->searchLayer->getProductCollection();
  108. $params = ['store_id' => $productCollection->getStoreId()];
  109. /** @var \Magento\AdvancedSearch\Model\ResourceModel\Recommendations $recommendationsResource */
  110. $recommendationsResource = $this->recommendationsFactory->create();
  111. $recommendations = $recommendationsResource->getRecommendationsByQuery(
  112. $query->getQueryText(),
  113. $params,
  114. $this->getSearchRecommendationsCount()
  115. );
  116. }
  117. return $recommendations;
  118. }
  119. /**
  120. * Is Search Recommendations Enabled
  121. *
  122. * @return bool
  123. */
  124. private function isSearchRecommendationsEnabled()
  125. {
  126. return $this->scopeConfig->isSetFlag(
  127. self::CONFIG_IS_ENABLED,
  128. ScopeInterface::SCOPE_STORE
  129. );
  130. }
  131. /**
  132. * Return Search Recommendations Count
  133. *
  134. * @return int
  135. */
  136. private function getSearchRecommendationsCount()
  137. {
  138. return (int)$this->scopeConfig->getValue(
  139. self::CONFIG_RESULTS_COUNT,
  140. ScopeInterface::SCOPE_STORE
  141. );
  142. }
  143. }