1

我已经尝试了几个小时来成功重写 Magento 的内置 Autosuggest 函数,以便它显示产品名称而不是查询历史记录条目。我不想要任何花哨的东西,没有产品图片等等,只是简单的产品名称建议。

因此,为了获取产品名称,我在app/code/local/Aw该文件夹下CatalogSearch/Model创建并创建了一个名为Query.php. 在该文件中,我有以下类和重写方法:

class Aw_CatalogSearch_Model_Query 
    extends Mage_CatalogSearch_Model_Query {

    public function getSuggestCollection() {
        $collection = $this->getData('suggest_collection');
        if (is_null($collection)) {
            $collection = Mage::getModel('catalog/product');
            Mage::getSingleton('catalog/product_status')
                ->addVisibleFilterToCollection($collection);
            $collection->getCollection()
                ->addAttributeToSelect('name')
                ->addAttributeToFilter('name', array('like' =>         
                    '%'.$this->getQueryText().'%'))
                ->addExpressionAttributeToSelect('query_text', '{{name}}', 'name')
                ->addAttributeToSort('name', 'ASC')
                ->setPageSize(10)
                ->addStoreFilter($this->getStoreId());
            $this->setData('suggest_collection', $collection);
        }
        return $collection;
    }
};

我在 app/etc/modules/ 中创建了模块 xml 文件,并在app/code/local/Aw/CatalogSearch/etc/config.xml

到目前为止一切都很好,被覆盖的方法getSuggestCollection()被执行了。

问题app/code/core/Mage/CatalogSearch/Block/Autocomplete.php出在getSuggestData()方法上。

public function getSuggestData()
{
    if (!$this->_suggestData) {
        $collection = $this->helper('catalogsearch')->getSuggestCollection();
        $query = $this->helper('catalogsearch')->getQueryText();
        $counter = 0;
        $data = array();
        foreach ($collection as $item) {
            $_data = array(
                'title' => $item->getQueryText(),
                'row_class' => (++$counter)%2?'odd':'even',
                'num_of_results' => $item->getNumResults()
            );

            if ($item->getQueryText() == $query) {
                array_unshift($data, $_data);
            }
            else {
                $data[] = $_data;
            }
        }
        $this->_suggestData = $data;
    }
    return $this->_suggestData;
}

当它遍历集合时,我得到一个

Call to a member function getQueryText() on a non-object ...

我不明白的一点是,我在getSuggestCollection()方法内的集合查询中定义了一个名为“query_text”的别名字段。即使当我使用类似getData('query_text')$item->getQuery_text()获取该字段的数据时也无法正常工作。我有强烈的感觉,集合对象在类的 getSuggestData() 方法中应该是无效的Mage_CatalogSearch_Block_Autocomplete

谁能指出我如何解决这个问题?是否不可能像上述方式从产品集合中收集建议并将这些建议传递给 Autocomplete.php?

这是我的第一个 magento 项目,所以请多多包涵!我真的迷失了这个!

非常感谢任何提示。

本项目使用 Magento 1.7.0.2。

4

2 回答 2

1

好吧,我找到了解决方案。对于可能对此感兴趣的任何人,我的问题中所述的问题位于以下几行中

$collection = Mage::getModel('catalog/product');
Mage::getSingleton('catalog/product_status')
    ->addVisibleFilterToCollection($collection);
$collection->getCollection() ... // continue method chaining ...

我更改了代码,以便将构造函数和方法链接在一起,如下所示:

$collection = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('name') ... // continue method chaining
...

我添加了过滤器product_statuscataloginventory/stockcatalog/product_visibility在集合可用后立即使用单例调用
。这样,一切都按预期工作。

于 2013-08-17T04:10:52.507 回答
1

对于其他想要做类似事情的人,我只是将 app/code/core/Mage/CatalogSearch/Block/Autocomplete.php 重写为我自己的模块,并让搜索结果查询 sku 并返回产品名称。您的里程可能会有所不同,但是,我的 sku 代码是合理的名称而不是随机数字,所以这对我有用。

public function getSuggestData()
{
    if (!$this->_suggestData) {
        $collection = $this->helper('catalogsearch')->getSuggestCollection();
        $query = $this->helper('catalogsearch')->getQueryText();
        $counter = 0;
        $data = array();
        foreach ($collection as $item) {
            $_data = array(
                'title' => $item->getQueryText(),
                'row_class' => (++$counter)%2?'odd':'even',
                'num_of_results' => $item->getNumResults()
            );

            if ($item->getQueryText() == $query) {
                array_unshift($data, $_data);
            }
            else {
                $data[] = $_data;
            }
        }


        // Get products where the url matches the query in some meaningful way

        $products = Mage::getModel('catalog/product')->getCollection()
            ->addAttributeToSelect('name')
            ->addAttributeToFilter('type_id', 'configurable')
            ->addAttributeToFilter('sku',array('like'=>'%'.$query.'%'))
            ->load();
        foreach($products as $product) {
            $_data = array(
                'title' => $product->getName(),
                'row_class' => (++$counter)%2?'odd':'even',
                'num_of_results' => 1
            );

//                if ($item->Name() == $query) {
//                    array_unshift($data, $_data);
//                }
//                else {
                $data[] = $_data;
//                }
        }

        $this->_suggestData = $data;
    }
    return $this->_suggestData;
}

我不需要重写 Mage_CatalogSearch_Model_Query,只需要重写建议的代码。

于 2014-04-14T13:26:47.317 回答