将子SKU添加到Magento全文搜索索引

时间:2014-01-10 01:18:16

标签: magento magento-1.7 magento-1.8

我不确定为什么这不是Magento的库存功能的一部分,但我希望客户能够搜索儿童SKU的可配置产品。出于某种原因,Magento没有为儿童SKU编制索引。

我在app/code/core/Mage/CatalogSearch/Model/Resource/Fulltext.php

中找到了
$dynamicFields = array(
    'int'       => array_keys($this->_getSearchableAttributes('int')),
    'varchar'   => array_keys($this->_getSearchableAttributes('varchar')),
    'text'      => array_keys($this->_getSearchableAttributes('text')),
    'decimal'   => array_keys($this->_getSearchableAttributes('decimal')),
    'datetime'  => array_keys($this->_getSearchableAttributes('datetime')),
);

我尝试过几种变化,但没有成功。 SKU是一个“静态”属性,可通过$this->_getSearchableAttributes('static')访问。获取所有静态属性我很好,但它不起作用。根据尝试的结果,我不会对结果进行任何更改,也不会出现静态属性表不存在的错误(这是有意义的,因为静态属性位于产品实体表中)。

有人有建议解决这个问题吗?

在线研究已经找到了使用这些值添加隐藏属性的建议,但这不应该是必需的。我宁愿正确解决问题。

3 个答案:

答案 0 :(得分:2)

这么多方法......

但是,我会带领一些我认为会更清洁的东西,而不是在app/code/core/Mage/CatalogSearch/Model/Resource/Fulltext.php中使用实际的全文。

问题在于你包含的片段之后的行:

    // status and visibility filter
    $visibility     = $this->_getSearchableAttribute('visibility');
    $status         = $this->_getSearchableAttribute('status');
    $statusVals     = Mage::getSingleton('catalog/product_status')->getVisibleStatusIds();
    $allowedVisibilityValues = $this->_engine->getAllowedVisibility();

最终导致:

核心/法师/ CatalogSearch /型号/资源/全文/ Engine.php

/**
 * Retrieve allowed visibility values for current engine
 *
 * @return array
 */
public function getAllowedVisibility()
{
    return Mage::getSingleton('catalog/product_visibility')->getVisibleInSearchIds();
}

然后:

核心/法师/目录/型号/产品/ Visibility.php

 public function getVisibleInSearchIds()
{
    return array(self::VISIBILITY_IN_SEARCH, self::VISIBILITY_BOTH);
}

因此,您需要做的是转到与您的可配置相关联的简单产品,并将可见性更改为“搜索”。

Change in visibility options for simple product associated with config

但是,现在它正在采取行动:

Zoinks! that doesn't look pretty at all

然而,是的,这看起来并不漂亮。下一个业务顺序现在正在修改搜索结果,以便在列出与可配置产品相​​关联的简单产品项时b。)可见性ID显式设置为Mage_Catalog_Model_Product_Visibility :: VISIBILITY_IN_SEARCH,您需要呈现该项目将结果搜索到实际的可配置产品父级(以及其余的详细信息,例如图像)。

(我稍后会继续这样做。我的电脑决定扯掉我,我失去了50%以上的写作。甚至我们修改全文课程的部分!Darn。稍后见。)< / p>

答案 1 :(得分:1)

我使用了设置简单产品可见性的方法来搜索。然后,而不是显示简单的产品加载/显示其父产品。

除了循环性能问题的前端查询,我从未发现这个解决方案非常令人满意。因此,经过另一次重击,我找到了另一种选择。

我正在为分组产品的全文索引添加简单的产品SKU,但同样的方法应该适用于可配置的产品。

这是一个想法:

Mage_CatalogSearch_Model_Resource_Fulltext->_prepareProductIndex

包含

$typeInstance = $this->_getProductTypeInstance($productData['type_id']);
if ($data = $typeInstance->getSearchableData($product)) {
    $index['options'] = $data;
}

因此,通过覆盖产品类型类中的getSearchableData方法,可以将数据添加到全文索引中。对于分组产品,我更新的内容如下:

... extends Mage_Catalog_Model_Product_Type_Grouped
{

/**
 * all child SKUs to search data
 */
public function getSearchableData($product=null)
{
    $searchData = parent::getSearchableData();
    $adapter = Mage::getSingleton('core/resource')->getConnection('core_read');
    $select = $adapter->select()
        ->from(
            array('p' => Mage::getSingleton('core/resource')->getTableName('catalog/product')),
            array('sku')
        )
        ->joinLeft(
            array('r' => Mage::getSingleton('core/resource')->getTableName('catalog/product_relation')),
            'r.child_id = p.entity_id',
            array()
        )
        ->where('r.parent_id = ?', $this->getProduct($product)->getId());
    $query = $adapter->query($select);
    while ($row = $query->fetch()) {
        $searchData[] = $row['sku'];
    }
    return $searchData;
}

重新索引的搜索和catalogsearch_fulltext.dataindex应包含其他数据。

答案 2 :(得分:0)

有一个解决方案,但它是一个付费扩展(我们许可它),它没有内置到Magento标准,所以你不能搜索子属性,只返回父可配置/分组/捆绑产品。