Добавление дочерних SKU в индекс полнотекстового поиска Magento

Я не уверен, почему это не является частью стандартной функциональности 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')),
);

Я пробовал несколько вариантов, безуспешно. Артикул — это «статический» атрибут, доступный через $this->_getSearchableAttributes('static'). Я в порядке с получением всех статических атрибутов, но это не работает. В зависимости от того, какая попытка, я либо не получаю никаких изменений в результатах, либо выдает ошибку, что таблица статических атрибутов не существует (что имеет смысл, поскольку статические атрибуты находятся в таблице объектов продукта).

У кого-нибудь есть предложение решить эту проблему?

Онлайн-исследования нашли предложения добавить скрытый атрибут с этими значениями, но это не должно быть необходимо. Я предпочел бы решить проблему должным образом.


person iJeep    schedule 10.01.2014    source источник
comment
Онлайн-исследования нашли предложения добавить скрытый атрибут с этими значениями, но это не должно быть необходимо. Я предпочел бы решить проблему должным образом. =› Я бы сделал это также с наблюдателями за сохранением продукта, чтобы обновить этот атрибут   -  person Jscti    schedule 16.01.2014
comment
У меня возникли проблемы с реализацией вашего решения, какие-либо указатели? stackoverflow .com/questions/31812898/   -  person user552769    schedule 06.08.2015


Ответы (3)


Так много способов сделать это..

Тем не менее, я начну с того, что, по моему мнению, будет намного чище, чем возиться с полным текстом в 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();

что в итоге приводит к:

core/Mage/CatalogSearch/Model/Resource/Fulltext/Engine.php

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

тогда:

core/Mage/Каталог/Модель/Продукт/Visibility.php

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

Итак, что вам нужно сделать, это перейти к вашему простому продукту, связанному с вашим настраиваемым, и изменить видимость на «Поиск».

Изменение параметров видимости для простого продукта, связанного с конфигурацией

Тем не менее, вот он в действии сейчас:

Чувак! это совсем некрасиво

Впрочем, да, выглядит это совсем не красиво. Следующим направлением деятельности теперь является изменение результатов поиска таким образом, чтобы при отображении простого элемента продукта, который а.) был связан с настраиваемым продуктом б.) для идентификатора видимости явно было задано значение Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_SEARCH, вам необходимо отобразить элемент в результатов поиска к фактическому настраиваемому родительскому продукту (и остальным его сведениям, таким как изображения).

(Я продолжу это позже. Мой компьютер решил нагадить мне, и я потерял более 50% того, что писал. Даже ту часть, где мы модифицируем полнотекстовый класс! Черт, увидимся позже.)

person Seth Malaki    schedule 13.01.2014
comment
Это интересный подход. Есть ли у вас какие-либо советы по предотвращению многократного отображения одного и того же родительского продукта в результатах после того, как родительский продукт заменит дочерний в результатах? - person iJeep; 18.01.2014

Я использовал метод настройки простой видимости продукта для поиска. Затем вместо отображения простого продукта загрузите/отобразите его родительский продукт.

Помимо внешнего запроса в вопросах производительности цикла, я никогда не находил это решение очень удовлетворительным. Итак, после очередного удара по нему я нашел другой вариант.

Я добавляю простые 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 должны содержать дополнительные данные.

person Ian at Xantek    schedule 25.05.2014

Для этого есть решение, но это платное расширение (мы лицензируем его), оно не встроено в стандарт Magento, поэтому вы не можете искать по дочерним атрибутам и просто возвращаете родительский настраиваемый/сгруппированный/комплектный продукт.

person Serpyre    schedule 23.01.2014