mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 09:17:35 +00:00
328 lines
8.5 KiB
PHP
328 lines
8.5 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
namespace Magento\Search\Model;
|
|
|
|
use Magento\Search\Model\ResourceModel\Query\Collection as QueryCollection;
|
|
use Magento\Search\Model\ResourceModel\Query\CollectionFactory as QueryCollectionFactory;
|
|
use Magento\Search\Model\SearchCollectionInterface as Collection;
|
|
use Magento\Search\Model\SearchCollectionFactory as CollectionFactory;
|
|
use Magento\Framework\App\Config\ScopeConfigInterface;
|
|
use Magento\Framework\Data\Collection\AbstractDb as DbCollection;
|
|
use Magento\Framework\Model\AbstractModel;
|
|
use Magento\Framework\Model\ResourceModel\AbstractResource;
|
|
use Magento\Framework\Registry;
|
|
use Magento\Store\Model\StoreManagerInterface;
|
|
|
|
/**
|
|
* Search query model
|
|
*
|
|
* @method \Magento\Search\Model\Query setQueryText(string $value)
|
|
* @method int getNumResults()
|
|
* @method \Magento\Search\Model\Query setNumResults(int $value)
|
|
* @method int getPopularity()
|
|
* @method \Magento\Search\Model\Query setPopularity(int $value)
|
|
* @method string getRedirect()
|
|
* @method \Magento\Search\Model\Query setRedirect(string $value)
|
|
* @method int getDisplayInTerms()
|
|
* @method \Magento\Search\Model\Query setDisplayInTerms(int $value)
|
|
* @method \Magento\Search\Model\Query setQueryNameExceeded(bool $value)
|
|
* @method int getIsActive()
|
|
* @method \Magento\Search\Model\Query setIsActive(int $value)
|
|
* @method int getIsProcessed()
|
|
* @method \Magento\Search\Model\Query setIsProcessed(int $value)
|
|
* @method string getUpdatedAt()
|
|
* @method \Magento\Search\Model\Query setUpdatedAt(string $value)
|
|
* @method \Magento\Search\Model\Query setIsQueryTextExceeded(bool $value)
|
|
* @method \Magento\Search\Model\Query setIsQueryTextShort(bool $value)
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
* @api
|
|
* @since 100.0.2
|
|
*/
|
|
class Query extends AbstractModel implements QueryInterface
|
|
{
|
|
/**
|
|
* Event prefix
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_eventPrefix = 'search_query';
|
|
|
|
/**
|
|
* Event object key name
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_eventObject = 'search_query';
|
|
|
|
const CACHE_TAG = 'SEARCH_QUERY';
|
|
|
|
const XML_PATH_MIN_QUERY_LENGTH = 'catalog/search/min_query_length';
|
|
|
|
const XML_PATH_MAX_QUERY_LENGTH = 'catalog/search/max_query_length';
|
|
|
|
/**
|
|
* Core store config
|
|
*
|
|
* @var ScopeConfigInterface
|
|
*/
|
|
protected $_scopeConfig;
|
|
|
|
/**
|
|
* Store manager
|
|
*
|
|
* @var StoreManagerInterface
|
|
*/
|
|
protected $_storeManager;
|
|
|
|
/**
|
|
* Search collection factory
|
|
*
|
|
* @var CollectionFactory
|
|
*/
|
|
protected $_searchCollectionFactory;
|
|
|
|
/**
|
|
* Query collection factory
|
|
*
|
|
* @var QueryCollectionFactory
|
|
*/
|
|
protected $_queryCollectionFactory;
|
|
|
|
/**
|
|
* Construct
|
|
*
|
|
* @param \Magento\Framework\Model\Context $context
|
|
* @param Registry $registry
|
|
* @param QueryCollectionFactory $queryCollectionFactory
|
|
* @param CollectionFactory $searchCollectionFactory
|
|
* @param StoreManagerInterface $storeManager
|
|
* @param ScopeConfigInterface $scopeConfig
|
|
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
|
|
* @param DbCollection $resourceCollection
|
|
* @param array $data
|
|
*/
|
|
public function __construct(
|
|
\Magento\Framework\Model\Context $context,
|
|
Registry $registry,
|
|
QueryCollectionFactory $queryCollectionFactory,
|
|
CollectionFactory $searchCollectionFactory,
|
|
StoreManagerInterface $storeManager,
|
|
ScopeConfigInterface $scopeConfig,
|
|
AbstractResource $resource = null,
|
|
DbCollection $resourceCollection = null,
|
|
array $data = []
|
|
) {
|
|
$this->_queryCollectionFactory = $queryCollectionFactory;
|
|
$this->_searchCollectionFactory = $searchCollectionFactory;
|
|
$this->_storeManager = $storeManager;
|
|
$this->_scopeConfig = $scopeConfig;
|
|
parent::__construct($context, $registry, $resource, $resourceCollection, $data);
|
|
}
|
|
|
|
/**
|
|
* Init resource model
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function _construct()
|
|
{
|
|
$this->_init(\Magento\Search\Model\ResourceModel\Query::class);
|
|
}
|
|
|
|
/**
|
|
* Retrieve search collection
|
|
*
|
|
* @return Collection
|
|
*/
|
|
public function getSearchCollection()
|
|
{
|
|
return $this->_searchCollectionFactory->create();
|
|
}
|
|
|
|
/**
|
|
* Retrieve collection of suggest queries
|
|
*
|
|
* @return QueryCollection
|
|
* @throws \Magento\Framework\Exception\NoSuchEntityException
|
|
*/
|
|
public function getSuggestCollection()
|
|
{
|
|
$collection = $this->getData('suggest_collection');
|
|
if ($collection === null) {
|
|
$collection = $this->_queryCollectionFactory->create()->setStoreId(
|
|
$this->getStoreId()
|
|
)->setQueryFilter(
|
|
$this->getQueryText()
|
|
);
|
|
$this->setData('suggest_collection', $collection);
|
|
}
|
|
return $collection;
|
|
}
|
|
|
|
/**
|
|
* Load Query object by query string
|
|
*
|
|
* @param string $text
|
|
* @return $this
|
|
* @throws \Magento\Framework\Exception\LocalizedException
|
|
* @deprecated 100.1.0 "synonym for" feature has been removed
|
|
*/
|
|
public function loadByQuery($text)
|
|
{
|
|
$this->loadByQueryText($text);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Load Query object only by query text
|
|
*
|
|
* @param string $text
|
|
* @return $this
|
|
* @throws \Magento\Framework\Exception\LocalizedException
|
|
*/
|
|
public function loadByQueryText($text)
|
|
{
|
|
$this->_getResource()->loadByQueryText($this, $text);
|
|
$this->_afterLoad();
|
|
$this->setOrigData();
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set Store Id
|
|
*
|
|
* @param int $storeId
|
|
* @return void
|
|
*/
|
|
public function setStoreId($storeId)
|
|
{
|
|
$this->setData('store_id', $storeId);
|
|
}
|
|
|
|
/**
|
|
* Retrieve store Id
|
|
*
|
|
* @return int
|
|
* @throws \Magento\Framework\Exception\NoSuchEntityException
|
|
*/
|
|
public function getStoreId()
|
|
{
|
|
if (!($storeId = $this->getData('store_id'))) {
|
|
$storeId = $this->_storeManager->getStore()->getId();
|
|
}
|
|
return $storeId;
|
|
}
|
|
|
|
/**
|
|
* Prepare save query for result
|
|
*
|
|
* @return $this
|
|
* @throws \Exception
|
|
*/
|
|
public function prepare()
|
|
{
|
|
if (!$this->getId()) {
|
|
$this->setIsActive(0);
|
|
$this->setIsProcessed(0);
|
|
$this->save();
|
|
$this->setIsActive(1);
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Save query with incremental popularity
|
|
*
|
|
* @return $this
|
|
*
|
|
* @throws \Magento\Framework\Exception\LocalizedException
|
|
*/
|
|
public function saveIncrementalPopularity()
|
|
{
|
|
$this->getResource()->saveIncrementalPopularity($this);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Save query with number of results
|
|
*
|
|
* @param int $numResults
|
|
* @return $this
|
|
*
|
|
* @throws \Magento\Framework\Exception\LocalizedException
|
|
*/
|
|
public function saveNumResults($numResults)
|
|
{
|
|
$this->setNumResults($numResults);
|
|
$this->getResource()->saveNumResults($this);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Retrieve minimum query length
|
|
*
|
|
* @return int
|
|
* @throws \Magento\Framework\Exception\NoSuchEntityException
|
|
*/
|
|
public function getMinQueryLength()
|
|
{
|
|
return $this->_scopeConfig->getValue(
|
|
self::XML_PATH_MIN_QUERY_LENGTH,
|
|
\Magento\Store\Model\ScopeInterface::SCOPE_STORE,
|
|
$this->getStoreId()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Retrieve maximum query length
|
|
*
|
|
* @return int
|
|
* @throws \Magento\Framework\Exception\NoSuchEntityException
|
|
*/
|
|
public function getMaxQueryLength()
|
|
{
|
|
return $this->_scopeConfig->getValue(
|
|
self::XML_PATH_MAX_QUERY_LENGTH,
|
|
\Magento\Store\Model\ScopeInterface::SCOPE_STORE,
|
|
$this->getStoreId()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function getQueryText()
|
|
{
|
|
return $this->getDataByKey('query_text');
|
|
}
|
|
|
|
/**
|
|
* Check if query maximum length exceeded.
|
|
*
|
|
* @return bool
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function isQueryTextExceeded()
|
|
{
|
|
return $this->getData('is_query_text_exceeded');
|
|
}
|
|
|
|
/**
|
|
* Check if minimum query length reached.
|
|
*
|
|
* @return bool
|
|
* @codeCoverageIgnore
|
|
* @since 100.1.0
|
|
*/
|
|
public function isQueryTextShort()
|
|
{
|
|
return $this->getData('is_query_text_short');
|
|
}
|
|
}
|