Вопрос по OCFilter

Тема в разделе "Модули и дополнения", создана пользователем zema50, 25 окт 2020.

  1. zema50

    zema50 Продвинутый пользователь

    Сообщения:
    840
    Симпатии:
    94
    добрый день, самому копать лень, может кто подскажет где прописать что бы выборка была по количеству товара от большего к меньшему. в настройках такого функционала не нашел. судя по теме поддержки автору писать бесполезно, видно забил.
     
  2. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    239
    насколько я знаю, это не фильтре нужно делать а в модели product
     
  3. optimlab

    optimlab Продвинутый пользователь

    Сообщения:
    924
    Симпатии:
    240
    Врят ли фильтр будет использовать эту модель.
     
  4. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    с чего вы решили что он забил????


    именно ее

    Причем от трогает только тело запроса
     
  5. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    239
    но, так оно и есть
    PHP:
    public function getProducts($data = array()) {
            
    $sql "SELECT p.product_id, (SELECT AVG(rating) AS total FROM " DB_PREFIX "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM " DB_PREFIX "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int) $this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " DB_PREFIX "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int) $this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special";

            if (!empty(
    $data['filter_category_id'])) {
                if (!empty(
    $data['filter_sub_category'])) {
                    
    $sql .= " FROM " DB_PREFIX "category_path cp LEFT JOIN " DB_PREFIX "product_to_category p2c ON (cp.category_id = p2c.category_id)";
                } else {
                    
    $sql .= " FROM " DB_PREFIX "product_to_category p2c";
                }

                if (!empty(
    $data['filter_filter'])) {
                    
    $sql .= " LEFT JOIN " DB_PREFIX "product_filter pf ON (p2c.product_id = pf.product_id) LEFT JOIN " DB_PREFIX "product p ON (pf.product_id = p.product_id)";
                } else {
                    
    $sql .= " LEFT JOIN " DB_PREFIX "product p ON (p2c.product_id = p.product_id)";
                }
            } else {
                
    $sql .= " FROM " DB_PREFIX "product p";
            }


            
    // OCFilter start
            
    if (!empty($data['filter_ocfilter'])) {
                
    $this->load->model('extension/module/ocfilter');

                
    $ocfilter_product_sql $this->model_extension_module_ocfilter->getSearchSQL($data['filter_ocfilter']);
            } else {
                
    $ocfilter_product_sql false;
            }

            if (
    $ocfilter_product_sql && $ocfilter_product_sql->join) {
                
    $sql .= $ocfilter_product_sql->join;
            }
            
    // OCFilter end

            
    $sql .= " LEFT JOIN " DB_PREFIX "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " DB_PREFIX "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '" . (int) $this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "'";

            if (!empty(
    $data['filter_category_id'])) {
                if (!empty(
    $data['filter_sub_category'])) {
                    
    $sql .= " AND cp.path_id = '" . (int) $data['filter_category_id'] . "'";
                } else {
                    
    $sql .= " AND p2c.category_id = '" . (int) $data['filter_category_id'] . "'";
                }

                if (!empty(
    $data['filter_filter'])) {
                    
    $implode = array();

                    
    $filters explode(','$data['filter_filter']);

                    foreach (
    $filters as $filter_id) {
                        
    $implode[] = (int) $filter_id;
                    }

                    
    $sql .= " AND pf.filter_id IN (" implode(','$implode) . ")";
                }
            }

            if (!empty(
    $data['filter_name']) || !empty($data['filter_tag'])) {
                
    $sql .= " AND (";

                if (!empty(
    $data['filter_name'])) {
                    
    $implode = array();

                    
    $words explode(' 'trim(preg_replace('/\s+/'' '$data['filter_name'])));

                    foreach (
    $words as $word) {
                        
    $implode[] = "pd.name LIKE '%" $this->db->escape($word) . "%'";
                    }

                    if (
    $implode) {
                        
    $sql .= " " implode(" AND "$implode) . "";
                    }

                    if (!empty(
    $data['filter_description'])) {
                        
    $sql .= " OR pd.description LIKE '%" $this->db->escape($data['filter_name']) . "%'";
                    }
                }

                if (!empty(
    $data['filter_name']) && !empty($data['filter_tag'])) {
                    
    $sql .= " OR ";
                }

                if (!empty(
    $data['filter_tag'])) {
                    
    $implode = array();

                    
    $words explode(' 'trim(preg_replace('/\s+/'' '$data['filter_tag'])));

                    foreach (
    $words as $word) {
                        
    $implode[] = "pd.tag LIKE '%" $this->db->escape($word) . "%'";
                    }

                    if (
    $implode) {
                        
    $sql .= " " implode(" AND "$implode) . "";
                    }
                }

                if (!empty(
    $data['filter_name'])) {
                    
    $sql .= " OR LCASE(p.model) = '" $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                    
    $sql .= " OR LCASE(p.sku) = '" $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                    
    $sql .= " OR LCASE(p.upc) = '" $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                    
    $sql .= " OR LCASE(p.ean) = '" $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                    
    $sql .= " OR LCASE(p.jan) = '" $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                    
    $sql .= " OR LCASE(p.isbn) = '" $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                    
    $sql .= " OR LCASE(p.mpn) = '" $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                }

                
    $sql .= ")";
            }


            
    // OCFilter start
            
    if (!empty($ocfilter_product_sql) && $ocfilter_product_sql->where) {
                
    $sql .= $ocfilter_product_sql->where;
            }
            
    // OCFilter end

            
    if (!empty($data['filter_manufacturer_id'])) {
                
    $sql .= " AND p.manufacturer_id = '" . (int) $data['filter_manufacturer_id'] . "'";
            }

            
    $sql .= " GROUP BY p.product_id";

            
    $sort_data = array(
              
    'pd.name',
              
    'p.model',
              
    'p.quantity',
              
    'p.price',
              
    'rating',
              
    'p.sort_order
     
    optimlab нравится это.
  6. optimlab

    optimlab Продвинутый пользователь

    Сообщения:
    924
    Симпатии:
    240
    А я ни разу не пользовался OCFilter, поэтому не вкурсе что там и как. Я просто предположил.
     
  7. zema50

    zema50 Продвинутый пользователь

    Сообщения:
    840
    Симпатии:
    94
    с того что в теме поддержки ему куча народу задают вопросы, но не на один ответа давно уже нет.
    ок. попробую поковырять
     
  8. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    239
    PHP:
            if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
                if (
    $data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
                    
    $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, LCASE(" $data['sort'] . ")";
                } elseif (
    $data['sort'] == 'p.price') {
                    
    $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
                } else {
                    
    $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, " $data['sort'];
                }
            } else {
                
    $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, p.sort_order";
            }
     
  9. zema50

    zema50 Продвинутый пользователь

    Сообщения:
    840
    Симпатии:
    94
    fanatic, попробовал прописать, в категориях товар начал выбираться по количеству но на фильтре никак не отразилось и нечего не изменилось.
     
  10. mmfays

    mmfays Новичок

    Сообщения:
    4
    Симпатии:
    0
    У меня вопрос, при отсутствии SEO Url у seo страницы фильтра, перестает отображаться titile, description и H1, но из-за необходимости в его уникальность невозможно заполнить его на всех страницах, как сделать что бы при незаполненном seo url отображались мета данные
     
  11. yan32

    yan32 Новичок

    Сообщения:
    1
    Симпатии:
    0
    Подскажите, я обновил OCFilter теперь значения фильтрации в адресной строке не ЧПУшные. как вернуть обратно ЧПУ?
     
  12. Blast

    Blast Продвинутый пользователь

    Сообщения:
    212
    Симпатии:
    74
    в новой версии никак. Разработчик об этом писал
     
    yan32 нравится это.