msProductRemains. Учёт по нескольким опциям!
        Наконец-то дописана вторая версия компонента msProductRemains для учёта складских остатков товаров, которая несёт в себе одно из самых востребованных нововведений — учёт остатков по нескольким опциям! То есть теперь можно вести учёт остатков по комбинациям опций, например, цветов и размеров.

На самом деле, компонент не потому получил версию 2 и снова получил статус beta. Дело в том, что он был полностью переписан, логика работы изменилась, но функции остались те же. Хотя от части фишек пришлось отказаться и, надеюсь, это временно.
Самый печальный момент в этом обновлении — оно несовместимо с предыдущими версиями. По факту, произвести обновление компонента через панель управления сайтом можно, но, грубо говоря, это приведёт к установке компонента с нуля. А всё потому, что:
Но плюсы перехода на новую версию перекрывают минусы, которые решаются за минимальное время. Добавляется множество отличных фишек и решаются старые проблемы. А именно:
Обновление уже добавлено в наш любимый магазин. Скачать обновление или купить компонент можно через панель управления сайтом, если магазин подключен к вашему сайту.
    
    
                                                        
На самом деле, компонент не потому получил версию 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 комментарий.
остается второй вопрос
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.