Вход • Регистрация

Поиск по сайту - индексация без данных из характеристик товара

  • 11 декабря 2017 г. , редакция: 11 декабря 2017 г.
  • По мотивам предложения в разделе "Пожелания".
    Описание задачи:
    Цитата
    Поиск по сайту - выхватывает данные из характеристик товара, что портит выдачу данных (хотя кому то это может и быть нужным...)

    пример (для понимания о чём я):

    - Есть товар с названием где есть артикул:
    "Душевая лейка 14.420.bronza"
    - Есть товар унитаз с названием артикулом:
    "Унитаз 11.221.zoloto"

    попробуем найти в поиске по сайту артикул: "14.420"

    и получаем в поисковой выдачи и тот и другой товар............
    - оказывается "Унитаз 11.221.zoloto" появляется в выдаче из за того, что у этого товара есть
    - характеристика с полем "Число" и задан размер 420


    И так, на текущи момент актуальная версия DIAFAN.CMS 6.0.6.2.
    Берем файл search.inc.php и находим функцию
    Код
    private function index_item($row, $config, $table_name, $site_id = 0) { ... }

    В текущей версии следующий оригинальный код функции:
    Код
    /**
    * Индексирует страницы модуля, прикрепленного к странице сайта
    *
    * @param array $row
    * @return void
    */
    private function index_item($row, $config, $table_name, $site_id = 0)
    {
    $this->current_insert++;
    if(! empty($row["search_no_show"]))
    return;

    if (isset($row["act"]) && ! $row["act"])
    return;

    // дополнительные характеристики
    if(in_array('param', $config["fields"]) && ! isset($row["param"]) && (! defined('_LANG') || ! isset($row["param"._LANG])))
    {
    $param = $this->get_param($row["id"], $table_name);
    }

    foreach ($this->langs as $l)
    {
    if (isset($row["act".$l]) && ! $row["act".$l])
    continue;

    $module_rating = 0;
    if(! empty($config["rating"]))
    {
    $module_rating = $config["rating"];
    }

    $values_for_index = array();
    foreach($config["fields"] as $field)
    {
    if($field == 'param' && isset($param))
    {
    $values_for_index[] = $param[$l];
    }
    else
    {
    $values_for_index[] = (array_key_exists($field.$l,$row) ? $row[$field.$l] : $row[$field]);
    }
    }
    $access = ! empty($row["access"]) ? 1 : 0;
    $date_start = ! empty($row["date_start"]) ? $row["date_start"] : 0;
    $date_finish = ! empty($row["date_finish"]) ? $row["date_finish"] : 0;
    $this->insert($row["id"], $table_name, $values_for_index, $module_rating, $l, $access, $date_start, $date_finish);
    }
    if($site_id)
    {
    $this->check_max($site_id, $table_name, $row["id"]);
    }
    }

    Заменяем данный код на такой:
    Код
    /**
    * Индексирует страницы модуля, прикрепленного к странице сайта
    *
    * @param array $row
    * @return void
    */
    private function index_item($row, $config, $table_name, $site_id = 0)
    {
    $this->current_insert++;
    if(! empty($row["search_no_show"]))
    return;

    if (isset($row["act"]) && ! $row["act"])
    return;

    // дополнительные характеристики
    if(in_array('param', $config["fields"]) && ! isset($row["param"]) && (! defined('_LANG') || ! isset($row["param"._LANG])))
    {
    $param = $this->get_param($row["id"], $table_name);
    }

    foreach ($this->langs as $l)
    {
    if (isset($row["act".$l]) && ! $row["act".$l])
    continue;

    $module_rating = 0;
    if(! empty($config["rating"]))
    {
    $module_rating = $config["rating"];
    }

    $values_for_index = array();
    foreach($config["fields"] as $field)
    {
    if($field == 'param' && $table_name == 'shop') continue;
    if($field == 'param' && isset($param))
    {
    $values_for_index[] = $param[$l];
    }
    else
    {
    $values_for_index[] = (array_key_exists($field.$l,$row) ? $row[$field.$l] : $row[$field]);
    }
    }
    $access = ! empty($row["access"]) ? 1 : 0;
    $date_start = ! empty($row["date_start"]) ? $row["date_start"] : 0;
    $date_finish = ! empty($row["date_finish"]) ? $row["date_finish"] : 0;
    $this->insert($row["id"], $table_name, $values_for_index, $module_rating, $l, $access, $date_start, $date_finish);
    }
    if($site_id)
    {
    $this->check_max($site_id, $table_name, $row["id"]);
    }
    }

    Жирным шрифтом выделено то, что добавлено для достяжения поставленной цели. То есть добавлена вот эта строка:
    Код
    if($field == 'param' && $table_name == 'shop') continue;


    Ну все, успехов всем :)

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум