MiniShop3 1.0.0-alpha.4 — Большое обновление админки

Привет, сообщество!
Рад представить новую версию MiniShop3 1.0.0-alpha.4
В этом релизе был сосредоточен на модернизации админки.


Vue-страница заказов



Список заказов полностью переписан на Vue.
Таблица заказов полностью конфигурируема. Можно добавлять колонки из заказа и адреса, из других моделей, или вообще делать вычисляемые колонки. Я к примеру, пробовал выводить средний чек клиента в каждом заказе. Подробнее о конфигураторе будет написано в документации и последующих обзорах.



Страниц просмотра заказа сделана с нуля. Напомню, раньше это было модальное окно. Поля выводимые в адресе и в информации о заказе конфигурируются. Можно вывести или наоборот скрыть что-то.




Большая работа проведена с товарами заказа. В частности много внимания обратил на опции товара.
Теперь их можно менять. Предусмотрен небольшой конструктор опций. Предусмотрена выборка полей и их значений. Предусмотрен ввод опций товара вручную (буквально ключ-значение). При необходимости есть переключение в голый JSON.

Реализовано удобное добавление товара в заказ. Ну и конечно реализовано создание заказа из админки.



Также хочу обратить внимание — я полностью переработал логику логирования заказа. Раньше на вкладке История заказа отмечалось только время смены статуса. Но, думаю, вы не будете спорить что у заказа может быть гораздо более глубокая история. Это и добавление товаров в заказ (и удаление), и замена контактных данных.
По умолчанию фиксируется история для настроек: status,products,field,address
  • status — Смена статуса заказа
  • products — Изменение товаров (добавление/изменение/удаление)
  • field — Изменение полей заказа
  • address — Изменение адреса доставки
  • payment — Платежи и возвраты
Предусмотрена системная настройка для перечисления настроек. Можно легко отключить лишнее.



Раздел «Настройки» на Vue


Сделал полный рефакторинг всех вкладок страницы Настройки, кроме опций. Из нового хочу отметить настройку валидации для служб доставки.

Как было раньше. Нужно было перечислить через запятую поля, обязательные для заполнения.
Сейчас подключена популярная библиотека валидации rakit/validation которая позволяет использовать множество разных правил валидации (не только required). Например валидировать Email. Url. Только цифры, Только строки. И так далее.

В новой версии реализован визуальный конструктор валидатора





Новый импорт из CSV



Реализован достаточно удобный визуальный импорт данных из CSV. Достаточно простой, но изящный.
Предусмотрен маппинг полей (указываем какая колонка из CSV в какое поле сохраняем). Предусмотрена нормализация кодировки. Автоматически определяет кодировку (UTF-8/Windows-1251).









Как всегда скачать свежий релиз можно здесь

Open Source живёт благодаря вам

MiniShop3 развивается силами сообщества. Если новый релиз и предыдущие обновления оказались полезны — поддержите проект и лично меня вашими новогодними донатами.

Все наши реквизиты есть на специальной странице.
Николай Савин
24 декабря 2025, 19:35
modx.pro
1 020
+19
Поблагодарить автора Отправить деньги

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

