msProductRemains. Учёт по нескольким опциям!

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



На самом деле, компонент не потому получил версию 2 и снова получил статус beta. Дело в том, что он был полностью переписан, логика работы изменилась, но функции остались те же. Хотя от части фишек пришлось отказаться и, надеюсь, это временно.

Самый печальный момент в этом обновлении — оно несовместимо с предыдущими версиями. По факту, произвести обновление компонента через панель управления сайтом можно, но, грубо говоря, это приведёт к установке компонента с нуля. А всё потому, что:
  1. Остатки теперь хранятся в отдельной таблице и при обновлении не переносятся в новую таблицу.
  2. Удален сниппет `msOptionsWithRemains`, а сниппет `getRemainsCount` переименован в `getRemains`.
    Вместо `msOptionsWithRemains` используйте стандартный `msOptions`
  3. Все настройки компонента и записи словаря получили укороченные ключи.
  4. Удалён плейсхолдер [[+remains]] и соответствующий столбец таблицы.
    Вернуть можно путём добавления вызова сниппета
    [[!getRemains:toPlaceholder=`remains`]]
  5. Вся логика с фронта сайта временно удалена. Появилась снова в 2.0.4-beta.
В итоге обновления у вас не будет старых остатков, старые настройки не будут учитываться, старые сниппеты не будут работать и так далее. Придётся руками производить внесение изменений там, где были вызовы сниппетов или значений словаря.

Но плюсы перехода на новую версию перекрывают минусы, которые решаются за минимальное время. Добавляется множество отличных фишек и решаются старые проблемы. А именно:
  1. Одной из самых серьёзных проблем компонента была проблема с кэшем MODx. После обновления остатков, на фронте сайта висела старая информация и при определённых условиях посетителю удавалось успешно обходить ограничения компонента. И всё это из-за того, что кэш страницы обновлялся через раз. Теперь проблема с кэшем неактуальна, потому как информация об остатках хранится в отдельной таблице.
  2. Хранение остатков в отдельной таблице увеличивает скорость работы компонента, потому как исключается огромное количество лишних запросов к таблице контента сайта, где ранее хранилась информация об остатках.
  3. Редактирование остатков стало более удобно, оформлено красиво и работает быстро. Теперь при редактировании товара обновлять страницу после изменения свойств товаров необязательно, достаточно обновить таблицу остатков на соответствующей вкладке страницы.
  4. При проверке остатков товаров всей корзины теперь выводится каких именно товаров недостаточно.
Также спешу сообщить, что я обновляю документацию к компоненту, которая будет более информативная и будет содержать примеры использования компонента и его отдельных частей.

Обновление уже добавлено в наш любимый магазин. Скачать обновление или купить компонент можно через панель управления сайтом, если магазин подключен к вашему сайту.
Сергей Фещуков
14 сентября 2015, 13:37
modx.pro
4 186
+6
Поблагодарить автора Отправить деньги

Комментарии: 34

