snagovskiy Posted March 27, 2016 Report Share Posted March 27, 2016 (edited) Строку надо добавить в api/Products.php $products_stock_null_sort=''; /**/ if(!empty($filter['sort'])){ /**/ $order = 'IF(v.stock < 1,1,0),'.$order; /**/ $group_by = 'GROUP BY p.id'; /**/ $products_stock_null_sort = 'INNER JOIN __variants v ON p.id = v.product_id'; /**/ } Спасибо Kors но доработка действительно фильтрует криво. Допустим есть два цвета товара черный и белый, если черный в наличии, а белый нет, то этот товар попадет под фильтр и будет внизу с другими товарами которых нет в наличии.... Edited March 27, 2016 by snagovskiy Quote Link to post Share on other sites
mishanya Posted March 27, 2016 Report Share Posted March 27, 2016 Строку надо добавить в api/Products.php $products_stock_null_sort=''; /**/ if(!empty($filter['sort'])){ /**/ $order = 'IF(v.stock < 1,1,0),'.$order; /**/ $group_by = 'GROUP BY p.id'; /**/ $products_stock_null_sort = 'INNER JOIN __variants v ON p.id = v.product_id'; /**/ } Спасибо Kors но доработка действительно фильтрует криво. Допустим есть два цвета товара черный и белый, если черный в наличии, а белый нет, то этот товар попадет под фильтр и будет внизу с другими товарами которых нет в наличии.... вариант Кости пробовали? у меня он работает отлично Quote Link to post Share on other sites
snagovskiy Posted March 27, 2016 Report Share Posted March 27, 2016 вариант Кости пробовали? у меня он работает отличноПробовал, не помогло. Я купил http://simpla-tuning.com/spisok-tovarov---otsutstvuyuschie-v-kontse работает отлично Quote Link to post Share on other sites
Varyag Posted March 27, 2016 Report Share Posted March 27, 2016 (edited) Пробовал, не помогло. Я купил http://simpla-tuning.com/spisok-tovarov---otsutstvuyuschie-v-kontse работает отличноА если вдруг поставите доработку своя валюта на вариант. Где будут цены закупки то $. то в рублях, то в евро. Как будет работать сортировка? Таки я вам скажу - будет жопа Edited March 27, 2016 by Varyag Quote Link to post Share on other sites
cernos Posted April 3, 2016 Author Report Share Posted April 3, 2016 Прищлось править данное решение на одном сайте.Проблема была в следующем - проверка по наличию идет только по первому варианту.Я сделал так: /**/ if(!empty($filter['sort'])){ /**/ $order = 'IF((SELECT COUNT(*) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1), 1, 0) DESC,'.$order; /**/ } Работает при любой сортировке и сбрасывает вниз товары, у которых нет ни одного варианта. ЧИТАЙТЕ ВНИМАТЕЛЬНО ФОРУМ. КОСЯК ВЫКЛАДЫВАЛ РЕШЕНИЕОНО ВЫШЕ Quote Link to post Share on other sites
Kors Posted April 4, 2016 Report Share Posted April 4, 2016 Прищлось править данное решение на одном сайте.Проблема была в следующем - проверка по наличию идет только по первому варианту.Я сделал так: /**/ if(!empty($filter['sort'])){ /**/ $order = 'IF((SELECT COUNT(*) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1), 1, 0) DESC,'.$order; /**/ } Работает при любой сортировке и сбрасывает вниз товары, у которых нет ни одного варианта. Несколько усложнено. Чуть проще: /**/ if(!empty($filter['sort'])){ /**/ $order = '(SELECT COUNT(*) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1) DESC,'.$order; /**/ } Quote Link to post Share on other sites
Kors Posted April 4, 2016 Report Share Posted April 4, 2016 А если вдруг поставите доработку своя валюта на вариант. Где будут цены закупки то $. то в рублях, то в евро. Как будет работать сортировка? 1. Обычно на форуме выкладывается решение, рассчитанное на стандартную Simpla. Случай, когда "А если вдруг поставите..." при этом не рассматривается. Вы ведь при покупке холодильника не обсуждаете вопрос - а что будет, если я переделаю в доме розетки, их станет меньше и мне некуда будет вилку вставить. Или наводнение случится...2. Реально ответ на Ваш вопрос зависит от того, как выполнялась доработка. Мне приходилось делать разные подобные доработки. При правильном подходе все работает нормально:http://simpla-tuning.com/search?keyword=%D1%86%D0%B5%D0%BD+%D0%B2%D0%B0%D0%BB%D1%8E%D1%82 Неправильный подход можно найти в теме:http://forum.simplacms.ru/topic/8602-%D0%B2%D0%B2%D0%BE%D0%B4-%D1%86%D0%B5%D0%BD-%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D0%BE%D0%B2-%D0%B2-%D0%BB%D1%8E%D0%B1%D0%BE%D0%B9-%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE%D0%B9-%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B5%D0%BF%D0%BE%D1%81%D1%82%D0%B0/Там автор в процессе создал даже несколько версий, но полностью все ошибки до конца так и не исправил Quote Link to post Share on other sites
Noxter Posted April 4, 2016 Report Share Posted April 4, 2016 Мне нравится как Корс примеры цитирует Quote Link to post Share on other sites
Gregar Posted February 7, 2017 Report Share Posted February 7, 2017 Код исправлен, работоспособен и проверен!! Все замечания высказанные kors учтены! Решение простое:открываем файл: api/Products.php находим функцию: public function get_products($filter = array()) Находим кусок кода: if(!empty($filter['sort'])) switch ($filter['sort']) { case 'position': $order = 'p.position DESC'; break; case 'name': $order = 'p.name'; break; case 'created': $order = 'p.created DESC'; break; case 'price-min': $order = 'v.price'; break; case 'price-max': $order = 'v.price DESC'; break; } После этого кода вставляем: /**/ if(!empty($filter['sort'])){ /**/ $order = 'IF(v.stock < 1,1,0),'.$order; /**/ $group_by = 'GROUP BY p.id'; /**/ $products_stock_null_sort = 'INNER JOIN __variants v ON p.id = v.product_id'; /**/ } После находим запрос: $query = "SELECT p.id, p.url, p.brand_id, p.name, p.annotation, p.body, p.position, p.created as created, p.visible, p.featured, p.rating, p.votes, p.meta_title, p.meta_keywords, p.meta_description, b.name as brand, b.url as brand_url ............в этом запросе находим: LEFT JOIN __brands b ON p.brand_id = b.idпосле этой строки вставляем: $products_stock_null_sortТак, чтобы получилось: LEFT JOIN __brands b ON p.brand_id = b.id $products_stock_null_sort +Под эту же фишку легко сделать СОРТИРОВКУ ТОВАРА ПО ЦЕНЕ, от меньшей к большему и наоборот, для этого в этом же файле: api/Products.phpв этой же функции:public function get_products($filter = array())находим: if(!empty($filter['sort'])) switch ($filter['sort']) { case 'position': $order = 'p.position DESC'; break; case 'name': $order = 'p.name'; break; case 'created': $order = 'p.created DESC'; break; } и заменяем на: if(!empty($filter['sort'])) switch ($filter['sort']) { case 'position': $order = 'p.position DESC'; break; case 'name': $order = 'p.name'; break; case 'created': $order = 'p.created DESC'; break; case 'price-min': $order = 'v.price'; break; case 'price-max': $order = 'v.price DESC'; break; } Как видим добавили две сортировки: price-min - от меньшей цены к большейprice-max - от большей цены к меньшей Для проверки у себя в каталоге товара в URL вставляем: ?sort=price-minПолучится примерно так: http://domen.zz/catalog/nevidimka/?sort=price-min Пробуйте!Благодарности в комментарии.... Прикрутил все как по инструкции, но как только обновил страницу с товарами, товары пропали. Как только убираю код из api/Products.php тогда сразу все норм становится... какие-то проблемы или что я не совсем понимаю может кто-то готов помочь? Quote Link to post Share on other sites
Gloobus Posted February 8, 2017 Report Share Posted February 8, 2017 Я сделал немного по другому... в API в функции get_products переделал условие: if(!empty($filter['in_stock'])) $in_stock_filter = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock'])); else $order_stock = '(SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) DESC, '; Ну и естественно в запросе добавил: SELECT ... FROM ... WHERE ... ORDER BY $order_stock $order Все, теперь сортировка работает только тогда, когда запрашиваешь ВСЕ товары, не обращая на то, есть ли они в наличии.Если у товара есть вариант, возвращает 1, если нет, не возвращает ничего А сортировка идет в обратном порядке, то есть сначала те, что в наличии и потом отсутствующие! Quote Link to post Share on other sites
Foх Posted May 10, 2017 Report Share Posted May 10, 2017 а как сделать чтоб товары которые количество 0 , были в конце в админ панели? Quote Link to post Share on other sites
ahmed Posted May 10, 2017 Report Share Posted May 10, 2017 а как сделать чтоб товары которые количество 0 , были в конце в админ панели? Без недостатков, скорее всего, никак. Потому что в админ-панели, кроме прочего, задается сортировка именно по порядку товаров.Можно формально менять сортировку именно в админке, но тогда возможны проблемы. Например исходная сортировка может сбиваться (при сохранении списка).Чтобы было полностью правильно, надо весьма сложным образом менять работу со списком товаров в админке... Quote Link to post Share on other sites
Foх Posted May 11, 2017 Report Share Posted May 11, 2017 Без недостатков, скорее всего, никак. Потому что в админ-панели, кроме прочего, задается сортировка именно по порядку товаров.Можно формально менять сортировку именно в админке, но тогда возможны проблемы. Например исходная сортировка может сбиваться (при сохранении списка).Чтобы было полностью правильно, надо весьма сложным образом менять работу со списком товаров в админке... Ну а данный метод не затрагивает сейчас админ панель? Quote Link to post Share on other sites
ahmed Posted May 11, 2017 Report Share Posted May 11, 2017 Затрагивает одновременно и админку и витрину. При этом методе в админке отсутствующие находятся в конце.И это один из недостатков предложенного метода - он, вообще говоря, не позволяет в админке правильно задавать желаемую сортировку и более того, может эту сортировку самопроизвольно менять. Ибо изначально подход к решению вопроса у автора принципиально неверный... Quote Link to post Share on other sites
Just074 Posted June 22, 2017 Report Share Posted June 22, 2017 А это для какой версии? if(!empty($filter['sort'])) switch ($filter['sort']) { case 'position': $order = 'p.position DESC'; break; case 'name': $order = 'p.name'; break; case 'created': $order = 'p.created DESC'; break; } У меня код такой вот: if(!empty($filter['sort'])) switch ($filter['sort']) { case 'position': $order = 'p.position DESC'; break; case 'name': $order = 'p.name'; break; case 'created': $order = 'p.created DESC'; break; case 'pricemin': //$order = 'pv.price IS NULL, pv.price=0, pv.price'; $order = '(SELECT -pv.price FROM __variants pv WHERE (pv.stock IS NULL OR pv.stock>0) AND p.id = pv.product_id AND pv.position=(SELECT MIN(position) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1) LIMIT 1) DESC'; break; case 'pricemax': $order = '(SELECT -pv.price FROM __variants pv WHERE (pv.stock IS NULL OR pv.stock>0) AND p.id = pv.product_id AND pv.position=(SELECT MIN(position) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1) LIMIT 1)'; break; } Quote Link to post Share on other sites
timoha Posted October 3, 2017 Report Share Posted October 3, 2017 Код исправлен, работоспособен и проверен!! Все замечания высказанные kors учтены! Решение простое:открываем файл: api/Products.php находим функцию: public function get_products($filter = array()) Находим кусок кода: if(!empty($filter['sort'])) switch ($filter['sort']) { case 'position': $order = 'p.position DESC'; break; case 'name': $order = 'p.name'; break; case 'created': $order = 'p.created DESC'; break; case 'price-min': $order = 'v.price'; break; case 'price-max': $order = 'v.price DESC'; break; } После этого кода вставляем: /**/ if(!empty($filter['sort'])){ /**/ $order = 'IF(v.stock < 1,1,0),'.$order; /**/ $group_by = 'GROUP BY p.id'; /**/ $products_stock_null_sort = 'INNER JOIN __variants v ON p.id = v.product_id'; /**/ } После находим запрос: $query = "SELECT p.id, p.url, p.brand_id, p.name, p.annotation, p.body, p.position, p.created as created, p.visible, p.featured, p.rating, p.votes, p.meta_title, p.meta_keywords, p.meta_description, b.name as brand, b.url as brand_url ............в этом запросе находим: LEFT JOIN __brands b ON p.brand_id = b.idпосле этой строки вставляем: $products_stock_null_sortТак, чтобы получилось: LEFT JOIN __brands b ON p.brand_id = b.id $products_stock_null_sort +Под эту же фишку легко сделать СОРТИРОВКУ ТОВАРА ПО ЦЕНЕ, от меньшей к большему и наоборот, для этого в этом же файле: api/Products.phpв этой же функции:public function get_products($filter = array())находим: if(!empty($filter['sort'])) switch ($filter['sort']) { case 'position': $order = 'p.position DESC'; break; case 'name': $order = 'p.name'; break; case 'created': $order = 'p.created DESC'; break; } и заменяем на: if(!empty($filter['sort'])) switch ($filter['sort']) { case 'position': $order = 'p.position DESC'; break; case 'name': $order = 'p.name'; break; case 'created': $order = 'p.created DESC'; break; case 'price-min': $order = 'v.price'; break; case 'price-max': $order = 'v.price DESC'; break; } Как видим добавили две сортировки: price-min - от меньшей цены к большейprice-max - от большей цены к меньшей Для проверки у себя в каталоге товара в URL вставляем: ?sort=price-minПолучится примерно так: http://domen.zz/catalog/nevidimka/?sort=price-min Пробуйте!Благодарности в комментарии....Спасибо!!!! Quote Link to post Share on other sites
andreypetrov Posted January 4, 2018 Report Share Posted January 4, 2018 Все сделал по инструкции, но перестал после этого работать поиск, то есть по запросу товары не находит, только возвращаю назад, так товар в поиске снова ищется. Как можно это исправить, буду признателен?)) Quote Link to post Share on other sites
FIMA Posted November 25, 2019 Report Share Posted November 25, 2019 Проверил на 2.3.8 - РАБОТАЕТ, спасибо! Quote Link to post Share on other sites
get31 Posted August 25, 2021 Report Share Posted August 25, 2021 А как сделать в карточке товара (у меня варианты (размеры) выводятся через select), чтобы при количестве варианта 0 - выводилось вконец списка? типа так: размеры: 38 39 40 35 36 41 мой код: {foreach $product->variants as $v} {if $v->stock == 0} <option {if $v->stock == 0}disabled{/if} data-name="{$product->name}" id="product_{$v->id}" name="variant" value="{$v->id}" data-price="{$v->price|convert} {$currency->sign|escape}" data-compare-price="{$v->compare_price|convert} {$currency->sign|escape}">{$v->size}</option> {else} <option data-name="{$product->name}" id="product_{$v->id}" name="variant" value="{$v->id}" data-price="{$v->price|convert} {$currency->sign|escape}" data-compare-price="{$v->compare_price|convert} {$currency->sign|escape}">{$v->size}</option> {/if} {/foreach} Quote Link to post Share on other sites
Noxter Posted August 25, 2021 Report Share Posted August 25, 2021 1 час назад, get31 сказал: А как сделать в карточке товара (у меня варианты (размеры) выводятся через select), чтобы при количестве варианта 0 - выводилось вконец списка? типа так: размеры: 38 39 40 35 36 41 мой код: {foreach $product->variants as $v} {if $v->stock == 0} <option {if $v->stock == 0}disabled{/if} data-name="{$product->name}" id="product_{$v->id}" name="variant" value="{$v->id}" data-price="{$v->price|convert} {$currency->sign|escape}" data-compare-price="{$v->compare_price|convert} {$currency->sign|escape}">{$v->size}</option> {else} <option data-name="{$product->name}" id="product_{$v->id}" name="variant" value="{$v->id}" data-price="{$v->price|convert} {$currency->sign|escape}" data-compare-price="{$v->compare_price|convert} {$currency->sign|escape}">{$v->size}</option> {/if} {/foreach} https://www.php.net/manual/ru/function.usort.php Quote Link to post Share on other sites
phukortsin Posted August 25, 2021 Report Share Posted August 25, 2021 Самое простое {foreach $product->variants as $v} {if $v->stock > 0} <option data-name="{$product->name}" id="product_{$v->id}" name="variant" value="{$v->id}" data-price="{$v->price|convert} {$currency->sign|escape}" data-compare-price="{$v->compare_price|convert} {$currency->sign|escape}">{$v->size}</option> {/if} {/foreach} {foreach $product->variants as $v} {if $v->stock == 0} <option {if $v->stock == 0}disabled{/if} data-name="{$product->name}" id="product_{$v->id}" name="variant" value="{$v->id}" data-price="{$v->price|convert} {$currency->sign|escape}" data-compare-price="{$v->compare_price|convert} {$currency->sign|escape}">{$v->size}</option> {/if} {/foreach} Quote Link to post Share on other sites
get31 Posted August 27, 2021 Report Share Posted August 27, 2021 В 25.08.2021 в 20:38, phukortsin сказал: Самое простое {foreach $product->variants as $v} {if $v->stock > 0} <option data-name="{$product->name}" id="product_{$v->id}" name="variant" value="{$v->id}" data-price="{$v->price|convert} {$currency->sign|escape}" data-compare-price="{$v->compare_price|convert} {$currency->sign|escape}">{$v->size}</option> {/if} {/foreach} {foreach $product->variants as $v} {if $v->stock == 0} <option {if $v->stock == 0}disabled{/if} data-name="{$product->name}" id="product_{$v->id}" name="variant" value="{$v->id}" data-price="{$v->price|convert} {$currency->sign|escape}" data-compare-price="{$v->compare_price|convert} {$currency->sign|escape}">{$v->size}</option> {/if} {/foreach} Спасибо, чет об этом варианте не подумал)) Quote Link to post Share on other sites
get31 Posted September 8, 2021 Report Share Posted September 8, 2021 В 25.08.2021 в 20:38, phukortsin сказал: Самое простое {foreach $product->variants as $v} {if $v->stock > 0} <option data-name="{$product->name}" id="product_{$v->id}" name="variant" value="{$v->id}" data-price="{$v->price|convert} {$currency->sign|escape}" data-compare-price="{$v->compare_price|convert} {$currency->sign|escape}">{$v->size}</option> {/if} {/foreach} {foreach $product->variants as $v} {if $v->stock == 0} <option {if $v->stock == 0}disabled{/if} data-name="{$product->name}" id="product_{$v->id}" name="variant" value="{$v->id}" data-price="{$v->price|convert} {$currency->sign|escape}" data-compare-price="{$v->compare_price|convert} {$currency->sign|escape}">{$v->size}</option> {/if} {/foreach} Подскажите, пожалуйста, если в каком-то из вариантов цена на товар стоит выше или ниже, как вывести в селекте внизу типа "Цены могут отличаться, если товар..." Сейчас вывожу таким образом, работает на всё где цены разные и одни: {if $product->variant->price < $v->price || $product->variant->price > $v->price} <optgroup> <option>Цены могут отличаться, если товар...</option> </optgroup> {/if} Через {if $v@first} не пройдет т.к вариант может быть ниже Quote Link to post Share on other sites
ps-simpla Posted September 8, 2021 Report Share Posted September 8, 2021 1 час назад, get31 сказал: Подскажите, пожалуйста, если в каком-то из вариантов цена на товар стоит выше или ниже, как вывести в селекте внизу типа "Цены могут отличаться, если товар..." Сейчас вывожу таким образом, работает на всё где цены разные и одни: {if $product->variant->price < $v->price || $product->variant->price > $v->price} <optgroup> <option>Цены могут отличаться, если товар...</option> </optgroup> {/if} Через {if $v@first} не пройдет т.к вариант может быть ниже раз 5 прочитал, но так и не смог вникнуть. Можно подробней, при каком условии надо вывести "Цены могут отличаться, если товар..."? Quote Link to post Share on other sites
get31 Posted September 8, 2021 Report Share Posted September 8, 2021 14 минут назад, ps-simpla сказал: раз 5 прочитал, но так и не смог вникнуть. Можно подробней, при каком условии надо вывести "Цены могут отличаться, если товар..."? есть размеры с ценами: 36 - 100$ 37 - 100$ 38 - 150$ 39 - 100$ 38 размер дороже, вот и интересует как вывести "Цены могут отличаться, если товар..." если 38 дороже Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.