magento - 从 Magento 中的自定义 block 调用 CatalogSearch 的正确方法是什么?

标签 magento search

我正在编写一个 Controller ,旨在向 API 调用公开 Magento 的目录搜索功能。使用默认 REST API 的过滤器不会返回与 Magento 网站上可用的搜索功能相同质量的结果。

我已经挖掘了几天了,我在 Stack Overflow 和 Magento 讨论板上看到的各种方法似乎不起作用,我是否缺少一个步骤?

这两种方法都返回 null,我似乎无法弄清楚为什么:

 $query = Mage::helper('catalogSearch')->getQuery();

 $searcher = Mage::getSingleton('catalogsearch/advanced')->addFilters(
             array('name'=> $query->getQueryText(), 
             'description' => $query->getQueryText()));



 $obj = new stdClass();
 $obj->query = $query->getQueryText();
 $obj->results = $searcher->getProductCollection(); //nothing returned

该方法也没有从 this SO question 修改而来似乎有效:

 $query = Mage::helper('catalogSearch')->getQuery();

 $obj = new stdClass();
 $obj->query = $query->getQueryText();

 if ($query->getQueryText()) {
      if (Mage::helper('catalogSearch')->isMinQueryLength()) {
           $query->setId(0)->setIsActive(1)->setIsProcessed(1);
      } else { 
           if ($query->getId()) { 
                $query->setPopularity($query->getPopularity()+1);
           } else { 
                $query->setPopularity(1);   
           }
           $query->prepare();
       }
       $obj->results = $query->getProductCollection(); //null
}

我缺少哪些步骤才能成功调用 Magento 的目录搜索模块并获取结果集合?

最佳答案

Magento 的搜索模型有点复杂,因为他们构建了一种机制来保存查询和结果以进行缓存和统计。因此,您需要准备查询对象,然后准备结果,然后可以将产品集合与搜索结果表连接起来。以下是如何在代码中执行此操作:

$searchText = 'ipad';
$query = Mage::getModel('catalogsearch/query')->setQueryText($searchText)->prepare();
$fulltextResource = Mage::getResourceModel('catalogsearch/fulltext')->prepareResult(
        Mage::getModel('catalogsearch/fulltext'), 
        $searchText, 
        $query
        );

$collection = Mage::getResourceModel('catalog/product_collection');
$collection->getSelect()->joinInner(
            array('search_result' => $collection->getTable('catalogsearch/result')),
            $collection->getConnection()->quoteInto(
                'search_result.product_id=e.entity_id AND search_result.query_id=?',
                $query->getId()
            ),
            array('relevance' => 'relevance')
        );

$collection 是经过筛选的目录产品集合,您可以根据需要执行任何其他操作:

$collection->setStore(Mage::app()->getStore());
$collection->addMinimalPrice();
$collection->addFinalPrice();
$collection->addTaxPercents();
$collection->addStoreFilter();
$collection->addUrlRewrite();

Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($collection);

关于magento - 从 Magento 中的自定义 block 调用 CatalogSearch 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20978893/

相关文章:

php - 在 WAMP 服务器中安装 Magento 时出错

magento - 如何在 Magento 中从我的 Controller 操作重定向或调用不同的 Controller 操作?

java - 如何在数组中查找元素?以及如何将带有声明方法的变量添加到数组列表中?

python - 优化在一长串字符串中的搜索

search - 如何在网站的所有文件夹/文件中搜索代码片段?

caching - magento https + IE8 提示问题

php - 上传 Magento 包时 $_FILES 为空

php - Magento 自定义 ACL 默认返回 TRUE

php - 具有多个值的搜索表单查询 - PHP/MYSQL

java - 如何在不使用线性搜索的情况下有效地在字典中搜索单词java : Reducing Search Space