Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

блог для натуралов

  • записів
    11
  • коментаря
    72
  • перегляд
    9 661

сортируем значения ocfilter


kJlukOo

91 перегляд

По умолчанию фильтр сортирует подобные значение "до 2 м" > "до 1000 м" как строки

Проблема возникает из-за того, sql запрос "до 2м" + 0 возвращает 0

 

Задача найти блоки фильтра в которых все значения содержат числа и отсортировать их в правильном порядке

Написал скрипт, который находит фильтры имеющие только числовые значения и проставляет им необходимую сортировку 

Перед тестирование скрипта делайте бекап таблицы oc_ocfilter_filter_value

 

function sort_ocfilter()
{
    $pattern = '/\-?\d+([.,]\d+)?/';
    $final_groups = [];
    $groups = [];
    $batchSize = 5500;

    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "ocfilter_filter_value fv
    LEFT JOIN " . DB_PREFIX . "ocfilter_filter_value_description fvd 
    ON (fv.value_id = fvd.value_id AND fv.source = fvd.source) 
    WHERE fvd.language_id = '" . (int)$this->config->get('config_language_id') . "'");

    foreach ($query->rows as $row)
    {
        if (array_search($row['filter_id'], $exclude_filter_id) === FALSE)
        {
            $groups[$row['filter_id']][] = $row;
        }
    }

    foreach ($groups as $key => $group)
    {
        $numeric = 0;
        $alphabet = 0;
        foreach ($group as $val)
        {
            if (preg_match($pattern, $val['name'], $matches1))
            {
                $numeric++;
            } else
            {
                $alphabet++;
            }
        }

        if ($alphabet != 0)
        {
            continue;
        }

        uasort($groups[$key], function ($a, $b) use ($pattern)
        {
            if (preg_match($pattern, $a['name'], $matches1) && preg_match($pattern, $b['name'], $matches2))
            {
                return (float)str_replace(',', '.', $matches1[0]) <=> (float)str_replace(',', '.', $matches2[0]);
            } else
            {
                return $a['name'] <=> $b['name'];
            }
        });

        $final_groups[$key] = $groups[$key];
    }

    foreach ($final_groups as $group)
    {
        $counter = 0;
        foreach ($group as $val)
        {
            $counter++;
            $sqlQueries[] = "WHEN value_id = " . $val['value_id'] . " THEN " . $counter . " ";
            //$this->db->query($sql);
        }
    }

    $chunks = array_chunk($sqlQueries, $batchSize);

    foreach ($chunks as $batch)
    {
        $combinedQuery = implode(" ", $batch);
        $combinedQuery = "UPDATE " . DB_PREFIX . "ocfilter_filter_value SET sort_order = (CASE " . $combinedQuery . " ELSE sort_order END)";
        $this->db->query($combinedQuery);
    }

echo "<PRE>";var_dump($final_groups);
}

 

  • +1 1

0 коментарів


Recommended Comments

Немає коментарів для відображення

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.