Изменение строки поискового запроса в серверной части
В моем проекте magento у меня есть требование, когда мне нужно изменить введенный пользователем текст запроса на что-то другое на основе некоторых вычислений.
Например, если пользователь ввел "ABC" в текстовое поле глобального поиска, то
- Мне нужно изменить его на "XYZ" и показать результаты, связанные с измененным текстом запроса, т.Е. "XYZ".
- а также популярные термины, которые генерируются на основе текста запроса, не должны изменяться новый текст запроса.
User entered text product collection results Popular terms/suggestions
================= ========================== =========================
ABC XYZ ABC
Я пытался достичь вышесказанного, делая много вещей, но не добился успеха. Одна из моих попыток - переопределение функции prepare()
в классе Mage_Catalogsearch_Model_Query
.
public function prepare()
{
Mage::log("I am in overriden prepare function");
if($this->getQueryText() == "ABC"){
$this->setQueryText("XYZ");
}
Mage::log($this->getQueryText());
if (!$this->getId()) {
$this->setIsActive(0);
$this->setIsProcessed(0);
$this->save();
$this->setIsActive(1);
}
return $this;
}
В приведенной выше функции, хотя я могу изменить текст запроса с помощью setQueryText
, я получаю результирующую коллекцию продуктов на основе введенного пользователем текста запроса вместо измененного текста запроса.
PS: приведенная выше функция является лишь примером того, как я пытаюсь достичь это.
РЕДАКТИРОВАТЬ:
На самом деле мне нужно выполнить некоторые вычисления на основе переданной строки запроса. Чтобы быть точным, мне нужно найти двоеточие :
в строке запроса, и если есть двоеточие, то разделите строку. После разделения передайте вторую часть строки в качестве строки запроса, если и только если первая часть строки является "именем категории" или "показать" или "некоторые другие допустимые строки, выбранные мной".
3 answers
Я решил эту проблему!!
Но я не уверен, что это лучший подход.
Операции со строками могут быть выполнены в prepareResult
функции Mage_CatalogSearch_Model_Resource_Fulltext
.
public function prepareResult($object, $queryText, $query)
{
$adapter = $this->_getWriteAdapter();
if (!$query->getIsProcessed()) {
//other code....
}
}
В приведенном выше коде я просто вызвал свою функцию обработки строк при запуске функции, а также прокомментировал оператор if, т.е. if(!$query->getIsProcessed()){
, потому что у меня было много поисковых запросов, которые уже были обработаны. (старая база данных). Итак, измененный код выглядит следующим образом:
public function prepareResult($object, $queryText, $query)
{
$queryText = $this->doStringManipulations($queryText);
$adapter = $this->_getWriteAdapter();
//if (!$query->getIsProcessed()) {
//other code....
//}
}
Magento поддерживает поисковые запросы синонимов. Просто отредактируйте поисковый запрос из Catalog->Search terms
и добавьте XYZ
в качестве синонима для ABC
.
Если ваши синонимы не являются фиксированными и вам нужно правило, которое их определяет, вам нужно переписать метод Mage_CatalogSearch_Model_Query::getSynonymFor
, чтобы он возвращал любое значение, которое вы хотите, на основе $this->getQueryText()
.