Василий Наумкин
14 сентября 2015, 16:45
+1
В магазине написано, что последняя версия 2.0.2-beta, но это ошибка. Последняя доступная версия: 2.0.0-beta.
Это не ошибка, это кэш на полчаса. Уже обновился.
    Василий Наумкин
    17 сентября 2015, 03:39
    +1
    А нет, это таки ошибка, я неправильно понял.

    То ли автор, то ли тот, кто загружал, переименовал сам файл как версию 2.0.2-beta, в внутри 2.0.0-beta, отсюда и ошибка.

    Поправил, теперь всё работает.
    Алексей
    15 сентября 2015, 09:58
    0
    Добрый день! Подскажите, как быть если мы уже забили около 500 складских остатков товаров со старой версией компонента? (у каждого товара несколько размеров, и у каждого размера свой остаток) Можно не вручную всю забитую базу перенести на новую версию компонента?
      Сергей Фещуков
      15 сентября 2015, 10:04
      0
      Здравствуйте. Я сегодня вечером напишу скрипт для переноса старых остатков и напишу как им воспользоваться.
      Сергей Фещуков
      18 сентября 2015, 13:54
      +1
      Прошу прощения за задержку, но приводил и компонент, и скрипт в порядок. Скрипт для импорта остатков со старой версии компонента можно скачать здесь file.modx.pro/files/1/1/f/11f21b118b85042a036b1b3359d85397.zip
      Необходимо распаковать архив в корень сайта, запустить его по ссылке www.ваш_сайт.ru/mspr_convert.php. После появления записи «Done!» необходимо обновить кэш сайта и удалить файл скрипта. Готово!
      Ещё один момент: обязательно обновите компонент до версии 2.0.1-beta, там небольшие поправки для формирования остатков по одной опции. Поправки важные, если не обновится, в дальнейшем понадобится снова поправлять вид остатков в базе данных.
        Алексей
        19 сентября 2015, 09:10
        0
        то что важно — никогда не бывает срочно. спасибо за оперативность)
          Алексей
          27 сентября 2015, 13:00
          0
          попробовал — не работает.
          выдает ошибку:
          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!
          и ничего не копирует.
            Сергей Фещуков
            27 сентября 2015, 13:16
            +1
            Поправил, нашёл ошибку у себя. Попробуйте этот файл file.modx.pro/files/a/f/d/afd721d0a5f11f7e64bbaaceb5f3d056.zip
              Алексей
              27 сентября 2015, 14:07
              0
              теперь в таблице modx_ms2_product_remains — все ок, только на страничке компонента графа «остатки» — всегда равна 1, вне зависимости от реальных остатков товара.
              А на страничке товара — все ок, как надо по кол-ву остатков.
              Ссылка: s3036.h4.modhost.pro/manager/
              Логин: s3036
              Пароль: ZYPECAM5PwXa
                Сергей Фещуков
                27 сентября 2015, 17:08
                +1
                О, не учёл этого. До версии 2.0 создавалось поле remains в таблице modx_ms2_products. Теперь в новой таблице modx_ms2_product_remains есть такое же поле. При запросе на странице компонента первая таблица подключается к последней и старые данные затирают новые в результатах запроса. Ранее в поле remains была информация есть ли вообще остатки у товара или нет (1 или 0 соответственно).
                Решением проблемы станет удаление поля remains в таблице modx_ms2_products. Желательно ещё удалить папки
                /assets/components/minishop2/plugins/msproductremains/
                /core/components/minishop2/plugins/msproductremains/
                  Алексей
                  27 сентября 2015, 17:48
                  0
                  оу оу оу, теперь действительно все работает! это реально мощный компонент по учету остатков!
            Алексей
            27 сентября 2015, 22:44
            0
            что-то странное со сниппетом 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 хорошо выдает остатки
              Сергей Фещуков
              28 сентября 2015, 04:32
              0
              Вообще он был удалён из компонента, потому что в случае учёта остатков по двум опциям, определить остатки только по одной опции невозможно.
              Вместо сниппета msOptionsWithRemains лучше использовать msOptions.
              Алексей
              30 сентября 2015, 20:13
              0
              при добавлении в корзину товара без заполненных остатков выскакивает ошибка
              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"
              это как-то можно поправить?
                Сергей Фещуков
                01 октября 2015, 16:52
                0
                Спасибо за наводку. Исправлю в ближайшее время.
                  Алексей
                  24 января 2018, 13:11
                  0
                  Сергей, можно ли как-то в плагине записать программно значение из тв поля в поле остатков.
            Алексей
            24 января 2018, 16:18
            0
            Необходимо выгрузить из 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
            )
            ));
            }
            }
              Sergey (Sentinel)
              27 ноября 2018, 16:28
              0
              как правильно сделать проверку на остаток опции, которая была создана?
              {set $getR2 = ('!getRemains'|snippet:['id' => $id, 'weig' => 'weig'])*1}
              {if $getR2 > '0'}
               1
              {else} 
              2 
              {/if}
              так не работает
                Сергей Карпович
                20 марта 2022, 14:01
                0
                Подскажите как на fenom вывести сниппет getRemains с проверкой на наличие.
                Если 0 = нет в наличии, иначе n шт.
                  Александр Мельник
                  20 марта 2022, 14:52
                  1
                  +1
                  не знаю что это за сниппет такой и для чего он нужен, но по идее, вот так.
                  {set $result = 'getRemains'|snippet}
                  {if $result}
                      {$result}
                  {else}
                      нет в наличии
                  {/if}
                  наверное условия можно переписать короче, но во первых так нагляднее, а во вторых — я ненавижу тернарный оператор)
                  Sergey (Sentinel)
                  20 марта 2022, 14:59
                  +1
                  {set $remains = ('!getRemains'|snippet:['id' => $_modx->resource.id])*1}
                  {if $remains > 0}
                  нет в наличии
                  {else}
                  n шт
                  {/if}
                  так попробуй
                Сергей Карпович
                19 апреля 2022, 08:50
                0
                Что то догнать не могу, как настроить скрытие значения опции, если по нему остаток = 0?
                  Sergey (Sentinel)
                  20 апреля 2022, 12:33
                  0
                  в шаблоне или чанке?
                    Сергей Карпович
                    20 апреля 2022, 12:46
                    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}
                      Sergey (Sentinel)
                      20 апреля 2022, 13:15
                      1
                      +1
                      {set $getR = '!getRemains'|snippet:[
                       'id' => $id, 
                      'option_size' => $value, 
                      'strong' => true
                       ]}
                      
                      {if $getR > 0}
                      1
                      {else}
                      0
                      {/if}
                      так попробуй
                        Сергей Карпович
                        20 апреля 2022, 13:56
                        0
                        Толи я не туда пихаю, толи не работает.
                        Это я ставлю в чанк tpl-msOptions?
                        и в {if $getR > 0} оборачиваю, то что внутри {foreach $values as $value index=$index}

                        Если просто ставлю отдельно, то выводит нули, хотя опции значения опций имеют остатки, кроме одной
                          Sergey (Sentinel)
                          20 апреля 2022, 14:03
                          0
                          Вся конструкция внутри foreach должна быть
                          и посмотри выведи {$getR} что туда приходит, а потом проверяй
                            Сергей Карпович
                            20 апреля 2022, 14:13
                            0
                            Да, спасибо, не туда пихал, теперь условие работает
                              Дмитрий
                              18 декабря 2022, 08:05
                              0
                              Воспользовался вашим примером, но выводятся нули. Вот код

                              {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, то начинает выводится общий остаток.
                    Pakos Fakos
                    26 февраля 2023, 12:25
                    0
                    два вопроса:
                    1. Как сделать В случае запаса <= 0 чтобы [[!getremains?]] вернул «0»
                    2. Есть ли способ добавить более одного идентификатора стауса в «mspr_orderback_status»?
                      Pakos Fakos
                      26 февраля 2023, 12:45
                      0
                      извините, игнорируйте мой 1-й вопрос, я нашел ответ у Сергея (Sentinel)
                      20 апреля 2022, 13:15 комментарий.
                      остается второй вопрос
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      34