Изменение строки поискового запроса в серверной части


В моем проекте 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: приведенная выше функция является лишь примером того, как я пытаюсь достичь это.

РЕДАКТИРОВАТЬ:

На самом деле мне нужно выполнить некоторые вычисления на основе переданной строки запроса. Чтобы быть точным, мне нужно найти двоеточие : в строке запроса, и если есть двоеточие, то разделите строку. После разделения передайте вторую часть строки в качестве строки запроса, если и только если первая часть строки является "именем категории" или "показать" или "некоторые другие допустимые строки, выбранные мной".

Author: Mr_Green, 2014-02-04

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....
    //}
}
 1
Author: Mr_Green, 2014-02-06 08:39:18

Magento поддерживает поисковые запросы синонимов. Просто отредактируйте поисковый запрос из Catalog->Search terms и добавьте XYZ в качестве синонима для ABC.
Если ваши синонимы не являются фиксированными и вам нужно правило, которое их определяет, вам нужно переписать метод Mage_CatalogSearch_Model_Query::getSynonymFor, чтобы он возвращал любое значение, которое вы хотите, на основе $this->getQueryText().

 0
Author: Marius, 2014-02-04 10:01:02

Было бы полезно, если бы вы опубликовали бизнес-логику, лежащую в основе этого, и реальный пример с: в поиске большинство пользователей никогда не будут искать в этом методе, поэтому, скорее всего, вы пытаетесь обойти другую проблему.

 0
Author: , 2014-02-05 18:36:42