msProductRemains. Учёт по нескольким опциям!
Наконец-то дописана вторая версия компонента msProductRemains для учёта складских остатков товаров, которая несёт в себе одно из самых востребованных нововведений — учёт остатков по нескольким опциям! То есть теперь можно вести учёт остатков по комбинациям опций, например, цветов и размеров.
![](https://file.modx.pro/files/0/7/f/07fabf8b1eebd0e5ee0c48b5a5c4d6fas.jpg)
На самом деле, компонент не потому получил версию 2 и снова получил статус beta. Дело в том, что он был полностью переписан, логика работы изменилась, но функции остались те же. Хотя от части фишек пришлось отказаться и, надеюсь, это временно.
Самый печальный момент в этом обновлении — оно несовместимо с предыдущими версиями. По факту, произвести обновление компонента через панель управления сайтом можно, но, грубо говоря, это приведёт к установке компонента с нуля. А всё потому, что:
Но плюсы перехода на новую версию перекрывают минусы, которые решаются за минимальное время. Добавляется множество отличных фишек и решаются старые проблемы. А именно:
Обновление уже добавлено в наш любимый магазин. Скачать обновление или купить компонент можно через панель управления сайтом, если магазин подключен к вашему сайту.
![](https://file.modx.pro/files/0/7/f/07fabf8b1eebd0e5ee0c48b5a5c4d6fas.jpg)
На самом деле, компонент не потому получил версию 2 и снова получил статус beta. Дело в том, что он был полностью переписан, логика работы изменилась, но функции остались те же. Хотя от части фишек пришлось отказаться и, надеюсь, это временно.
Самый печальный момент в этом обновлении — оно несовместимо с предыдущими версиями. По факту, произвести обновление компонента через панель управления сайтом можно, но, грубо говоря, это приведёт к установке компонента с нуля. А всё потому, что:
- Остатки теперь хранятся в отдельной таблице и при обновлении не переносятся в новую таблицу.
- Удален сниппет `msOptionsWithRemains`, а сниппет `getRemainsCount` переименован в `getRemains`.
Вместо `msOptionsWithRemains` используйте стандартный `msOptions` - Все настройки компонента и записи словаря получили укороченные ключи.
- Удалён плейсхолдер [[+remains]] и соответствующий столбец таблицы.
Вернуть можно путём добавления вызова сниппета
[[!getRemains:toPlaceholder=`remains`]]
Вся логика с фронта сайта временно удалена.Появилась снова в 2.0.4-beta.
Но плюсы перехода на новую версию перекрывают минусы, которые решаются за минимальное время. Добавляется множество отличных фишек и решаются старые проблемы. А именно:
- Одной из самых серьёзных проблем компонента была проблема с кэшем MODx. После обновления остатков, на фронте сайта висела старая информация и при определённых условиях посетителю удавалось успешно обходить ограничения компонента. И всё это из-за того, что кэш страницы обновлялся через раз. Теперь проблема с кэшем неактуальна, потому как информация об остатках хранится в отдельной таблице.
- Хранение остатков в отдельной таблице увеличивает скорость работы компонента, потому как исключается огромное количество лишних запросов к таблице контента сайта, где ранее хранилась информация об остатках.
- Редактирование остатков стало более удобно, оформлено красиво и работает быстро. Теперь при редактировании товара обновлять страницу после изменения свойств товаров необязательно, достаточно обновить таблицу остатков на соответствующей вкладке страницы.
- При проверке остатков товаров всей корзины теперь выводится каких именно товаров недостаточно.
Обновление уже добавлено в наш любимый магазин. Скачать обновление или купить компонент можно через панель управления сайтом, если магазин подключен к вашему сайту.
Поблагодарить автора
Отправить деньги
Комментарии: 34
В магазине написано, что последняя версия 2.0.2-beta, но это ошибка. Последняя доступная версия: 2.0.0-beta.Это не ошибка, это кэш на полчаса. Уже обновился.
А нет, это таки ошибка, я неправильно понял.
То ли автор, то ли тот, кто загружал, переименовал сам файл как версию 2.0.2-beta, в внутри 2.0.0-beta, отсюда и ошибка.
Поправил, теперь всё работает.
То ли автор, то ли тот, кто загружал, переименовал сам файл как версию 2.0.2-beta, в внутри 2.0.0-beta, отсюда и ошибка.
Поправил, теперь всё работает.
Добрый день! Подскажите, как быть если мы уже забили около 500 складских остатков товаров со старой версией компонента? (у каждого товара несколько размеров, и у каждого размера свой остаток) Можно не вручную всю забитую базу перенести на новую версию компонента?
Здравствуйте. Я сегодня вечером напишу скрипт для переноса старых остатков и напишу как им воспользоваться.
Сергей, новости?
Не удается компонент установить. Посмотри тикет, пожалуйста: modstore.pro/cabinet/tickets/4610/1900/
Не удается компонент установить. Посмотри тикет, пожалуйста: modstore.pro/cabinet/tickets/4610/1900/
Прошу прощения за задержку, но приводил и компонент, и скрипт в порядок. Скрипт для импорта остатков со старой версии компонента можно скачать здесь file.modx.pro/files/1/1/f/11f21b118b85042a036b1b3359d85397.zip
Необходимо распаковать архив в корень сайта, запустить его по ссылке www.ваш_сайт.ru/mspr_convert.php. После появления записи «Done!» необходимо обновить кэш сайта и удалить файл скрипта. Готово!
Ещё один момент: обязательно обновите компонент до версии 2.0.1-beta, там небольшие поправки для формирования остатков по одной опции. Поправки важные, если не обновится, в дальнейшем понадобится снова поправлять вид остатков в базе данных.
Необходимо распаковать архив в корень сайта, запустить его по ссылке www.ваш_сайт.ru/mspr_convert.php. После появления записи «Done!» необходимо обновить кэш сайта и удалить файл скрипта. Готово!
Ещё один момент: обязательно обновите компонент до версии 2.0.1-beta, там небольшие поправки для формирования остатков по одной опции. Поправки важные, если не обновится, в дальнейшем понадобится снова поправлять вид остатков в базе данных.
то что важно — никогда не бывает срочно. спасибо за оперативность)
попробовал — не работает.
выдает ошибку:
выдает ошибку:
Notice: Undefined variable: config in /home/s3036/www/mspr_convert.php on line 20
Notice: Undefined variable: remains in /home/s3036/www/mspr_convert.php on line 34
Warning: Invalid argument supplied for foreach() in /home/s3036/www/mspr_convert.php on line 34
Done!
и ничего не копирует.
Поправил, нашёл ошибку у себя. Попробуйте этот файл file.modx.pro/files/a/f/d/afd721d0a5f11f7e64bbaaceb5f3d056.zip
теперь в таблице modx_ms2_product_remains — все ок, только на страничке компонента графа «остатки» — всегда равна 1, вне зависимости от реальных остатков товара.
А на страничке товара — все ок, как надо по кол-ву остатков.
Ссылка: s3036.h4.modhost.pro/manager/
А на страничке товара — все ок, как надо по кол-ву остатков.
Ссылка: s3036.h4.modhost.pro/manager/
Логин: s3036
Пароль: ZYPECAM5PwXa
О, не учёл этого. До версии 2.0 создавалось поле remains в таблице modx_ms2_products. Теперь в новой таблице modx_ms2_product_remains есть такое же поле. При запросе на странице компонента первая таблица подключается к последней и старые данные затирают новые в результатах запроса. Ранее в поле remains была информация есть ли вообще остатки у товара или нет (1 или 0 соответственно).
Решением проблемы станет удаление поля remains в таблице modx_ms2_products. Желательно ещё удалить папки
Решением проблемы станет удаление поля remains в таблице modx_ms2_products. Желательно ещё удалить папки
/assets/components/minishop2/plugins/msproductremains/
/core/components/minishop2/plugins/msproductremains/
оу оу оу, теперь действительно все работает! это реально мощный компонент по учету остатков!
что-то странное со сниппетом msOptionsWithRemains а именно, в строке
а сверху дописать
f (!is_array($options) || $options[0] == '' || $product->get('remains') == 0) {
если заменить её на if (!is_array($options) || $options[0] == '' || $msProductRemains->getRemains( $scriptProperties ) == 0) {
то все работает, а сверху дописать
$msProductRemains = $modx->getService('msproductremains','msProductRemains',$modx->getOption('mspr_core_path',null,$modx->getOption('core_path').'components/msproductremains/').'model/msproductremains/',$scriptProperties);
if (!($msProductRemains instanceof msProductRemains)) return '';
при чем сниппет getRemains хорошо выдает остатки
Вообще он был удалён из компонента, потому что в случае учёта остатков по двум опциям, определить остатки только по одной опции невозможно.
Вместо сниппета msOptionsWithRemains лучше использовать msOptions.
Вместо сниппета msOptionsWithRemains лучше использовать msOptions.
при добавлении в корзину товара без заполненных остатков выскакивает ошибка
POST https://mimikroha.ru/assets/components/minishop2/action.php 500 (Internal Server Error)
FastCGI sent in stderr: "PHP message: PHP Fatal error: Call to a member function get() on null in /core/components/msproductremains/model/msproductremains/msproductremains.class.php on line 57" while reading response header from upstream, client*** request: "POST /assets/components/minishop2/action.php HTTP/1.1"
это как-то можно поправить?
Спасибо за наводку. Исправлю в ближайшее время.
Сергей, можно ли как-то в плагине записать программно значение из тв поля в поле остатков.
Необходимо выгрузить из 1с остатки в компонент msproductremains. Нашли в интернете такой плагин. Может кто объяснить, что он делает и почему не работает.
<?php
if ($modx->event->name == 'mSyncOnProductImport') {
$msProductRemains = $modx->getService('msproductremains','msProductRemains',$modx->getOption('mspr_core_path',null,$modx->getOption('core_path').'components/msproductremains/').'model/msproductremains/',$scriptProperties);
if (!($msProductRemains instanceof msProductRemains) || !$msProductRemains->active) return '';
if(isset($properties['Количество'])){
$product_id = $resource->get('id');
$remains = $properties['Количество'];
$msProductRemains->saveRemains(array_merge($product->get('options')?:array(), array(
'product_id' => $product_id,
'count' => $remains
)
));
}
}
<?php
if ($modx->event->name == 'mSyncOnProductImport') {
$msProductRemains = $modx->getService('msproductremains','msProductRemains',$modx->getOption('mspr_core_path',null,$modx->getOption('core_path').'components/msproductremains/').'model/msproductremains/',$scriptProperties);
if (!($msProductRemains instanceof msProductRemains) || !$msProductRemains->active) return '';
if(isset($properties['Количество'])){
$product_id = $resource->get('id');
$remains = $properties['Количество'];
$msProductRemains->saveRemains(array_merge($product->get('options')?:array(), array(
'product_id' => $product_id,
'count' => $remains
)
));
}
}
как правильно сделать проверку на остаток опции, которая была создана?
{set $getR2 = ('!getRemains'|snippet:['id' => $id, 'weig' => 'weig'])*1}
{if $getR2 > '0'}
1
{else}
2
{/if}
так не работает
Подскажите как на fenom вывести сниппет getRemains с проверкой на наличие.
Если 0 = нет в наличии, иначе n шт.
Если 0 = нет в наличии, иначе n шт.
не знаю что это за сниппет такой и для чего он нужен, но по идее, вот так.
{set $result = 'getRemains'|snippet}
{if $result}
{$result}
{else}
нет в наличии
{/if}
наверное условия можно переписать короче, но во первых так нагляднее, а во вторых — я ненавижу тернарный оператор)
Спасибо, работает
{set $remains = ('!getRemains'|snippet:['id' => $_modx->resource.id])*1}
{if $remains > 0}
нет в наличии
{else}
n шт
{/if}
так попробуй
Спасибо, этот вариант тоже работает
Что то догнать не могу, как настроить скрытие значения опции, если по нему остаток = 0?
в шаблоне или чанке?
И в чанке и в шаблоне.
Например в чанке у меня вывод такой
Например в чанке у меня вывод такой
{'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}
{set $getR = '!getRemains'|snippet:[
'id' => $id,
'option_size' => $value,
'strong' => true
]}
{if $getR > 0}
1
{else}
0
{/if}
так попробуй
Толи я не туда пихаю, толи не работает.
Это я ставлю в чанк tpl-msOptions?
и в {if $getR > 0} оборачиваю, то что внутри {foreach $values as $value index=$index}
Если просто ставлю отдельно, то выводит нули, хотя опции значения опций имеют остатки, кроме одной
Это я ставлю в чанк tpl-msOptions?
и в {if $getR > 0} оборачиваю, то что внутри {foreach $values as $value index=$index}
Если просто ставлю отдельно, то выводит нули, хотя опции значения опций имеют остатки, кроме одной
Вся конструкция внутри foreach должна быть
и посмотри выведи {$getR} что туда приходит, а потом проверяй
и посмотри выведи {$getR} что туда приходит, а потом проверяй
Да, спасибо, не туда пихал, теперь условие работает
Воспользовался вашим примером, но выводятся нули. Вот код
{foreach $options as $name => $values}
<div class="swatch-new clearfix">
<div class="product-item-scu-item-list">
{foreach $values as $value index=$index}
{set $getR = '!getRemains'|snippet:[
'id' => $id,
'size' => $value,
'strong' => true
]}
<div class="swatch-element-new product-item-scu-item-text-container available">
<input type="radio" value="{$values[$index]}" id="size-{$values[$index]}" name="options[{$name}]" {if $index == 0}checked="checked"{/if}/>
<label for="size-{$values[$index]}">
<span>{$values[$index]} - {$getR}</span>
</label>
</div>
{/foreach}
</div>
</div>
{/foreach}
если убираю 'size' => $value, то начинает выводится общий остаток.
два вопроса:
1. Как сделать В случае запаса <= 0 чтобы [[!getremains?]] вернул «0»
2. Есть ли способ добавить более одного идентификатора стауса в «mspr_orderback_status»?
1. Как сделать В случае запаса <= 0 чтобы [[!getremains?]] вернул «0»
2. Есть ли способ добавить более одного идентификатора стауса в «mspr_orderback_status»?
извините, игнорируйте мой 1-й вопрос, я нашел ответ у Сергея (Sentinel)
20 апреля 2022, 13:15 комментарий.
остается второй вопрос
20 апреля 2022, 13:15 комментарий.
остается второй вопрос
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.