[msProductRemains] Компонент учёта остатков товара
Купить компонент msProductRemains возможно в магазине modStore.pro.
msProductRemains — компонент, предназначенный и реализующий учёт количества оставшихся единиц товара. Остатки могут формироваться по нескольким свойствам (полям товара miniShop2).
При редактировании товара вам необходимо выставить количество оставшихся товаров по каждой комбинации свойств, указанных в настройках компонента.
После того, как статус заказа будет равен тому статусу, что указан в настройках компонента, количество оставшихся товаров, заказанных клиентом, будет автоматически уменьшено на то количество, что было в корзине клиента.
2. Зайдите в настройки системы, выберите фильтр «msproductremains» и настройте параметры для нужд своего сайта.
3. Откройте страницу редактирования товара, заполните значения в свойствах товара, которые указаны в настройках компонента, сохраните товар и перезагрузите страницу.
4. Перейдите на вкладку «Остатки», обновите таблицу и отредактируйте остатки.
На этом настройка компонента завершена. Документация по компоненту также доступна на сайте docs.modx.pro.
msProductRemains — компонент, предназначенный и реализующий учёт количества оставшихся единиц товара. Остатки могут формироваться по нескольким свойствам (полям товара miniShop2).
При редактировании товара вам необходимо выставить количество оставшихся товаров по каждой комбинации свойств, указанных в настройках компонента.
После того, как статус заказа будет равен тому статусу, что указан в настройках компонента, количество оставшихся товаров, заказанных клиентом, будет автоматически уменьшено на то количество, что было в корзине клиента.
Настройка компонента
1. Купите компонент msProductRemains и установите его через менеджер пакетов.2. Зайдите в настройки системы, выберите фильтр «msproductremains» и настройте параметры для нужд своего сайта.
3. Откройте страницу редактирования товара, заполните значения в свойствах товара, которые указаны в настройках компонента, сохраните товар и перезагрузите страницу.
4. Перейдите на вкладку «Остатки», обновите таблицу и отредактируйте остатки.
На этом настройка компонента завершена. Документация по компоненту также доступна на сайте docs.modx.pro.
Поблагодарить автора
Отправить деньги
Комментарии: 178
не поверишь, только что пришла задача которую как рас решает плагин, го покупать
Долго новостей не было и тут сразу такое! При первой необходимости куплю.
В версии 1.0.0-beta содержится ошибка, из-за которой в админке не появляются поля для ввода остатков. Слишком поторопился выложить её. В магазин уже направлена версия 1.0.1-beta с исправлением ошибки. 1.0.2-beta уже готова, но её не тороплюсь выложить, чтобы более тщательно проверить всё.
Кому нужно бесплатно и без изысков, можете юзать такой плагин modx.pro/help/3950/ — самый первый код.
Не увидел плагин, начал готовить остатки на migx, сразу подумал о поле, в котором показывается, сколько уже такого варианта продано. Здесь не вижу такого. Вроде бы логично. Если указываете количество, почему сразу статистику не вести, чтобы можно было вывести её в красивом виде, оценить популярностьвариантов и скорректировать закупку
Ожидаю от такого компонента следующий функционал:
1. Перед добавлением товара в корзину проверяется, есть ли он в таком количестве в наличии, если нет, добавления в корзину не происходит.
2. Перед подтверждением заказа проводится точно такая же проверка.
3. При переводе заказа в статус отменен, товар возвращается в остатки (опционально).
Это что первое пришло в голову…
1. Перед добавлением товара в корзину проверяется, есть ли он в таком количестве в наличии, если нет, добавления в корзину не происходит.
2. Перед подтверждением заказа проводится точно такая же проверка.
3. При переводе заказа в статус отменен, товар возвращается в остатки (опционально).
Это что первое пришло в голову…
Пожелания 1 и 2 работают в 1.0.3-beta, пожелание 3 уже реализовано в 1.0.4-beta, но она почему-то в магазин до сих пор не попала. Сегодня снова отправлю заявку на добавление новой версии плагина.
Кроме этого добавлена единая страница, на которой можно просмотреть остатки товаров (а не открывать товары по отдельности, чтобы смотреть остатки).
Кроме этого добавлена единая страница, на которой можно просмотреть остатки товаров (а не открывать товары по отдельности, чтобы смотреть остатки).
Прошу прощения, проверка товаров перед изменением статуса заказа добавлена в 1.0.4-beta.
Плагин снова отправлен в магазин, надеюсь на этот раз его добавят вовремя.
Плагин снова отправлен в магазин, надеюсь на этот раз его добавят вовремя.
Единая страница с остатками — это здорово. А изменять все остатки на одной странице нельзя?
К сожалению, пока нет, но в будущем такая возможность появится.
Было бы здорово
остатки есть в modstore.pro/packages/ecommerce/msoptionsprice2
Если вам нужно редактирование всех остатков на одной странице можете оплатить работу (2 тр.) и я добавлю этот функционал.
Если вам нужно редактирование всех остатков на одной странице можете оплатить работу (2 тр.) и я добавлю этот функционал.
Пока достаточно имеющегося. Если я правильно понял, все дополнения отсюда привязываются к домену. Когда буду переносить сайт с технического домена на основной, проблем не возникнет?
Один раз можно сбросить хост самому, с помощью кнопки в личном кабинете. Последующие через службу поддержки.
Зачем свою статистику выдумывать, если всё уже ведёт сам miniShop2.
Можно одним запросом из таблицы modx_ms2_order_products собрать статистику по одному варианту, а возможно, и всю сразу.
Если это так необходимо, я добавлю на единую страницу с остатками возможность вывода количества проданных вариантов в новой версии плагина.
Можно одним запросом из таблицы modx_ms2_order_products собрать статистику по одному варианту, а возможно, и всю сразу.
Если это так необходимо, я добавлю на единую страницу с остатками возможность вывода количества проданных вариантов в новой версии плагина.
Извиняюсь. Вы правы, сведения о продажах должны анализироваться на основе заказов. К остаткам они не имеют никакого отношения.
Сергей, два вопроса.
1. Возможно ли использовать ваше дополнением в паре со «Скрипт импорта в miniShop2 из CSV»? Если да, то пытаюсь понять какие поля fields указывать в строке запуска импорта.
1. Возможно ли использовать ваше дополнением в паре со «Скрипт импорта в miniShop2 из CSV»? Если да, то пытаюсь понять какие поля fields указывать в строке запуска импорта.
&fields=article,pagetitle,tv1,size,size,gallery,gallery,tv3
2. Вашего дополнения нет на Тестовом тарифе хостинга modhost. Добавите?
1. Информация об остатках хранится в стандартном поле properties. Поэтому это поле добавлять надо. Только надо отметить, что в этом поле могут быть и другие параметры. Пример как выглядит значение этого поля дам чуть позже, пока не за компьютером.
2. Я с удовольствием добавлю, только знать бы как это сделать.
2. Я с удовольствием добавлю, только знать бы как это сделать.
1. спасибо. жду с нетерпением.
2. Василий ответил, что
2. Василий ответил, что
всё вручную, и не всё еще может нормально само устанавливаться — нужно тестировать.Так, что это значит его инициатива, наверное. :(
Вид поля properties с остатками такой
{"msproductremains":{"Размер 1":"49","Размер 2":"55","Размер 3":"12"}}
Это пример для размеров. Соответственно, должны быть в свойствах Размеры указаны Размер 1, Размер 2 и Размер 3.
то есть в строке импорта пишем:
И про само поле в настройках: msproductremainns_option
что будет, если через некоторое время сменить, уже указанное поле на новое. Допустим решили продавать товар, у него разные вкусы, а размер один.
&fields=article,size;size;size;properties,properties,properties...
а в CSV файле в строке:артикул 1;Размер 1;Размер 2;Размер 3;Размер 1:49;Размер 2:55;Размер 3:12
И про само поле в настройках: msproductremainns_option
что будет, если через некоторое время сменить, уже указанное поле на новое. Допустим решили продавать товар, у него разные вкусы, а размер один.
К сожалению, скорее всего всё сложнее. Придётся добавлять поле properties как оно есть, то есть делать следующим образом.
В строке импорта пишем:
Визуально, все остатки обнулятся, придётся их заполнять заново. Поле указывается общее для всех товаров. По факту, в базе ничего не перезапишется (то есть останутся данные остатков по размерам), пока не будет пересохранён каждый товар с данными остатков по вкусам.
В строке импорта пишем:
&fields=article,size,size,size,properties
а в CSV файле в строке пишем:артикул 1;Размер 1;Размер 2;Размер 3;{"msproductremains":{"Размер 1":"49","Размер 2":"55","Размер 3":"12"}}
Визуально, все остатки обнулятся, придётся их заполнять заново. Поле указывается общее для всех товаров. По факту, в базе ничего не перезапишется (то есть останутся данные остатков по размерам), пока не будет пересохранён каждый товар с данными остатков по вкусам.
и как указать фильтр вывода в msProducts если какого-то размера нет? (в каталоге чтобы эти размеры были неактивными)
то же самое в карточке товара?
то же самое в карточке товара?
Можно использовать сниппет
А есть ещё такой вариант обработки этой ситуации.
Вызываем сниппет так:
[[!msOptionsWithRemains?&id=`[[+id]]`&name=`size`]]
Такой вариант вызова сниппета выведет все размеры товара, которые есть в наличии (то есть скроет все размеры, которые не в наличии).А есть ещё такой вариант обработки этой ситуации.
Вызываем сниппет так:
[[!msOptionsWithRemains?&id=`[[+id]]`&name=`size`&showMissing=`1`]]
И в чанке tpl.msOptions.row выводим параметр таким образом:<option value="[[+value]]" [[+selected]] [[+remains:lte=`0`:then=`disabled="disabled"`]]>[[+value]]</option>
Тогда сниппет выведет все размеры, но размеры не в наличии будут неактивными (выбрать их нельзя будет, но они будут видны).
Фуф, все узнал, что волновало.
Спасибо большое за советы и само дополнение.
Надо переварить, насколько актуально для текущего проекта (новые товары рано или поздно появятся)
Но для сайтов «не супермаркет» то. что надо.
Спасибо большое за советы и само дополнение.
Надо переварить, насколько актуально для текущего проекта (новые товары рано или поздно появятся)
Но для сайтов «не супермаркет» то. что надо.
Хороший компонент!
Но что-то у меня не так. Версия 1.0.7-pl. У товаров свойств нет, все разные, вес не учитывается… Остаток на странице товара ввожу. В «Настройки системы» свойство товара, на основании которого будут формироваться остатки пробовал оставлять size (хотя у меня повторюсь нет) пробовал оставлять пустое поле. Результат одинаков — в админке «Управление остатками товаров» таблица с товарами вообще пустая… ни товаров ни остатков… вообще ни чего.
А так-то работает, на странице товара (на сайте) пишет сколько его осталось.
Что это может быть? Куда глянуть?
Но что-то у меня не так. Версия 1.0.7-pl. У товаров свойств нет, все разные, вес не учитывается… Остаток на странице товара ввожу. В «Настройки системы» свойство товара, на основании которого будут формироваться остатки пробовал оставлять size (хотя у меня повторюсь нет) пробовал оставлять пустое поле. Результат одинаков — в админке «Управление остатками товаров» таблица с товарами вообще пустая… ни товаров ни остатков… вообще ни чего.
А так-то работает, на странице товара (на сайте) пишет сколько его осталось.
Что это может быть? Куда глянуть?
Видимо где-то ошибка при получении списка. Если нажать кнопку обновить под таблицей, слово Загрузка исчезает или остаётся?
Спасибо за ответ! Слово «Загрузка» появляется на секунду и исчезает. Поведение похожее на поиск списка и его отсутствие.
Попробую сам установить чистый modx, minishop2 и поставить с нуля компонент и проверить что там. И отпишусь о решении проблемы.
Большое спасибо! Как будто getlist.class.php не создает getlist. Файлы в процессоре присутствуют все.
Установил компонент с нуля на чистом modx 2.4.0 + minishop2 2.2.0-pl2, настройки никакие у него не менял, то есть формируются остатки по опции size, столбцы таблицы на странице остатков стандартные:
Можете показать настройки компонента?
id,pagetitle,color,size,price,weight,article,published,instock,remains
Всё работает, список выводится, остатки из таблицы меняются.Можете показать настройки компонента?
Спасибо! Да я уверен, что всё должно работать и косяк на моей стороне. А как показать настройки компонента — скриншотом? Я их менял только в выборе опции по которой должны формироваться остатки ставил size и убирал его совсем… без разницы.
Собственно у меня отключены к показу поля color,size,weight на вкладке товара. Попробую вернуть (хотя использовать их не буду) и опять выставлю в настройках size. Отпишусь.
Собственно у меня отключены к показу поля color,size,weight на вкладке товара. Попробую вернуть (хотя использовать их не буду) и опять выставлю в настройках size. Отпишусь.
Собственно прошу прощенья, как и думал мой косяк был. Снес все товары и начал их заносить при уже подключенном плагине. Все заработало как нужно, опций у товаров нет, выбор опции по которой должны формироваться остатки ставил size. Плагин отлично работает и выполняет все заявленные функции.
Еще раз спасибо! Удачи!
Еще раз спасибо! Удачи!
Другая напасть :(
Не из всех категорий в общую таблицу остатков выводит товар. В нижней части таблицы плагин честно пишет: «Показано 1-6 из 8», «Страницы 1 из 1» т.е. пролистать не куда… Куда он ещё 2 припрятал, которые показывать не хочет :) Ограничений фильтрами не делаю.
Не из всех категорий в общую таблицу остатков выводит товар. В нижней части таблицы плагин честно пишет: «Показано 1-6 из 8», «Страницы 1 из 1» т.е. пролистать не куда… Куда он ещё 2 припрятал, которые показывать не хочет :) Ограничений фильтрами не делаю.
Я не совсем корректно сделал эту таблицу (но другого варианта не нашёл) и для реализации деления товаров по опциям сделал обработку полученных массивов, добавляя новые товары с отрицательным ID. Поэтому эти данные сейчас некорректно отображаются, им доверять нельзя. Но если у вас действительно не все товары указаны в таблице, возможно, для них остатки никогда не сохранялись.
Так что может быть и так: «Показано 1-5 из 2». ;)
Так что может быть и так: «Показано 1-5 из 2». ;)
:) Я понял…
Методом «случайного щелканья» обнаружил. что сортировка в таблице работает прикольно. Выбираю «товар» — показывает 8 товаров из 11 (три потерял), выбираю «цена» — показывает 9 товаров причем 2 новых (которые раньше потерял) + 1 которого не было, а два старых пропали, но всего потерял теперь два старых товара :)))
Может там что-то с сортировкой?
А что значит «товары указаные в таблице, возможно, для них остатки никогда не сохранялись.» Это какое-то особое действие? Собственно делаю так:
1. Создать товар-> пишу имя-> Сохранить.
2. Страница обновляется и теперь ввожу описание, цену, артикул, остатки.-> Сохранить
и дальше смотрю таблицу «остатки»
Методом «случайного щелканья» обнаружил. что сортировка в таблице работает прикольно. Выбираю «товар» — показывает 8 товаров из 11 (три потерял), выбираю «цена» — показывает 9 товаров причем 2 новых (которые раньше потерял) + 1 которого не было, а два старых пропали, но всего потерял теперь два старых товара :)))
Может там что-то с сортировкой?
А что значит «товары указаные в таблице, возможно, для них остатки никогда не сохранялись.» Это какое-то особое действие? Собственно делаю так:
1. Создать товар-> пишу имя-> Сохранить.
2. Страница обновляется и теперь ввожу описание, цену, артикул, остатки.-> Сохранить
и дальше смотрю таблицу «остатки»
Скажите пожалуйста, можно как-нибудь реализовать, что у некоторых товаров может быть количество, а некоторые могут быть бесконечные, то есть не иметь количества.
Задать максимально возможное количество остатков для данного товара, например, 999999999. Тогда можно о них забыть. Но такой специальной возможности в компоненте не имеется.
Скажите, пожалуйста, а по дополнительным свойствам (помимо цвета и размера, например, «кол-во разъемов») ведется учет?
Если честно, я не пробовал. В теории, если дополнительное свойство существует и по типу аналогично цвету или размеру, то должно работать. Но учёт ведётся максимум по двум свойствам пока.
А… ну вот… а мне по трем нужно.
«Пока» это обнадеживает =). А когда планируется добавление такой возможности?
«Пока» это обнадеживает =). А когда планируется добавление такой возможности?
Думаю в ближайшую неделю добавлю. Функционал поддерживает хоть сколько свойств. Основная проблема найти результат произведения N массивов для создания всевозможных комбинаций свойств. Можно конечно пойти другим путём и добавить окно для создания комбинаций вручную. Но лучше автоматизировать этот момент.
Спасибо. В ближайшую неделю это очень кстати! Сижу, жду тогда)
Об автоматизации: Когда товаров несколько сотен, у каждого по 10 и более комбинаций и все летят из 1С… да, лучше автоматизировать =D
А с mSklad будет работать?
Об автоматизации: Когда товаров несколько сотен, у каждого по 10 и более комбинаций и все летят из 1С… да, лучше автоматизировать =D
А с mSklad будет работать?
У меня нет данного компонента, чтобы протестировать. Поэтому ничего не могу сказать по этому поводу.
Пробуйте. Добавил в магазин версию 2.0.7-pl с необходимыми доработками. Удачно пришло в голову решение указанной выше задачи. :) Всё проверил, должно работать без проблем. Если найдете ошибки, обязательно сообщите мне в техподдержку.
modstore.pro/cabinet/tickets/ticket
modstore.pro/cabinet/tickets/ticket
Здравствуйте! Подскажите, пожалуйста, будет ли работать из коробки вместе msOptionsPrice2 modstore.pro/packages/ecommerce/msoptionsprice2?
Здравствуйте. Как данный компонент должен работать с msOptionsPrice2? Или вы про то, не будет ли конфликта? Не могу точно утверждать, но не должно быть каких-либо конфликтов.
Интересует, будут ли переключаться цены, которые прописаны в msOptionsPrice2 по опциям и работать ваши остатки?
Да, должно всё работать. Если будут какие-то проблемы, то можете всегда написать мне в техподдержку в магазине modstore.pro.
Спасибо!
Данная опция работает на странице конкретного товара, когда остатки подгружаются AJAX запросом. Как вы вызываете сниппет?
[[!getRemains:default=`Под заказ`?
&id=[[+id]]
]]
в чанке tpl.msProducts.row
Добрый день.
Прошу подсказать, что я делаю не так:
Пытаюсь прописать условие, при котором товар с остатком «0» выдавал бы на своей страничке «Нет в наличии», вместо «Добавить в корзину». Однако ничего не выходит.
Я вызвал сниппет:
Что я упускаю?
Прошу подсказать, что я делаю не так:
Пытаюсь прописать условие, при котором товар с остатком «0» выдавал бы на своей страничке «Нет в наличии», вместо «Добавить в корзину». Однако ничего не выходит.
Я вызвал сниппет:
[[!getRemains:toPlaceholder=`remains`? &id=[[+id]]]]
И прописал условие:[[+remains:is=``:then=`<span class="no-remains">Нет в наличии</span>`:else=`<button class="btn btn-default" type="submit" name="ms2_action" value="cart/add"><i class="glyphicon glyphicon-barcode"></i> В корзину</button>`]]
Но мне в любом случае выдается «Нет в наличии». Если в условии ставить не пустое значение, а null также не работает. Если вызвать плейсхолдер +remains, то он отображает корректное количество товара.Что я упускаю?
Попробуйте вот так
[[+remains:lt=`1`:then=`<span class="no-remains">Нет в наличии</span>`:else=`<button class="btn btn-default" type="submit" name="ms2_action" value="cart/add"><i class="glyphicon glyphicon-barcode"></i> В корзину</button>`]]
Не сработало. В любом случае срабатывает первое условие.
Я пробовал аналогичное, но с «ge» :)
Я пробовал аналогичное, но с «ge» :)
Я, надеюсь, вы плейсхолдер ставите после вызова сниппета?
Да :)
На странице товара сниппет нужно вызвать так
[[!getRemains:toPlaceholder=`remains`]]
Так тоже пробовал. ID добавил уже после.
Сейчас скопировал ваш код, все равно не сработало (как и ранее).
Как я понял, теоретически я делаю все правильно и проблема только в «сопротивлении системы»? Тогда буду думать, что может мешать… или где запятые пропустил… Если решу, отпишусь. :)
Сейчас скопировал ваш код, все равно не сработало (как и ранее).
Как я понял, теоретически я делаю все правильно и проблема только в «сопротивлении системы»? Тогда буду думать, что может мешать… или где запятые пропустил… Если решу, отпишусь. :)
Тогда попробуйте явно задать ID:
[[!getRemains:toPlaceholder=`remains` ?&id=`[[*id]]`]]
Этот вариант не сработал, но я нашел решение.
Работает вот так:
IS тоже работает, если проверять на пустое значение.
Спасибо за помощь, я хоть все лишнее отсечь смог.
Работает вот так:
[[!+remains:gte=`1`:then=`<button class="btn btn-default" type="submit" name="ms2_action" value="cart/add"><i class="glyphicon glyphicon-barcode"></i> В корзину</button>`:else=`<span class="no-remains">Нет в наличии</span>`]]
И здесь главное — "!"… Ранее не подумал, что для плейсхолдера внутри одной странички это важно, потому как я чистил кеш почти каждый раз перед обновлением, не сообразил, что это может влиять так сильно). Но это логично, теперь уже не забуду.IS тоже работает, если проверять на пустое значение.
Спасибо за помощь, я хоть все лишнее отсечь смог.
Сергей, добрый вечер.
Спустя несколько лет у меня вновь возникли проблемы с выводом кнопки «нет в наличии» в данном компоненте.
Несмотря на "!" в вызовах сниппета и плейсхолдера, при первой загрузке страницы из 12 товаров, каждому товару присваивается количество первого в списке. Если страничку перезагрузить, то все работает корректно.
Как такое может быть? Могу ли без принудительного обновления страницы я добиться верных значений?
Спустя несколько лет у меня вновь возникли проблемы с выводом кнопки «нет в наличии» в данном компоненте.
Несмотря на "!" в вызовах сниппета и плейсхолдера, при первой загрузке страницы из 12 товаров, каждому товару присваивается количество первого в списке. Если страничку перезагрузить, то все работает корректно.
Как такое может быть? Могу ли без принудительного обновления страницы я добиться верных значений?
Есть уточнение. Проблема в кнопках пагинации. Т.е, если перейти просто на ссылку на странице, то все значения подгружаются верно, а если переходить по кнопкам page.nav, то без обновления страницы значение одно на все карточки.
Вероятно, это не столь существенно. Но на страничке с списком товаров условие составить получилось. По вашему примеру на docs.modx.pro. Когда нужно !msProducts? добавить &leftJoin и &select
Здравствуйте.
Подскажите пожалуйста как передать значение остатков в другой сниппет на уровне php?
Цель — автоматизировать выставление значения наличия (true/false) для yml-выгрузки.
Подскажите пожалуйста как передать значение остатков в другой сниппет на уровне php?
Цель — автоматизировать выставление значения наличия (true/false) для yml-выгрузки.
Добрый день. Можно просто вызвать сниппет getRemains из вашего сниппета.
Есть ещё вариант подключить компонент как сервис и использовать функцию getRemains, но она не возвращает JSON-массив.
$remains = $modx->runSnippet('getRemains', array(
'product_id' => 123,
'color' => 'Красный',
'size' => 'Большой'
));
К тому же, сниппет с недавних пор выдаёт все остатки товара в виде JSON массива. Для этого вызвать надо сниппет так:$remains = $modx->runSnippet('getRemains', array(
'product_id' => 123,
'return' => 'json'
));
$remains = $modx->fromJSON($remains);
В итоге получаем массив в виде:$remains = array (
0 => array (
'options' =>
array (
'color' => 'Красный',
'size' => 'Малый',
),
'remains' => 6,
),
1 => array (
'options' =>
array (
'color' => 'Синий',
'size' => 'Большой',
),
'remains' => 9,
)
)
И далее ищите в массиве нужные данные.Есть ещё вариант подключить компонент как сервис и использовать функцию getRemains, но она не возвращает JSON-массив.
$msProductRemains = $modx->getService('msProductRemains');
$remains = $msProductRemains->getRemains(array(
'product_id' => 123,
'color' => 'Красный',
'size' => 'Большой'
));
Надеюсь, я вам помог. Желаю удачи!
А как внедрить его в такой код?
$q = $modx->newQuery('msProduct', array('published' => 1, 'deleted' => 0, 'class_key' => 'msProduct'));
$q->innerJoin('msProductData', 'Data', '`msProduct`.`id` = `Data`.`id`');
$q->select('`msProduct`.`id`,`parent`,`pagetitle`,`longtitle`,`description`,`introtext`');
$q->select('`Data`.`price`, `Data`.`image`'.$delivery);
$q->select('`Data`.`price`, `Data`.`image`'.$delivery);
$q->sortby('pagetitle','asc');
$q->innerJoin('msProductRemains', '`Remains.remains', '`msProduct`.`id` = `Remains.product`.`id`');
получаю ошибку
Could not load class: msProductRemains from mysql.msproductremains.
как правильно вызвать класс msProductRemains?
$q = $modx->newQuery('msProduct', array('published' => 1, 'deleted' => 0, 'class_key' => 'msProduct'));
$q->innerJoin('msProductData', 'Data', '`msProduct`.`id` = `Data`.`id`');
$q->select('`msProduct`.`id`,`parent`,`pagetitle`,`longtitle`,`description`,`introtext`');
$q->select('`Data`.`price`, `Data`.`image`'.$delivery);
$q->select('`Data`.`price`, `Data`.`image`'.$delivery);
$q->sortby('pagetitle','asc');
$q->innerJoin('msProductRemains', '`Remains.remains', '`msProduct`.`id` = `Remains.product`.`id`');
получаю ошибку
Could not load class: msProductRemains from mysql.msproductremains.
как правильно вызвать класс msProductRemains?
Попробуйте так:
$q->innerJoin('msprRemains', 'Remains', '`msProduct`.`id` = `Remains`.`product_id`');
пробовал — выдаёт
Could not load class: msprRemains from mysql.msprremains.
Could not load class: msprRemains from mysql.msprremains.
думаю вопрос в вызове в классе msproduct
newQuery('msProduct', array('published' => 1, 'deleted' => 0, 'class_key' => 'msProduct'));
newQuery('msProduct', array('published' => 1, 'deleted' => 0, 'class_key' => 'msProduct'));
фактически мне нужно в переменную считать остатки конкретного товара, найденного по msProduct.id
по сути мне нужно сравнение с 0 для этой строчки
offer id=v[id] available=«true»
соответственно true для остатков больше 0 false для всего остального.
offer id=v[id] available=«true»
соответственно true для остатков больше 0 false для всего остального.
Тогда перед этим делом добавьте вот такое:
$modx->loadClass('msprRemains', MODX_CORE_PATH.'/components/msproductremains/model/msproductremains/');
Или вот так:$modx->loadClass('msprRemains', MODX_CORE_PATH.'/components/msproductremains/model/');
Или просто подключите сервис. Он подтянет все нужные классы за собой.$msProductRemains = $modx->getService('msProductRemains');
Спасибо огромное! первый вариант помог!
Еще раз здравствуйте коллеги.
Подскажите по такому вопросу.
Клиент сделал заказ — со склада товар списался.
Менеджер изменил заказ через админку (например по просьбе клиента).
Как автоматически вернуть на склад исключенный из заказа товар?
Подскажите по такому вопросу.
Клиент сделал заказ — со склада товар списался.
Менеджер изменил заказ через админку (например по просьбе клиента).
Как автоматически вернуть на склад исключенный из заказа товар?
В minishop2 версии 2.4.10-pl добавили нужные события, чтобы заработала эта функция. github.com/bezumkin/miniShop2/commit/000be7961edd6b04469edf262cb0cbb0bc4c9934
Возможно, автоматически у вас плагин не активируется в нужных событиях.
Нужно установить галочку на срабатывание плагина компонента на события:
Возможно, автоматически у вас плагин не активируется в нужных событиях.
Нужно установить галочку на срабатывание плагина компонента на события:
msOnBeforeCreateOrderProduct
msOnCreateOrderProduct,
msOnBeforeUpdateOrderProduct,
msOnUpdateOrderProduct,
msOnBeforeRemoveOrderProduct,
msOnRemoveOrderProduct
И всё должно заработать.
Здравствуйте!
а как быть со свойствами товаров, добавленными через плагины minishop2? оно не выводится в таблицу, к сожалению
а как быть со свойствами товаров, добавленными через плагины minishop2? оно не выводится в таблицу, к сожалению
Добрый день. На странице товара проблем не должно быть, а вот на странице остатков могут быть проблемы. Пока я не нашёл решения этой проблемы.
не, у меня и там и там не показывает. При этом в шаблоне я вполне вменяемо работаю с остатками
Приветствую, коллеги!
Можно ли сделать в этом компоненте так, что бы была возможность добавить в корзину и оформить заказ с отсутствующим на остатках товаром?
При этом в магазине появлялась бы надпись «под заказ» в момент покупки последней позиции.
Можно ли сделать в этом компоненте так, что бы была возможность добавить в корзину и оформить заказ с отсутствующим на остатках товаром?
При этом в магазине появлялась бы надпись «под заказ» в момент покупки последней позиции.
Добрый день. Отключить возможность проверки остатков перед добавлением товара в корзину и перед оформлением заказа (изменением статуса заказа) можно отключить в настройках компонента. Но при этом в магазине не будет появляться надпись «под заказ», это надо будет вам самим доработать, с помощью плагина.
Спасибо за ответ! Я вообще поубирал все проверки. Заказы работают, остаток уменьшается! В минус уходит, если нет товара — тоже хорошо, наглядно :)
Вот думаю, что можно реализовать «под заказ» через «число остатков для сравнения». Если вместо «нет на складе». Написать «под заказ».
Не пойму только как вывести эти слова. Подскажите, пожалуйста
Вот думаю, что можно реализовать «под заказ» через «число остатков для сравнения». Если вместо «нет на складе». Написать «под заказ».
Не пойму только как вывести эти слова. Подскажите, пожалуйста
Все, отбой! Нашел)
Сергей, спасибо за сниппет!
[[!getRemains:gt=`0`:then=`[[%mspr_text_more]]`:else=`[[%mspr_text_zero]]`]]
Далее по плану с фильтром разбираться. Компонент с msearch2 дружит? Чтоб фильтровать «в наличии»/«под заказ»
Сергей, спасибо за сниппет!
[[!getRemains:gt=`0`:then=`[[%mspr_text_more]]`:else=`[[%mspr_text_zero]]`]]
Далее по плану с фильтром разбираться. Компонент с msearch2 дружит? Чтоб фильтровать «в наличии»/«под заказ»
К сожалению, на сегодняшний день связка с mSearch2 мною не была реализована. Мне как-то задавали вопрос на эту тему, но решения. насколько я помню, пока не было
Понятно. Нашел только этот вывод msProducts. Вроде столько параметров. Под фильтр их все равно так просто не вставить?
[[!msProducts?
&leftJoin=`{"Remains":{"class":"msprRemains","on":"msProduct.id = Remains.product_id AND Remains.remains > 0"}}`
&groupby=`msProduct.id`
&select=`{"msProduct":"*","Remains":"SUM(Remains.remains) as remains"}`
&where=`{"Remains.remains:>":"0"}`
]]
Здравствуйте. Возможен ли импорт остатков через компонент msImportExport?
Добрый день. В новой версии убрали поддержку моего компонента. Я веду переговоры по поводу возможности возврата поддержки моего компонента или введения нового функционала, который позволит мне самому реализовать эту поддержку. Но пока результатов нет.
если у Вас уже был до этого msimportexport с импортом остатков, то он будет работать и в новой версии. Проверял
Добрый день. Подскажите, в фильтрах mSearch2 можно фильтровать по вашим остаткам? Например, я ставлю фильтр по sizes и меня интересует, чтобы там были только те размеры у которых остаток больше 0.
Здравствуйте, Сергей!
вылез очень серьезный и глупый баг, связанный с тем, что данные хранятся json строкой.
кейс: используются color,size
остатки импортированы из таблицы.
размеры у кроссовок, например: 34, 34.5, 35, 35.5
в таблице экселя 34 это число, а 34.5 — строка. Так это и пишется в базу — «size»:34 и «size»:«34.5»
а дальше начинается жесть, потому что размер 34 (и все целые числа) не добавить в корзину, хотя остатки есть!
лезу в плагин — вижу метод getRemains
лезу в класс — и в этом методе вижу ПРЯМОЕ СРАВНЕНИЕ JSON строки, сформированной тут же, со строкой из базы!
а если вдруг окажется, что свойства в остатке записаны не в том порядке, что в системной настройке, опять же будет ошибка, хотя данные совпадут.
в связи с этим предлагаю изменить метод getRemains — получать там сначала всю коллекцию остатков данного товара, а потом циклом проходить по ней с приведением типов, а не тупо сравнивать строку. Дольше, зато работать будет.
вылез очень серьезный и глупый баг, связанный с тем, что данные хранятся json строкой.
кейс: используются color,size
остатки импортированы из таблицы.
размеры у кроссовок, например: 34, 34.5, 35, 35.5
в таблице экселя 34 это число, а 34.5 — строка. Так это и пишется в базу — «size»:34 и «size»:«34.5»
а дальше начинается жесть, потому что размер 34 (и все целые числа) не добавить в корзину, хотя остатки есть!
лезу в плагин — вижу метод getRemains
лезу в класс — и в этом методе вижу ПРЯМОЕ СРАВНЕНИЕ JSON строки, сформированной тут же, со строкой из базы!
$rem = $this->modx->getObject('msprRemains', array(
'product_id' => $product_id
,'options' => $this->modx->toJSON($where)
));
я понимаю, что как иначе выбрать из базы, но выходит реализация в корне неверная: в скрипте массив собирается из данных post-запроса, а там всё — строки. И в итоге мы пытаемся сравнить «size»:«34» из скрипта с «size»:34 из базы. А поскольку это строка, и ей плевать на сами данные, получаем ошибку.а если вдруг окажется, что свойства в остатке записаны не в том порядке, что в системной настройке, опять же будет ошибка, хотя данные совпадут.
в связи с этим предлагаю изменить метод getRemains — получать там сначала всю коллекцию остатков данного товара, а потом циклом проходить по ней с приведением типов, а не тупо сравнивать строку. Дольше, зато работать будет.
$raw = $this->modx->getCollection('msprRemains', array('product_id' => $product_id));
$rem = false;
foreach ($raw as $one) {
$compare = $one->get('options');
if ($where == $compare) {
$rem = $one;
break;
}
}
вот так вот у меня заработало. Нестрогое сравнение массивов плюет на тип значений и порядок ключей, что меня полностью устраивает)
Добрый день, Алексей. Спасибо за вашу наводку. Я внимательно прочитал ваш комментарий и просмотрел работу моего компонента и miniShop2. И пришёл к некоторому другому решению. Перебор массива данных и так ведётся внутри функции getRemains, поэтому я просто добавил условие для проверки является ли введённое значение опции целочисленным значением или дробным значением/строкой.
Если вы хотите сами внести изменения, то можете поправить строку 73 в файле msproductremains.class.php, вставив такой код:
Если вы хотите сами внести изменения, то можете поправить строку 73 в файле msproductremains.class.php, вставив такой код:
if ( !empty($tmp) ) $where[trim($option)] = ctype_digit($tmp) ? intval($tmp) : $tmp;
Я более тщательно проверю работу данного решения и выложу обновление в ближайшие несколько дней.
здравствуйте, Сергей! мое решение продиктовано желанием уйти полностью от сравнения json строки к сравнению фактичкских данных. Ваше опять возвращает к строкам. И оно чревато неточностями там, где перепутан порядок опций в строке или число сохранено как строка… воть
1. Можно будет сменить домен?
2. Как храниться все это дело в БД? Смогу ли я выгрузить в 1С остатки адекватно, т.е. товар с определенной опцией как отдельный товар?
2. Как храниться все это дело в БД? Смогу ли я выгрузить в 1С остатки адекватно, т.е. товар с определенной опцией как отдельный товар?
1. Один раз домен можно сбросить. Далее только через тех поддержку.
2. Остатки хранятся в отдельной таблице, опции заносятся в виде json массива, в котором опции упорядочиваются в том же порядке, как указаны они в настройке.
2. Остатки хранятся в отдельной таблице, опции заносятся в виде json массива, в котором опции упорядочиваются в том же порядке, как указаны они в настройке.
админку можно щупануть?
Все дополнения из магазина доступны для установки на тестовом тарифе modhost.
да, защупал, клевая вещь! кстати, не ВСЕ дополнения из магазина доступны на тестовом, увы и ах)))
msListOrders — недоступны, YaCassa — недоступна, msExtraFields — недоступны))
msListOrders — недоступны, YaCassa — недоступна, msExtraFields — недоступны))
Уточните, плиз, после установки модуля купить из категории нельзя, пишет «Выберите размер». Ничего не пиленное, все с нуля. (У товара опция — размеры, можно выбрать на странице товара, ясно-понятно, что в категории размер не выбрать, но все же)
Если вы смотрите из категории товаров, и у вас там нет выбора размера, то будет такая ошибка. Это связано с тем, что по умолчанию включена настройка проверки опций перед добавлением товара. Если у товара есть возможность выбора размера, то компонент будет требовать, чтобы этот размер был выбран, чтобы корректно учитывать остатки. Можно отключить эту настройку, но тогда не гарантируется правильный учёт остатков.
В принципе да, логика правильная. Заметил на некоторых ms2-сайтах, где есть размеры и видимо нет Вашего модуля — там при покупке из категории в корзину добавляется товар без размера, при покупке из карты товара — отдельной строкой с размером...)) Нонсенс будет для бухгалтерии…
А ни у кого такого не было — вместе со строками для каждой опции создается странная строка в списке остатков — в ней все размеры в строчку через запятую и для неё тоже можно вбить количество? Эта строка создается сразу при создании товара, собсно, вместе и с правильными строками остатков для каждой опции.
Два скрина — список со остатками и карта товара.
pr.allser68.beget.tech/strange-row.png
pr.allser68.beget.tech/strange-row-2.png
Два скрина — список со остатками и карта товара.
pr.allser68.beget.tech/strange-row.png
pr.allser68.beget.tech/strange-row-2.png
Это ошибка в отображении этой строки на общей странице остатков. В этой строке нет свойств, соответственно, в поле Размер должно быть указано Нет. Алгоритм компонента работает правильно, но в отображении строки ошибка. Я её поправлю в ближайшее время и выложу обновление.
А вот почему появляется эта строка, то скорее всего вы действуете так. Может вы сначала сохраняете товар, потом добавляете свойства, снова сохраняете? Тогда это вполне возможно. При первом сохранении без свойств создается общая запись об остатков для товара. А когда добавляете свойства и снова сохраняете товар, создаются уже остатки для указанных свойств.
Если указывать свойства перед первым сохранением товара, то общей записи не будет появляться.
А вот почему появляется эта строка, то скорее всего вы действуете так. Может вы сначала сохраняете товар, потом добавляете свойства, снова сохраняете? Тогда это вполне возможно. При первом сохранении без свойств создается общая запись об остатков для товара. А когда добавляете свойства и снова сохраняете товар, создаются уже остатки для указанных свойств.
Если указывать свойства перед первым сохранением товара, то общей записи не будет появляться.
Угу, спасибо достойный ответ. Так и есть — именно так добавляем товары. И ждем обновку.
После обновки также добавляет эту пустую строку.
Если вы сохраняете товар без свойств изначально, то это правильное поведение компонента.
Здравствуйте! В версии minishop 2.4.6 данное дополнение не работает: просто не появляется дополнительная категория «Остатки» в карточке товара… Сначала я грешил на свой магазин, но на тестовом домене была та же беда.
Добрый день. Спасибо за ваше замечание. Я обязательно посмотрю в чем проблема и выложу обновление
Про тестовый домен я погорячился, там всё нормально работает. Проблема у меня.
Драсти!!)) А как можно дошлифовать Ваш компонент, чтобы он вбивал по умолчанию какие-то остатки товара, например, каждого размера по 100шт, а не ноль? У моих товаров до 15 опции РАЗМЕР и в каждом товаре приходится 15 раз вписывать кол-во товара
Добрый день. В настройках компонента есть опция «Количество остатков по умолчанию». Она выполняет необходимую вам функцию.
Мда, мне точно пора за линзами!!)) Спасибо! Еще одно подтверждение тому, что и компонент отлично просчитан и автор хорош и отзывчив!!!
Добрый вечер! На странице списка товаров вызываю снипет так
[[!getRemains:toPlaceholder=`remains`? id=`[[+id]]`]]
[[+remains:lt=`1`:then=`нет`:else=`[[+remains]] шт.`]]
Постоянно выдается первый вариант «Нет».
Списко товаров вызывается при помощи сниппета mfilter2. Если добавляю в него такую конструкцию
'leftJoin' => [
'Remains' => [
'class' => 'msprRemains',
'on' => 'msProduct.id = Remains.product_id AND Remains.remains > 0'
]
],
'groupby' => 'msProduct.id',
'select' => [
'msProduct' => '*',
'Remains' => 'SUM(Remains.remains) as remains'
],
То остатки выводятся правильно, но перестает работать сортировка. При нажатии на сортировку все товары исчезают. Не подскажете в чем может быть причина. Заранее спасибо!
Вот полностью вызов сниппета
{'!mFilter2' | snippet: [
'paginator' => 'pdoPage',
'element' => 'msProducts',
'class' => 'msProduct',
'parents'=>$modx->resource->id,
'depth' => 10,
'filters'=> 'ms|price:number'
'tplFilter.outer.default'=>'mfilter-slider.tpl'
'tplFilter.row.default'=>'mfilter-number.tpl'
'tpl' => 'category-product.tpl',
'tplOuter' => 'mFilter2-outer.tpl',
'leftJoin' => [
'Remains' => [
'class' => 'msprRemains',
'on' => 'msProduct.id = Remains.product_id AND Remains.remains > 0'
]
],
'groupby' => 'msProduct.id',
'select' => [
'msProduct' => '*',
'Remains' => 'SUM(Remains.remains) as remains'
],
'limit' => 18,
'maxLimit' => 200,
'pageLimit' => 12,
'tplPage' => '@INLINE {$pageNo}',
'tplPageActive' => '@INLINE {$pageNo}',
'tplPageWrapper' => '@INLINE {$pages}',
'tplPagePrev' => '@INLINE <',
'tplPageNext' => '@INLINE >',
'tplPageSkip' => '@INLINE ...</span',
'tplPagePrevEmpty' => '@INLINE <<',
'tplPageNextEmpty' => '@INLINE >>',
'sortby' => '{«menuindex»:«ASC»}',
'where' => '{«template»:«4»}'
]}
[[!getRemains:toPlaceholder=`remains`? id=`[[+id]]`]]
[[+remains:lt=`1`:then=`нет`:else=`[[+remains]] шт.`]]
Постоянно выдается первый вариант «Нет».
Списко товаров вызывается при помощи сниппета mfilter2. Если добавляю в него такую конструкцию
'leftJoin' => [
'Remains' => [
'class' => 'msprRemains',
'on' => 'msProduct.id = Remains.product_id AND Remains.remains > 0'
]
],
'groupby' => 'msProduct.id',
'select' => [
'msProduct' => '*',
'Remains' => 'SUM(Remains.remains) as remains'
],
То остатки выводятся правильно, но перестает работать сортировка. При нажатии на сортировку все товары исчезают. Не подскажете в чем может быть причина. Заранее спасибо!
Вот полностью вызов сниппета
{'!mFilter2' | snippet: [
'paginator' => 'pdoPage',
'element' => 'msProducts',
'class' => 'msProduct',
'parents'=>$modx->resource->id,
'depth' => 10,
'filters'=> 'ms|price:number'
'tplFilter.outer.default'=>'mfilter-slider.tpl'
'tplFilter.row.default'=>'mfilter-number.tpl'
'tpl' => 'category-product.tpl',
'tplOuter' => 'mFilter2-outer.tpl',
'leftJoin' => [
'Remains' => [
'class' => 'msprRemains',
'on' => 'msProduct.id = Remains.product_id AND Remains.remains > 0'
]
],
'groupby' => 'msProduct.id',
'select' => [
'msProduct' => '*',
'Remains' => 'SUM(Remains.remains) as remains'
],
'limit' => 18,
'maxLimit' => 200,
'pageLimit' => 12,
'tplPage' => '@INLINE {$pageNo}',
'tplPageActive' => '@INLINE {$pageNo}',
'tplPageWrapper' => '@INLINE {$pages}',
'tplPagePrev' => '@INLINE <',
'tplPageNext' => '@INLINE >',
'tplPageSkip' => '@INLINE ...</span',
'tplPagePrevEmpty' => '@INLINE <<',
'tplPageNextEmpty' => '@INLINE >>',
'sortby' => '{«menuindex»:«ASC»}',
'where' => '{«template»:«4»}'
]}
В вызов mFilter2 необходимо добавить параметр:
'loadModels' => 'msproductremains'
Тогда фильтрация будет работать корректно.
Добрый день! Не подскажете как выгружать из 1с (куплен компонент msync), количество товаров в поле остатков?
Подскажите, пожалуйста, может ли данный модуль менять статус товара на «Нет в наличии», если его количество становится равно нулю?
А по какой причине нету поддержки msimportexport? Это надо их разработчика напрягать или здешнего?
И подскажите, как мне удобнее организовать работу с остатками, если у меня у товара нету опций как таковых (размер, цвет). Думал изначально, что у товара будет просто одно дополнительное циферное поле, а получается, что мне надо вводить какую-нибудь опцию типа Цвет — «Обычный», потом добавлять в таблицу с остатками одну строку с нужным числом. Ну и для импорта дополнительные сложности, если его вообще запилят.
И подскажите, как мне удобнее организовать работу с остатками, если у меня у товара нету опций как таковых (размер, цвет). Думал изначально, что у товара будет просто одно дополнительное циферное поле, а получается, что мне надо вводить какую-нибудь опцию типа Цвет — «Обычный», потом добавлять в таблицу с остатками одну строку с нужным числом. Ну и для импорта дополнительные сложности, если его вообще запилят.
А по какой причине нету поддержки msimportexport? Это надо их разработчика напрягать или здешнего?К сожалению, это не от меня и моего компонента зависит.
И подскажите, как мне удобнее организовать работу с остатками, если у меня у товара нету опций как таковых (размер, цвет).Из настроек компонента удалить все поля, по которым ведутся остатки (то есть оставить значение настройки пустым). И даже если этого не сделать, без всяких опций всё равно должны появится одна строка с нужным числом в таблице. Я постарался ясно изложить как пользоваться компонентом в документации.
Если у вас появились какие-то проблемы с компонентом, пишите в техподдержку компонента в магазине modStore.pro. Я решу все проблемы с компонентом
Здравствуйте, возник вопрос в подключении класса на сайте реализованы остатки с помощью вашего компонента без привязки к свойствам все работает отлично и есть вот такой код
где
Как мне правильно подставить туда чтобы подставлялись остатки по id продукта на форуме читал вы отвечали ну что то у меня не получается
modx.pro/components/5022#comment-81789
public function get()
{
$list = [];
$q = $this->modx->newQuery('modResource');
$q->leftJoin('msProductData', 'Data', ['modResource.id = Data.id']);
$q->leftJoin('msVendor', 'Vendor', ['Data.vendor = Vendor.id']);
$q->innerJoin('msInformUserArrival', 'Arrival', ['modResource.id = Arrival.res_id']);
$q->innerJoin('msInformUserMailing', 'Mailing', ['Arrival.mailing_index = Mailing.index']);
$q->select($this->modx->getSelectColumns('modResource', 'modResource', 'product.'));
$q->select($this->modx->getSelectColumns('msProductData', 'Data', 'product.'));
$q->select($this->modx->getSelectColumns('msVendor', 'Vendor', 'product.vendor.'));
$q->select($this->modx->getSelectColumns('msInformUserArrival', 'Arrival', 'arrival_'));
$q->select($this->modx->getSelectColumns('msInformUserMailing', 'Mailing', 'mailing_'));
$q->where([
'published' => 1,
'deleted' => 0,
'iu_count:>' => 0,
'Arrival.status:IN' => [1, 3],
'Mailing.active' => 1,
]);
// if (!$this->msInformUser->useCron) {
$q->limit($this->config['limitSend']);
// }
if ($q->prepare() && $q->stmt->execute()) {
while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
$list[] = $row;
}
}
// $this->modx->cacheManager->set('iustockout', $list, 7200);
if (!empty($list)) {
$this->prepareSending($list);
}
return true;
}
где
'iu_count:>' => 0,
проверяются остатки.Как мне правильно подставить туда чтобы подставлялись остатки по id продукта на форуме читал вы отвечали ну что то у меня не получается
modx.pro/components/5022#comment-81789
Здесь иная ситуация, вам необходимо в запросе добавить таблицу с остатками и проверять остатки
В вашем случае на один товар должна быть одна запись с остатками, поэтому можно было просто обойтись более простым присоединением таблицы:
$q->leftJoin('msprRemains', 'Remains', ['modResource.id = Remains.product_id', 'Remains.remains > 0']);
$q->select(['SUM(Remains.remains) as remains']);
А вместо 'iu_count:>' => 0,
пишем 'Remains.remains:>' => 0,
Данный случай присоединения таблицы откидывает опции (а в вашем случае они не нужны) и записи с остатками меньше 0. И в remains записывается суммарный остаток товара по всем опциям.В вашем случае на один товар должна быть одна запись с остатками, поэтому можно было просто обойтись более простым присоединением таблицы:
$q->leftJoin('msprRemains', 'Remains', ['modResource.id = Remains.product_id']);
$q->select($this->modx->getSelectColumns('msprRemains', 'Remains'));
Но и первый вариант тоже должен корректно работать. В общем, пробуйте. Должно работать.
Спасибо добавил вторым вариантом все корректно работает.
Оберните фразу с наличием в тег div с классом mspr-remains. И должен быть подключен стандартный JS-файл компонента (по умолчанию, он включен). Подробнее об этом здесь.
[[!getRemains:toPlaceholder=`remains` ?&id=`[[*id]]`]]
<div class="mspr-remains">[[!+remains=`0`:then=`[[%mspr_text_more]]`:else=`[[%mspr_text_zero]]`]]</div>
Лучше использовать словари, потому как после запроса берутся фразы из словаря. Если у вас вместо слова появляется цифра с остатком, то необходимо включить опцию «Скрывать количество остатков» в настройках компонента.
Ваш вариант не помог, пришлось свой сниппет писать на основании Вашего…
Вопрос следующий, нужно зафиксировать определенное количество товара, т.е. допустим, первый товар остаток 0 (и его нельзя добавить в корзину), а второй товар остаток 9999999(при добавлении любого количества товара должно остаться 9999999).
С такими настройками если 0, то не добавляется, если 9999999 добавляется и вычитается.
Вопрос следующий, нужно зафиксировать определенное количество товара, т.е. допустим, первый товар остаток 0 (и его нельзя добавить в корзину), а второй товар остаток 9999999(при добавлении любого количества товара должно остаться 9999999).
С такими настройками если 0, то не добавляется, если 9999999 добавляется и вычитается.
Здравствуйте подскажите пожалуйста как правильно вызвать в mFilter2 добавил в вызов сниппета
далее нужно вызвать в &filters=``
&leftJoin=`{ "Remains":{ "class":"msprRemains","on":"msProduct.id = Remains.product_id" } }`
&select=`{ "msProduct":"*","Remains":"SUM(Remains.remains) as remains" }`
&loadModels=`msproductremains`
далее нужно вызвать в &filters=``
Добрый день, купили ваш компонент + стоял msync. В товарах свойств нет, в настройке поле setting_mspr_options пустое. Достаточно ли в настроках msync поставить соотв полю источника «Количество» цель «remains» типа «поле msProduct»? СПасибо
Добрый день. Поле не являются полем msProduct, поэтому так не получится. Вы можете не связывать источник с каким-либо полем, в компоненте в плагин встроена процедура, которая ищет поле источника, по умолчанию, поле «Количество», и, если находит, обновляет остаток товара. В системных настройках компонента можно изменить поле источника.
Спасибо за ответ
Всем добрый день!
Автор очень долго отвечает на тикет, подскажите если есть у кого такая-же проблема. Когда из 1с вычитается товар в 0, то компонент почему то оставляет 1. Хотя в логах написано, что mSync передает 0. А в msProductRemains остается 1. Если товар не заканчивается, то нормально вычитает.
Автор очень долго отвечает на тикет, подскажите если есть у кого такая-же проблема. Когда из 1с вычитается товар в 0, то компонент почему то оставляет 1. Хотя в логах написано, что mSync передает 0. А в msProductRemains остается 1. Если товар не заканчивается, то нормально вычитает.
Подскажите, товары, которых нет в наличии, могут отображаться в самом конце категории, после всех товаров из наличия?
Попробуйте вот так:
[[!msProducts?
&leftJoin=`{"Remains":{"class":"msprRemains","on":"msProduct.id = Remains.product_id AND Remains.remains > 0"}}`
&groupby=`msProduct.id`
&select=`{"msProduct":"*","Remains":"IF (Remains.remains > 0, 1, 0) as remains"}`
&sortby=`Remains.remains`
&sortdir=`DESC`
]]
Спасибо, а как будет на fenom не подскажите?
пишет
[pdoTools] Error 42S22: Unknown column 'Remains.remains' in 'field list'
Подскажите как правильно вывести это для mFilter2?
Вывожу так, но потом сам фильтр не ищет, пишет результатов нет
Вывожу так, но потом сам фильтр не ищет, пишет результатов нет
'leftJoin' => ["Remains" => [
"class" => "msprRemains",
"on" => ["msProduct.id = Remains.product_id AND Remains.remains > 0"]
]
],
'groupby' => 'msProduct.id',
'select' => ['msProduct' => '*', 'Remains' => 'IF (Remains.remains > 0, 1, 0) as remains'],
В вызов mFilter2 необходимо добавить
'loadModels' => 'msproductremains'
Тогда будет искать после загрузки
после обновления компонента, слетела сортировка, подскажите. что то поменялось?
Добрый день. Ничего не изменялось, что могло бы повлиять на сортировку. Модель объекта и базы данных осталась прежней.
почему то перестала работать сортировка, в вызове вот так
'sort' => 'Remains|remains:desc',
'loadModels' => 'msproductremains',
'leftJoin' => ["Remains" => [
"class" => "msprRemains",
"on" => ["msProduct.id = Remains.product_id AND Remains.remains > 0"]
]
],
'groupby' => 'msProduct.id',
'select' => ['msProduct' => '*', 'Remains' => 'IF (Remains.remains > 0, 1, 0) as remains'],
можете подсказать правильно ли все там?
вопрос решен
Доброго времени суток, подскажите может ли компонент работать с торговыми предложениями?, нужно чтобы цвет, размер и остаток подхватывались.
забыл уточнить, в связке с msync
На сегодняшний день в плагине компонента есть код для работы с компонентом mSync. В самом mSync дополнительно настраивать и указывать при импорте ничего не надо, а вот в системных настройках msProductRemains необходимо будет указать поле 1С, из которого необходимо читать остатки.
приветствую, написал обработчик для фильтрации в mfilter2 он работает, но не работает ajax фильтрация
да прописывал 'loadModels' => 'msproductremains' — не помогает
да прописывал 'loadModels' => 'msproductremains' — не помогает
public function getRemainsValues(array $fields, array $ids) {
$filters = array();
$q = $this->modx->newQuery('modResource');
$q->leftJoin('msprRemains', 'Remains', ['modResource.id = Remains.product_id']);
$q->select($this->modx->getSelectColumns('msprRemains', 'Remains'));
$q->where(array('modResource.id:IN' => $ids));
$q->select('modResource.id,' . implode(',', $fields));
$tstart = microtime(true);
if ($q->prepare() && $q->stmt->execute()) {
$this->modx->queryTime += microtime(true) - $tstart;
$this->modx->executedQueries++;
while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
foreach ($row as $k => $v) {
$v = str_replace('"', '"', trim($v));
if ($k == 'id') {
continue;
}
elseif (isset($filters[$k][$v])) {
$filters[$k][$v][$row['id']] = $row['id'];
}
else {
$filters[$k][$v] = array($row['id'] => $row['id']);
}
}
}
}
else {
$this->modx->log(modX::LOG_LEVEL_ERROR, "[mSearch2] Error on get filter params.\nQuery: " . $q->toSQL() .
"\nResponse: " . print_r($q->stmt->errorInfo(), 1)
);
}
return $filters;
}
Для msearch2 в компоненте поставляется класс для фильтрации товара по наличию.
Класс-обработчик фильтров в системных настройках? да его прописал
Именно. А для чего тогда ваша функция?
да класс прописал в системных настройках, обработчик работает он фильтрует, единственное что не работает это ajax
К сожалению, так не могу сказать. Необходимо смотреть что возвращает ajax-запрос, журнал ошибок и заниматься поимкой ошибки.
Добрый день всем! Внезапно проблема возникла. Подскажите, плз, что это такое.
Пропала вкладка «Остатки» и новые товары так же не отображаются в сводной таблице остатков. Дополнение не дорабатывали и никаким образом
Пропала вкладка «Остатки» и новые товары так же не отображаются в сводной таблице остатков. Дополнение не дорабатывали и никаким образом
Добрый день. Возможно вы обновляли другие пакеты, так как компонент работает только в паре с miniShop2. Можете указать версию MODx, miniShop2 и msProductRemains?
MODX — 2.7.3-pl
miniShop2 — 2.5.0-pl
msProductRemains — 2.1.25-pl
miniShop2 — 2.5.0-pl
msProductRemains — 2.1.25-pl
Проверил работу компонента с указанными версиями компонентом. Никаких проблем на чистом сайте нет. Можете показать консоль браузера при открытии страницы редактирования товара? Может у компонента возникает ошибка при работе кода и поэтому вкладка не появляется.
Есть такое сообщение — prntscr.com/u6xis2
DevTools failed to load SourceMap: Could not load content for lovebythemoon.store/manager/assets/modext/modx.jsgrps-min.js.map: HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE
DevTools failed to load SourceMap: Could not load content for lovebythemoon.store/manager/assets/modext/modx.jsgrps-min.js.map: HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE
Удалось ли решить проблему?
Сергей, может я вам доступы сброшу? Написал бы в ТП, но вылезла эта проблема боее чем через год(
Да, так было бы удобнее. Напишите мне на почту через форму внутри профиля на данном сайте или modstore.pro и мы разберёмся в вашей ситуации.
спасибо) написал на modstore
Всем привет, появилась задача сортировать товары по наличию или сделать под галку, что бы показывались товары в наличии. но Если сделать сортировку, то скорость загрузки по данным debugParser 18 сек. на странице примерно 900 товаров.
Total parse time 18.2190938 s
Total queries 365
Total queries time 17.4899082 s
Если отключить,
Total parse time 1.6309950 s
Как то можно ускорить работу?
Total parse time 18.2190938 s
Total queries 365
Total queries time 17.4899082 s
Если отключить,
Total parse time 1.6309950 s
Как то можно ускорить работу?
Не у кого нет таких проблем? Или ни кто не сортирует товары по наличию? Сергей проверьте пожалуйста.
Здравствуйте, а есть возможность сделать комбинацию из cityFields и msProductRemains, чтобы привязать остатки к разным складам в разных городах?)
Что-то я пока на этапе планирования не могу склеить в голове как красивее реализовать, да потом еще с 1С -7 связать :)
Что-то я пока на этапе планирования не могу склеить в голове как красивее реализовать, да потом еще с 1С -7 связать :)
В одной из веток комментариев уже задавал вопрос, но лучше опишу проблему полнее, так, как ее вижу сейчас:
1. Для вывода товара на сайте используется компонент msFilter2.
2. Для отслеживания остатков компонент msProductRemains
2. В карточках товара важно указывать возможность «Купить» или статус «Нет в наличии». Для чего используется конструкция:
Вызов сниппета, в каждой карточке (в чанке msProducts.row):
Однако, на странице выдается 20 товаров из множества, таким образом есть еще и пагинация. Если переключаться через пагинацию, то условие выше не работает, потому что в каждую карточку загружается значение первой карточки. Если обновить страничку, то все считается корректно.
Я так понимаю, что здесь мешает сам фильтр. Может быть кто-то встречался с такой проблемой и решил ее?
1. Для вывода товара на сайте используется компонент msFilter2.
2. Для отслеживания остатков компонент msProductRemains
2. В карточках товара важно указывать возможность «Купить» или статус «Нет в наличии». Для чего используется конструкция:
Вызов сниппета, в каждой карточке (в чанке msProducts.row):
[[!getRemains:toPlaceholder=`remains`? &id=`[[+id]]`]]
И условие:[[!+remains:lt=`1`:then=`<div class="no-remains">Нет в наличии</div>`:else=`<span><button class="btn btn-primary list-prod__submit" type="submit" name="ms2_action" value="cart/add">Купить</button></span>`]]
Условие срабатывает прекрасно, если просто зайти на страницу каталога.Однако, на странице выдается 20 товаров из множества, таким образом есть еще и пагинация. Если переключаться через пагинацию, то условие выше не работает, потому что в каждую карточку загружается значение первой карточки. Если обновить страничку, то все считается корректно.
Я так понимаю, что здесь мешает сам фильтр. Может быть кто-то встречался с такой проблемой и решил ее?
Проблему решил. Добавил в вызов фильтра:
&leftJoin=`{"Remains":{"class":"msprRemains","on":"msProduct.id = Remains.product_id AND Remains.remains > 0"}}`
&loadModels=`msproductremains`
&groupby=`msProduct.id`
&select=`{"msProduct":"*","Remains":"SUM(Remains.remains) as remains"}`
Добрый день! У кого был опыт выгрузки остатков через стандартный скрипт импорта CSV (miniShop2)?
Остатки без характеристик.
Из комментариев пробовал так
properties
{«msproductremains»:{«remains»:«49»}}
{«msproductremains»:{«49»}}
{«msproductremains»:«49»}
49
remains
49
Не выходит
Остатки без характеристик.
Из комментариев пробовал так
properties
{«msproductremains»:{«remains»:«49»}}
{«msproductremains»:{«49»}}
{«msproductremains»:«49»}
49
remains
49
Не выходит
Добрый день. К сожалению, через стандартный скрипт импорта CSV нет возможности импортировать остатки. Я не нашёл способ корректно вшиться в процесс импорта, чтобы отличить его от процесса сохранения товара (так как скрипт импорта использует стандартный процессор resource/update MODx.
Добрый день!
А можно ли, используя ваше дополнение, изменять товарные остатки и загружать их из таблицы CSV при помощи компонента msImportExport?
Т.е. можем мы для товарных остатков завести специальное поле в виде опции Minishop2, которую «увидит» msImportExport?
Или если для остатков ваш компонент вводит собственное уникальное поле — можно ли сделать так, чтобы остатки импортировались/экспортировались в таблицу при помощи msImportExport?
А можно ли, используя ваше дополнение, изменять товарные остатки и загружать их из таблицы CSV при помощи компонента msImportExport?
Т.е. можем мы для товарных остатков завести специальное поле в виде опции Minishop2, которую «увидит» msImportExport?
Или если для остатков ваш компонент вводит собственное уникальное поле — можно ли сделать так, чтобы остатки импортировались/экспортировались в таблицу при помощи msImportExport?
Добрый день. Да, компонент msImportExport поддерживает импорт остатков в поля компонента msProductRemains. В описании к компноненту msImportExport есть раздел «Импорт msProductRemains», где описано как правильно импортировать остатки.
Ок, спасибо. Есть возможность протестировать компонент на modhost.pro/?
В настоящее время импорт остатков с компонентом msImportExport происходит по ID товара. А возможно ли настроить ваш копонент таким образом, чтобы msImportExport в режиме «Импорт msProductRemains» импортировал остатки по Артикулу?
Со стороны компонента msProductRemains такого сделать нельзя. Я не знаю как реализован импорт остатков в msImportExport, поэтому подсказать как в данном компоненте это сделать также не могу. На какой-то стороне в итоге придётся реализовать поиск товара по артикулу, а не по ID.
Ок, спасибо. Попробуем с другой стороны тогда.
Спасибо, потестируем. Компонент нужен.
Как деактивировать значение опции, если оно закончилось?
Опции в товаре выводу так (в чанке):
Опции в товаре выводу так (в чанке):
{'msOptions' | snippet: [
'product' => $id,
'options' => 'option_size',
'tpl' => 'tpl-msOptions'
]}
И чанк tpl-msOptions:{foreach $options as $name => $values}
<div class="options-title"><b>{('ms2_product_' ~ $name) | lexicon}</b></div>
{foreach $values as $value index=$index}
<label class="options-label">
<input type="radio" value="{$values[$index]}" name="options[{$name}]" {if $index == 0}checked="checked"{/if}/>
<span>{$values[$index]}</span>
</label>
{/foreach}
{/foreach}
Подскажите, пожалуйста, возможно ли с помощью Вашего модуля записывать остатки у товара по складам?
На текущий момент не работает по складам компонент, то есть реализовать нельзя такое на текущий момент. В будущем планируется такой функционал, но когда не могу сказать.
Здравствуйте.
Хочу уточнить: для товаров без свойств и модификаций Ваш компонент будет работать?
Хочу уточнить: для товаров без свойств и модификаций Ваш компонент будет работать?
Добрый день. Да, компонент работает с товарами без свойств и модификаций.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.