сортируем значения ocfilter
По умолчанию фильтр сортирует подобные значение "до 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
0 коментарів
Recommended Comments
Немає коментарів для відображення
Створіть аккаунт або увійдіть для коментування
Ви повинні бути користувачем, щоб залишити коментар
Створити обліковий запис
Зареєструйтеся для отримання облікового запису. Це просто!
Зареєструвати аккаунтВхід
Уже зареєстровані? Увійдіть тут.
Вхід зараз