snagovskiy Опубликовано 27 марта, 2016 Жалоба Поделиться Опубликовано 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 но доработка действительно фильтрует криво. Допустим есть два цвета товара черный и белый, если черный в наличии, а белый нет, то этот товар попадет под фильтр и будет внизу с другими товарами которых нет в наличии.... Изменено 27 марта, 2016 пользователем snagovskiy Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 27 марта, 2016 Жалоба Поделиться Опубликовано 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 но доработка действительно фильтрует криво. Допустим есть два цвета товара черный и белый, если черный в наличии, а белый нет, то этот товар попадет под фильтр и будет внизу с другими товарами которых нет в наличии.... вариант Кости пробовали? у меня он работает отлично Цитата Ссылка на сообщение Поделиться на другие сайты
snagovskiy Опубликовано 27 марта, 2016 Жалоба Поделиться Опубликовано 27 марта, 2016 вариант Кости пробовали? у меня он работает отличноПробовал, не помогло. Я купил http://simpla-tuning.com/spisok-tovarov---otsutstvuyuschie-v-kontse работает отлично Цитата Ссылка на сообщение Поделиться на другие сайты
Varyag Опубликовано 27 марта, 2016 Жалоба Поделиться Опубликовано 27 марта, 2016 (изменено) Пробовал, не помогло. Я купил http://simpla-tuning.com/spisok-tovarov---otsutstvuyuschie-v-kontse работает отличноА если вдруг поставите доработку своя валюта на вариант. Где будут цены закупки то $. то в рублях, то в евро. Как будет работать сортировка? Таки я вам скажу - будет жопа Изменено 27 марта, 2016 пользователем Varyag Цитата Ссылка на сообщение Поделиться на другие сайты
cernos Опубликовано 3 апреля, 2016 Автор Жалоба Поделиться Опубликовано 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; /**/ } Работает при любой сортировке и сбрасывает вниз товары, у которых нет ни одного варианта. ЧИТАЙТЕ ВНИМАТЕЛЬНО ФОРУМ. КОСЯК ВЫКЛАДЫВАЛ РЕШЕНИЕОНО ВЫШЕ Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 4 апреля, 2016 Жалоба Поделиться Опубликовано 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; /**/ } Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 4 апреля, 2016 Жалоба Поделиться Опубликовано 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/Там автор в процессе создал даже несколько версий, но полностью все ошибки до конца так и не исправил Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 4 апреля, 2016 Жалоба Поделиться Опубликовано 4 апреля, 2016 Мне нравится как Корс примеры цитирует Цитата Ссылка на сообщение Поделиться на другие сайты
Gregar Опубликовано 7 февраля, 2017 Жалоба Поделиться Опубликовано 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 тогда сразу все норм становится... какие-то проблемы или что я не совсем понимаю может кто-то готов помочь? Цитата Ссылка на сообщение Поделиться на другие сайты
Gloobus Опубликовано 8 февраля, 2017 Жалоба Поделиться Опубликовано 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, если нет, не возвращает ничего А сортировка идет в обратном порядке, то есть сначала те, что в наличии и потом отсутствующие! Цитата Ссылка на сообщение Поделиться на другие сайты
Foх Опубликовано 10 мая, 2017 Жалоба Поделиться Опубликовано 10 мая, 2017 а как сделать чтоб товары которые количество 0 , были в конце в админ панели? Цитата Ссылка на сообщение Поделиться на другие сайты
ahmed Опубликовано 10 мая, 2017 Жалоба Поделиться Опубликовано 10 мая, 2017 а как сделать чтоб товары которые количество 0 , были в конце в админ панели? Без недостатков, скорее всего, никак. Потому что в админ-панели, кроме прочего, задается сортировка именно по порядку товаров.Можно формально менять сортировку именно в админке, но тогда возможны проблемы. Например исходная сортировка может сбиваться (при сохранении списка).Чтобы было полностью правильно, надо весьма сложным образом менять работу со списком товаров в админке... Цитата Ссылка на сообщение Поделиться на другие сайты
Foх Опубликовано 11 мая, 2017 Жалоба Поделиться Опубликовано 11 мая, 2017 Без недостатков, скорее всего, никак. Потому что в админ-панели, кроме прочего, задается сортировка именно по порядку товаров.Можно формально менять сортировку именно в админке, но тогда возможны проблемы. Например исходная сортировка может сбиваться (при сохранении списка).Чтобы было полностью правильно, надо весьма сложным образом менять работу со списком товаров в админке... Ну а данный метод не затрагивает сейчас админ панель? Цитата Ссылка на сообщение Поделиться на другие сайты
ahmed Опубликовано 11 мая, 2017 Жалоба Поделиться Опубликовано 11 мая, 2017 Затрагивает одновременно и админку и витрину. При этом методе в админке отсутствующие находятся в конце.И это один из недостатков предложенного метода - он, вообще говоря, не позволяет в админке правильно задавать желаемую сортировку и более того, может эту сортировку самопроизвольно менять. Ибо изначально подход к решению вопроса у автора принципиально неверный... Цитата Ссылка на сообщение Поделиться на другие сайты
Just074 Опубликовано 22 июня, 2017 Жалоба Поделиться Опубликовано 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; } Цитата Ссылка на сообщение Поделиться на другие сайты
timoha Опубликовано 3 октября, 2017 Жалоба Поделиться Опубликовано 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 Пробуйте!Благодарности в комментарии....Спасибо!!!! Цитата Ссылка на сообщение Поделиться на другие сайты
andreypetrov Опубликовано 4 января, 2018 Жалоба Поделиться Опубликовано 4 января, 2018 Все сделал по инструкции, но перестал после этого работать поиск, то есть по запросу товары не находит, только возвращаю назад, так товар в поиске снова ищется. Как можно это исправить, буду признателен?)) Цитата Ссылка на сообщение Поделиться на другие сайты
FIMA Опубликовано 25 ноября, 2019 Жалоба Поделиться Опубликовано 25 ноября, 2019 Проверил на 2.3.8 - РАБОТАЕТ, спасибо! Цитата Ссылка на сообщение Поделиться на другие сайты
get31 Опубликовано 25 августа, 2021 Жалоба Поделиться Опубликовано 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} Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 25 августа, 2021 Жалоба Поделиться Опубликовано 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 Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 25 августа, 2021 Жалоба Поделиться Опубликовано 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} Цитата Ссылка на сообщение Поделиться на другие сайты
get31 Опубликовано 27 августа, 2021 Жалоба Поделиться Опубликовано 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} Спасибо, чет об этом варианте не подумал)) Цитата Ссылка на сообщение Поделиться на другие сайты
get31 Опубликовано 8 сентября, 2021 Жалоба Поделиться Опубликовано 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} не пройдет т.к вариант может быть ниже Цитата Ссылка на сообщение Поделиться на другие сайты
ps-simpla Опубликовано 8 сентября, 2021 Жалоба Поделиться Опубликовано 8 сентября, 2021 1 час назад, get31 сказал: Подскажите, пожалуйста, если в каком-то из вариантов цена на товар стоит выше или ниже, как вывести в селекте внизу типа "Цены могут отличаться, если товар..." Сейчас вывожу таким образом, работает на всё где цены разные и одни: {if $product->variant->price < $v->price || $product->variant->price > $v->price} <optgroup> <option>Цены могут отличаться, если товар...</option> </optgroup> {/if} Через {if $v@first} не пройдет т.к вариант может быть ниже раз 5 прочитал, но так и не смог вникнуть. Можно подробней, при каком условии надо вывести "Цены могут отличаться, если товар..."? Цитата Ссылка на сообщение Поделиться на другие сайты
get31 Опубликовано 8 сентября, 2021 Жалоба Поделиться Опубликовано 8 сентября, 2021 14 минут назад, ps-simpla сказал: раз 5 прочитал, но так и не смог вникнуть. Можно подробней, при каком условии надо вывести "Цены могут отличаться, если товар..."? есть размеры с ценами: 36 - 100$ 37 - 100$ 38 - 150$ 39 - 100$ 38 размер дороже, вот и интересует как вывести "Цены могут отличаться, если товар..." если 38 дороже Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.