Перейти к содержанию
Официальный форум поддержки Simpla

Продолжение проблемы с мультифильтром


Рекомендуемые сообщения

Друзья, натолкните на мысль куда смотреть? 

 

Установил ajax фильтр по инструкции, собственно много лет он работал как я думал нормально. Но вчера обновляя библиотеки заметил глюк, 

 

http://efimof.bget.ru/catalog/mobilnye-telefony

 

Если цена хотя бы одно товара 0 , то при движении ползунка (Максимальной цены) фильтрация не проиходит. 

А вот если подвигать слева ползунок, то все считать с обеих сторон начинает.

Специально нашел архив который был при покупке чтоб поглядеть, тут такая же проблема.

 

Слева оставляю 0 , а тяну справа полнузок на 3 тысячи например, и ничего не происходит.

Ссылка на сообщение
Поделиться на другие сайты

Друзья, натолкните на мысль куда смотреть? 

 

Установил ajax фильтр по инструкции, собственно много лет он работал как я думал нормально. Но вчера обновляя библиотеки заметил глюк, 

 

http://efimof.bget.ru/catalog/mobilnye-telefony

 

Если цена хотя бы одно товара 0 , то при движении ползунка (Максимальной цены) фильтрация не проиходит. 

А вот если подвигать слева ползунок, то все считать с обеих сторон начинает.

Специально нашел архив который был при покупке чтоб поглядеть, тут такая же проблема.

 

Слева оставляю 0 , а тяну справа полнузок на 3 тысячи например, и ничего не происходит.

 

Укажите ссылку на архив вашего ajax фильтра, чтобы понимать развернуть и понять причину. 

Так сразу могу сказать, что новая библиотека выдает вам сообщение "Синхронный XMLHttpRequest в основном потоке не рекомендуется из-за его пагубных последствий для конечного пользователя. Для получения дополнительной помощи, проверьте", а именно в http://efimof.bget.ru/design/default/js/ajax_filter.js

Ссылка на сообщение
Поделиться на другие сайты

Скорее всего, причина в мелкой ошибочке в api/Products.php или view/ProductsView.php,  вроде той, про которую говорит Flexcore.

Ссылка на сообщение
Поделиться на другие сайты

Скорее всего, причина в мелкой ошибочке в api/Products.php или view/ProductsView.php, вроде той, про которую говорит Flexcore.

Пишет, не говорит.

Всё верно, ошибка банальная, которую всё чаще и чаще допускают неопытные программисты.

Ссылка на сообщение
Поделиться на другие сайты

Пишет, не говорит.

 

Одно из значений слова 'говорить' - Высказывать что-л. печатно, письменно.

 

https://slovar.cc/rus/efremova-tolk/275785.html

Ссылка на сообщение
Поделиться на другие сайты

Скорее всего, причина в мелкой ошибочке в api/Products.php или view/ProductsView.php,  вроде той, про которую говорит Flexcore.

 

 

в Api /Products 

 

        if(!empty($filter['price_first']) && !empty($filter['price_last']))
        {
            $price_filter_join = $this->db->placehold('LEFT JOIN __variants pv ON pv.product_id = p.id');
            $price_filter_where = $this->db->placehold(' AND (pv.price = NULL OR pv.price >= ? AND pv.price <= ? ) ', (int)$filter['price_first'], (int)$filter['price_last'] );
        }

если смотреть аналогичные фильтры рядом, то они все так проверяются.

 

в ProductsView.php 

 

        if($this->request->get("price_search"))
        {
            // Если задана максимальная цена
            $price_last = $this->request->get('price_last');
            if (!empty($price_last) && $price_last != 'undefined')
            {
                $filter['price_last'] = (int)$price_last;
                $this->design->assign('price_last', $filter['price_last']);
            }

            // Если задана минимальная цена
            $price_first = $this->request->get('price_first');
            if (!empty($price_first) && $price_first != 'undefined')
            {
                $filter['price_first'] = (int)$price_first;
                if (isset($filter['price_last']) && $filter['price_first'] > $filter['price_last'])
                    $filter['price_first'] = 0;
                $this->design->assign('price_first', $price_first);
            }
        }

Но тут есть isset , но при замене на !empty эффекта нету.

Ссылка на сообщение
Поделиться на другие сайты

Я же вам написал начните с основ, толку от ваших гаданий ну никакого!

Также лучше использовать оператор BETWEEN в SQL запросах.

Ссылка на сообщение
Поделиться на другие сайты

Я же вам написал начните с основ, толку от ваших гаданий ну никакого!

Также лучше использовать оператор BETWEEN в SQL запросах.

 

Куда к основам? то что выше написал код правильный? или есть ошибка? Если не сложно укажите на нее.

Ссылка на сообщение
Поделиться на другие сайты

Ошибок предостаточно. Например, условие в строке

 

