Сортировка брендов Mega Filter Pro по значению, а не названию

ihos

Участник
Регистрация
13 Май 2012
Сообщения
213
Реакции
3
Уже голову сломал, как можно отсортировать в мегафильтр про. Вот код ниже предоставил, только по названию работает.
Код:
    public function getManufacturers() {
        $sql = "
            SELECT
                `m`.*
            FROM
                `" . DB_PREFIX . "manufacturer` AS `m`
            INNER JOIN
                `" . DB_PREFIX . "manufacturer_to_store` AS `m2s`
            ON
                `m`.`manufacturer_id` = `m2s`.`manufacturer_id` AND `m2s`.`store_id` = '" . (int)$this->config->get('config_store_id') . "'
            {join}
            {conditions}
            {group}
            ORDER BY
                `m`.`name` ASC
        ";
      
        $core        = MegaFilterCore::newInstance( $this, NULL, array(), $this->settings() );
        $data        = MegaFilterCore::_getData( $this );
        $join        = '';
        $group        = array();
        $conditions    = $core->_baseConditions( array(), true );
        $join        = 'INNER JOIN `' . DB_PREFIX . 'product` AS `p` ON `p`.`manufacturer_id` = `m`.`manufacturer_id`';
      
        if( in_array( $core->route(), MegaFilterCore::$_specialRoute ) ) {
            $conditions[] = '(' . $core->_specialCol( '' ) . ') IS NOT NULL';
        }
      
        if( ! empty( $this->request->get['mfp_path'] ) || ! empty( $data['filter_name'] ) || ! empty( $data['filter_category_id'] ) || ! empty( $data['filter_manufacturer_id'] ) || ! empty( $conditions['search'] ) ) {
            $join .= ' ' . $core->_baseJoin();
        }
      
        if( $join ) {
            $group[] = '`m`.`manufacturer_id`';
        }
      
        $group        = $group ? 'GROUP BY ' . implode( ',', $group ) : '';
        $conditions    = $conditions ? 'WHERE ' . implode( ' AND ', $conditions ) : '';
      
        $sql            = str_replace( array( '{join}', '{conditions}', '{group}' ), array( $join, $conditions, $group ), $sql );
        $manufacturers    = array();
      
        foreach( $this->db->query( $sql )->rows as $row ) {
            $manufacturers[] = array(
                'key'    => $row['manufacturer_id'],
                'value'    => $row['manufacturer_id'],
                'name'    => $row['name'],
                'image'    => empty( $row['image'] ) ? '' : $row['image']
            );
        }
      
        return $manufacturers;
    }
 
Последнее редактирование:
Это уже изменённый код?
А что значит по значению?
Если хотите сортировать по 'manufacturer_id', то оригинальное :
Код:
            ORDER BY
                `m`.`name` ASC
замените на:
Код:
            ORDER BY
                `m`.`manufacturer_id` ASC
 
Код:
            ORDER BY
                `m`.`name` ASC
У него там совсем другой код...

Уже голову сломал, как можно отсортировать в мегафильтр про. Вот код ниже предоставил, только по названию работает.

Выведи через var_dump($manufacturers); свой массив и ответь на вопрос правильная сортировка или нет?Если нет уточни что именно и в каком порядке надо сортировать. Из твоего запроса это не однозначно.
Если правильная сортировка ищи, что происходит с этими данными дальше после вызова getManufacturers() - вполне реально, что над этими данными происходит надругательство сортировка в других местах.
 
По значенияю я имеюю виду чтобы сначала ишли бренды которых больше всего товаров, и по спаданию
Например:
Нокиа: 9999
Самсунг: 888
Моторола 777
и.т.д
ПО manufacturer_id не подходит так как в разных категориях свои производители

PS. Исправил код, а то я случайно вставил уже свой который пробывал сделать, хотя вы сами догадались что там должно быть не `m`.`value` ASC, а `m`.`name` ASC
 
Последнее редактирование:
По значенияю я имеюю виду чтобы сначала ишли бренды которых больше всего товаров, и по спаданию
Теперь понятно.
На этапе метода getManufacturers() данных о количестве товаров нет, MFP вычисляет количество товаров на этапе постобработки страницы.
В самом запросе метода getManufacturers() подготовить данные для сортировки можно через вложенный SELECT. Например, как один из вариантов, такая конструкция:
Код:
    public function getManufacturers() {
        $sql = "
            SELECT
                `m`.*, (SELECT COUNT(...)...) AS `value`
            FROM
...
...
...
            ORDER BY
                `value` DESC
Надеюсь, сможете написать вложенный запрос.
------------------

Альтернативное решение.
Если производителей не очень много, например пара десятков, выгодно сортировать по manufacturer.sort_order. В админке руками проставить приоритетность для каждого производителя а в getManufacturers() поставить сортировку:
Код:
            ORDER BY
                `m`.`sort_order` ASC, `m`.`name` ASC
Если добавить индексы по 'sort_order' и 'name', то всё управляемо и без доп. тормозов.
 
Последнее редактирование:
Назад
Сверху