Николай Савин
24 декабря 2025, 19:37
+1
@Prihod специально для тебя выпустил релиз пораньше, чтобы ты смог скачать свежий транспортник
    Miša Bulic
    24 декабря 2025, 20:30
    +1
    Здорово, если в импорте добавишь возможность указать url с csv файлом, то такой импорт покроет 80 % потребностей в импорте. Если позволишь сохранять маппинги и ссылки на CSV в виде готовых импортов, то 95% потребностей.
    Спасибо!
      Николай Савин
      24 декабря 2025, 20:42
      0
      Задача закрыть все потребности никогда не стояла. Я скорее облагородил то, что уже было.
      Нужно же и платным компонентам дорогу для развития оставлять.
      Сергей
      24 декабря 2025, 20:38
      0
      При попытке установить пакет отдает ошибку: Failed to open stream: Permission denied
      Could not unpack package /home/.../public_html/core/packages/minishop3-1.0.0-alpha.4.transport.zip to /home/.../public_html/core/packages/. SIG: minishop3-1.0.0-alpha.4
      Невозможно установить пакет с подписью: minishop3-1.0.0-alpha.4
      В чем может быть причина?
        Николай Савин
        24 декабря 2025, 20:41
        0
        1. Неправильные права на директорию core/packages/
        2. Файл zip загружен с неправильным владельцем
        Сергей Карпович
        25 декабря 2025, 13:39
        0
        Выглядит вау! Улучшения прям в точку
        Prihod
        26 декабря 2025, 00:10
        0
        @Николай Савин, есть пару вопросов:
        1) Есть/будет ли возможность расширять страницы? Например я делаю плагин какого либо сервиса доставки и мне на странице заказа в админки нужно вывести какие то свои поля и какой то js код для их работы с своими данными/сервисами.
        2) Переработана ли логика событий что бы данные не перезатирались в последним плагинам? Сейчас например в MiniShop2 если событие которое возвращает цену заказа будет обработано в 2 разных плагинах то 2й во первых не увидит изменения сделанные первым, а во вторых затрет его изменения.
          Николай Савин
          26 декабря 2025, 14:56
          0
          1) Так я вроде в каждом анонсе пишу, что делаю конфигурируемые страницы. У нас уже есть возможность не городить плагины, а добавлять поля в модели централизовано из одного места. Также и во всех основных страницах админки стараюсь сделать возможность добавлять поля в нужном месте страницы. Это тоже централизовано из одной утилиты.

          Итого у нас есть две утилиты
          1. Добавление полей в базу данных и в карту модели.
          2. Добавление полей на страницу админки.

          Есть еще третья утилиты — вывод колонок в таблицах-гридах.

          2) Нет с плагинами ничего не делал. Проблему я понял. Подумаю что можно сделать
            Prihod
            26 декабря 2025, 18:55
            0
            2. Добавление полей на страницу админки.
            Что то я походу это провтыкал
            Артур Шевченко
            26 декабря 2025, 19:16
            0
            Нет с плагинами ничего не делал. Проблему я понял. Подумаю что можно сделать
            Как вариант передавать данные, которые могут быть изменены в плагине, как публичные свойства класса.
            Николай Савин
            26 декабря 2025, 20:05
            +1
            Набросал вариант реализации плагина, чтобы можно было его вызвать дважды, передать изменения из первого во второй и применить оба изменения. При использовании $modx->eventData все работает.
            <?php
              /**
               * Плагин: msDiscount10_v2
               * События: msOnGetCart
               *
               * Используем $modx->eventData для передачи между плагинами
               */
            
              switch ($modx->event->name) {
                  case 'msOnGetCart':
                      // Читаем данные: из $modx->eventData (если предыдущий плагин записал)
                      // или из $scriptProperties (оригинальные)
                      if (isset($modx->eventData['msOnGetCart']['data'])) {
                          $data = $modx->eventData['msOnGetCart']['data'];
                      } else {
                          $data = $scriptProperties['data'];
                      }
            
                      if (!is_array($data) || empty($data)) {
                          break;
                      }
            
                      // Применяем скидку 10%
                      foreach ($data as $key => $item) {
                          $data[$key]['price'] = $item['price'] * 0.9;
                          $data[$key]['cost'] = $data[$key]['price'] * $item['count'];
                      }
            
                      // Сохраняем для следующих плагинов
                      $modx->eventData['msOnGetCart']['data'] = $data;
            
                      // И для контроллера MS3
                      $modx->event->returnedValues['data'] = $data;
                      break;
              }
            Справедливости ради, в некоторых местах $modx->eventData игнорируется. Это исправлю к следующему релизу
            Ruslan
            26 декабря 2025, 10:00
            0
            @Николай Савин Подскажи пожалуйста, как можно правильно доработать функционал, смены пароля у пользователя (msCustomer), с проверкой на старый пароль?
            Да и вообще, например если захочется добавить какие то дополнительные поля, как их добавлять и редактировать с фронта?
              Николай Савин
              26 декабря 2025, 14:58
              0
              Для добавления полей во все основные модели заложена специальная утилита (msCustomer там сейчас нет, добавлю). Добавляешь поля через этот визуальный конструктор. Далее работаешь с ними как с родными. Просто выводишь и сохраняешь.
                Ruslan
                26 декабря 2025, 16:26
                0
                Супер идея!

                А подскажи еще, я создал товар.
                Я на скоряк создал товар (для ознакомления), заполнил только цену старую и новую.
                Вывожу шаблон с товаром на фронте, и в карточке товара вот такая ошибка выходит.

                Deprecated: Optional parameter $options declared before required parameter $info is implicitly treated as a required parameter in ....../core/components/minishop3/src/Model/msProductFile.php on line 201

                а так же, я вывел в шапке
                {$_modx->runSnippet("!msCart", [])}
                и когда в карточе товара нажимаю добавить товар, то он добавляется, выходит сообщение о том что добавилось, и правильное количество товара показывает.

                Но в шапке у корзины он всегда показывает сообщение что корзина пустая.
                Я что то мог не донастроить?

                я так понимаю там какие то обязательные поля надо заполнять?
                  Николай Савин
                  26 декабря 2025, 19:03
                  0
                  Deprecated: Optional parameter $options declared before required parameter $info is implicitly treated as a required parameter in ....../core/components/minishop3/src/Model/msProductFile.php on line 201
                  Это известная проблема совместимости с PHP 8.0+. В файле msProductFile.php на строке 201 необязательный параметр объявлен перед обязательным, что устарело в PHP 8.

                  Временное решение:

                  Откройте файл core/components/minishop3/src/Model/msProductFile.php и измените строку 201:

                  // Было:
                    public function makeThumbnail($options = [], array $info)
                  
                    // Стало:
                    public function makeThumbnail(array $options, array $info)
                  Это временный фикс. Исправление будет включено в следующее обновление MiniShop3.
                    Николай Савин
                    26 декабря 2025, 19:20
                    +1
                    {$_modx->runSnippet("!msCart", [])}
                    В корзине теперь есть обязательный параметр selector, где мы прописываем обычный JS селектор. Корзин может быть много. JS должен понимать куда монтировать обновленные данные.

                    Как это работает:
                    1. При вызове msCart сниппет регистрирует себя с уникальным токеном
                    2. После добавления товара сервер возвращает отрендеренный HTML с этим токеном
                    3. JavaScript (CartUI.js:316-318) ищет selector чтобы знать куда вставить HTML
                    4. Если selector не указан — обновление пропускается
                    Решение:

                    Оберните корзину в контейнер с id и укажите параметр selector:

                    <div id="header-cart">
                          {$_modx->runSnippet('!msCart', [
                              'selector' => '#header-cart',
                              'tpl' => 'tpl.msMiniCart'
                          ])}
                      </div>
                    Или короче через Fenom:

                    <div id="header-cart">
                          {'!msCart' | snippet : ['selector' => '#header-cart', 'tpl' => 'tpl.msMiniCart']}
                      </div>
                    Важно:
                    • selector — CSS-селектор контейнера куда будет монтироваться обновлённый HTML
                    • Контейнер должен оборачивать вызов сниппета (HTML заменяется внутри него)
                    • Для мини-корзины в шапке лучше использовать чанк tpl.msMiniCart
                      Ruslan
                      29 декабря 2025, 11:12
                      +1
                      Не сразу смог ответить, но работает отлично.
                      Спасибо
                Madao
                03 января 2026, 17:12
                +1
                Планируется для опций товара возможность указания разных цен (аналог msOtionsPrice)?
                Ибо это дополнение никак не развивается и не дорабатывается, и портироваться под MiniShop3 скорее всего не будет (даже сейчас есть проблемы по работе этого дополнения, которые никак не исправляются), а необходимость в таком функционале имеется и желательно в движке из коробки.
                  Николай Савин
                  03 января 2026, 19:53
                  +1
                  Да, разумеется. Сразу после поиска и фильтров. Планирую уже в январе. Если повезет даже в текущем ))
                  Maks
                  06 января 2026, 17:49
                  0
                  Не дает установить последнюю бета ту что в модсторе. Жму на дополнение из списка дополнений а там ничего нет. Как будто доступа нет или прав. Такая ситуация как с платными компонентами.
                    Николай Савин
                    06 января 2026, 19:25
                    0
                    Какая у тебя версия PHP и MODX?
                    Сайт работает через HTTPS?
                    Другие компоненты modstore отображаются?
                      Maks
                      06 января 2026, 20:15
                      0
                      Хотел проверить еще раз, теперь все работает. Спасибо.
                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    24