if(!empty($filter['price_first']) && !empty($filter['price_last']))

 

ложно, если цена в фильтре нулевая. Соответственно параметры по фильтру цену не передаются и оттого не работает...

Ссылка на сообщение
Поделиться на другие сайты

Куда к основам? то что выше написал код правильный? или есть ошибка? Если не сложно укажите на нее.

http://forum.simplacms.ru/topic/14539-продолжение-проблемы-с-мультифильтром/?p=113235
Ссылка на сообщение
Поделиться на другие сайты

Ошибок предостаточно. Например, условие в строке

 

if(!empty($filter['price_first']) && !empty($filter['price_last']))

 

ложно, если цена в фильтре нулевая. Соответственно параметры по фильтру цену не передаются и оттого не работает...

 

Это да, прочитал что empty 0 обозначает как пустое значение.

 

По факту отлично работает конструкция 

 

        if(isset($filter['price_first']) && !empty($filter['price_last']))
        {
            $price_filter_join = $this->db->placehold('LEFT JOIN __variants pv ON pv.product_id = p.id');
            $price_filter_where = $this->db->placehold(' AND (pv.price = NULL OR pv.price >= ? AND pv.price <= ? ) ', (int)$filter['price_first'], (int)$filter['price_last'] );
        }

Где минимальное прайс проверяется наличие переменной значением от null.

Ссылка на сообщение
Поделиться на другие сайты

Это да, прочитал что empty 0 обозначает как пустое значение.

 

По факту отлично работает конструкция

 

        if(isset($filter['price_first']) && !empty($filter['price_last']))
        {
            $price_filter_join = $this->db->placehold('LEFT JOIN __variants pv ON pv.product_id = p.id');
            $price_filter_where = $this->db->placehold(' AND (pv.price = NULL OR pv.price >= ? AND pv.price <= ? ) ', (int)$filter['price_first'], (int)$filter['price_last'] );
        }
Где минимальное прайс проверяется наличие переменной значением от null.
Эврика!
Ссылка на сообщение
Поделиться на другие сайты

 

:D Нокстер хоть вы и предельно вежливы, но я вас узнал)

Мимо, я Архимед Изменено пользователем Flexcore
Ссылка на сообщение
Поделиться на другие сайты

Эврика!

 

 if(isset($filter['price_first']) && !empty($filter['price_last']))

Ошибся, при данной конструкции почему то та же проблема в фильтрации. Хотя вроде функция isset не должна вернуть false

Ссылка на сообщение
Поделиться на другие сайты

Ошибся, при данной конструкции почему то та же проблема в фильтрации. Хотя вроде функция isset не должна вернуть false

 

Ошибок предостаточно. Например...

 

Надо ж проверять детально все шаги и все места. Особенно если код у Вас левый неизвестно откуда взятый. Вы ж не обратились к автору сего произведения...

 

А похожая ошибка в предоставленном  Вами коде видна сразу, если хоть чуть внимательно смотреть...

Ссылка на сообщение
Поделиться на другие сайты

Надо ж проверять детально все шаги и все места. Особенно если код у Вас левый неизвестно откуда взятый. Вы ж не обратились к автору сего произведения...

 

А похожая ошибка в предоставленном  Вами коде видна сразу, если хоть чуть внимательно смотреть...

 

Модуль был куплен в 2013 году, собственно когда и сайт был сделан еще на версии 2.1.5, где спустя 7 лет искать разработчика.

 

Если не сложно, укажите на ошибку.

Ссылка на сообщение
Поделиться на другие сайты

Надо ж проверять детально все шаги и все места. Особенно если код у Вас левый неизвестно откуда взятый. Вы ж не обратились к автору сего произведения...

 

А похожая ошибка в предоставленном  Вами коде видна сразу, если хоть чуть внимательно смотреть...

 

 

 

isset - проверяет на существование переменной или индекса в массиве, т.е она будет ВСЕГДА true, если значение отлично от NULL, именно от константы null, т.е '', 0, "\0" и т.д, будет считаться существующей переменой, false будет только при присвоение ей null или unset($var), во всех остальных true

 

empty - проверят именно на пустоту переменной, т.е возвращает true если переменная является пустой и false в противоположном случаи.

 

Исходя из этого 

 

if(isset($filter['price_first']) && !empty($filter['price_last']))

isset($filter['price_first'])       -       возвращает true т.к. переменная не пустая , там 0.

!empty($filter['price_last'])      -     возвращает true т.к. переменная не пустая ( там максимальное значение фильтра)

 

Должно возвращать true && true ,верно? даже если в фильтре price_first - 0.

 

Но при такой конструкции фильтр не срабатывает. Пока 0 в минимальной цене фильтра.

 

 

UPD. Спасибо, разобрался.

Изменено пользователем megauser
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...