ms_CDEK2 возвращается!

Знаю, все этого ждали и это произошло, компонент снова доступен на modstore. Пользуйтесь. Список изменений под катом

1. Удалены устаревшие файлы, настройки и лексиконы.
2. Сниппет ms_CDEK2 больше не нужен. Компонент инициализируется автоматически на страницах с указанным в системных настройках шаблонами.
3. Виджет, который так любезно разработал для нас СДЭК, я тоже выкинул, поскольку он имел склонность грузиться долго или не грузиться вообще. Вместо него я написал свою простенькую инициализацию карты с минимальным набором функций, но зато на третьей версии API Яндекс.Карт и с возможностью управлять картой как душе угодно, если вы шарите за JS и работу с картами от Яндекса. В целом, можно картой не пользоваться вовсе, пусть пользователь выбирает из обычного списка)))
4. Поскольку для расчёта стоимости доставки требуется только почтовый индекс, использовать автодополнения от СДЭК бессмысленно, поэтому был настроен автокомплит адреса от DaData. Он бесплатный до 10000 запросов в сутки.
5. Страна отправителя указывается в системных настройках. Страна получателя передаётся через стандартное поле адреса — country и для получения кода страны используется сервис DaData, если код не будет получен компонент использует код отправителя.
6. Логи больше не выводятся в журнал ошибок Modx, а пишутся в директорию core/components/ms_cdek2/services/logs.
7. Добавлены события в как системные, так и браузерные для возможности дополнять и изменять логику работы.
8. Компонент теперь требует обязательного установленного SendIt.
9. Расчёт стоимости происходит по коду тарифа, больше никаких переборов и гаданий. Код тарифа должен быть указан либо в описании способа доставки, либо на вкладке Параметры в интерфейсе настройки способа оплаты.
10. Для ускорения работы и экономии запросов используется серверное и браузерное кеширование.

Приятного использования!
Артур Шевченко
16 мая 2025, 17:25
modx.pro
2 103
+12
Поблагодарить автора Отправить деньги

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

Наумов Алексей
19 мая 2025, 08:25
+4
Привет, почему лог в
core/components/ms_cdek2/services/logs
он же там потом разрастаться будет и никто из разработчиков про это помнить не будет.

Хочется отдельный файл лога — почему не положить рядом со стандартным errors.log что-то типа
core/cache/logs/cdek2.log
?
    Артур Шевченко
    23 мая 2025, 09:35
    0
    Я вроде по умолчанию отключил вывод логов, поэтому разрастаться не должно. А если ты включил и забыл отключить, то разрастаться будет где угодно.
    Дима Касаткин
    19 мая 2025, 18:01
    0
    Прекрасные новости! Мы мечтали, мы желали, мы просили, мы требовали, и всё это не помогало)) А потом Артур сам захотел обновиться, и мы — счастливы!

    Кто ещё не нажал кнопочку «Отправить деньги» в разделе «Поблагодарить автора» под анонсом поста — самое время всем это сделать!
      Ivan
      22 мая 2025, 00:55
      0
      Он теперь стоит 2.5к) Благодарность обозначенная автором)
      Александр Туниеков
      22 мая 2025, 23:40
      0
      3 часа веселия Артур нам обеспечил :-). Код тарифа теперь зачем-то в настройке описания тарифа.

      Без нее корзина ложиться наглухо. Даже если никакие доставки сдек не включены.
      Теперь буду знать, что в степени бардака в програмировании нам есть куда стремиться :-).

      Только карта ПВЗ так и не заработала. В консоле ошибки


      Понять, где должна происходить инициализации ymaps3, не получилось. Баг разработчика какой-то.
      @Артур Шевченко поправь плиз.
        Александр Туниеков
        23 мая 2025, 02:20
        0
        Понять, где должна происходить инициализации ymaps3, не получилось. Баг разработчика какой-то
        Или неправильная настройка. У нас тут пишет invalid api key. В яндексе много апи. Какое надо? Мы пробовали JavaScript API и HTTP Геокодер
          Алексей Суслов
          23 мая 2025, 05:07
          0
          В кабинете яндекса написано такое:
          Если вы используете Java Script API версии 3.0, необходимо настроить ограничения для API-ключа, чтобы API работали корректно. В предыдущих версиях это не обязательно, но рекомендуется сделать, чтобы защитить ключ.

          Попробуйте прописать ограничения, может в этом причина.
          yandex.ru/maps-api/docs/js-api/limit.html
            Артур Шевченко
            23 мая 2025, 09:41
            0
            В кабинете яндекса написано такое:
            Написано, ага, только я когда добавил ограничения по домену ключ перестал работать.
            Артур Шевченко
            23 мая 2025, 09:40
            0
            В описании системной настройки ms_cdek2_yandex_map_api_key написано какой API и где
            Артур Шевченко
            23 мая 2025, 09:38
            0
            Код тарифа теперь зачем-то в настройке описания тарифа.
            Установи msDeliveryProps и прописывай там

            Понять, где должна происходить инициализации ymaps3, не получилось.
            Это очень странно, что такой выдающийся разработчик как ты не смог понять где происходит инициализация карты, учитывая, что в консоли справа написано в каком файле ошибка.
              Александр Туниеков
              25 мая 2025, 12:52
              0
              С msDeliveryProps ошибка
              Fatal error: Uncaught Error: Call to a member function getOption() on null in 
              /home/s/semweb/orliman.shop/public_html/core/components/minishop2/model/minishop2/msdeliveryhandler.class.php:3 
              Stack trace: #0 /home/s/semweb/orliman.shop/public_html/core/components/msdeliveryprops/ConfigurableDeliveryHandler.class.php(12): 
              require_once() #1 /home/s/semweb/orliman.shop/public_html/core/cache/includes/elements/modplugin/46.include.cache.php(9): require_once('/home/s/semweb/...') 
              #2 /home/s/semweb/orliman.shop/public_html/core/model/modx/modscript.class.php(76): include('/home/s/semweb/...') #3 
              /home/s/semweb/orliman.shop/public_html/core/model/modx/modx.class.php(1674): modScript->process(NULL) #4 
              /home/s/semweb/orliman.shop/public_html/core/model/modx/modmanagercontroller.class.php(153): 
              modX->invokeEvent('OnManagerPageBe...', Array) #5 /home/s/semweb/orliman.shop/public_html/core/model/modx/modmanagerresponse.class.php(79): 
              modManagerController->render() #6 /home/s/semweb/orliman.shop/public_html/core/model/modx/modmanagerrequest.class.php(187): 
              modManagerResponse->outputContent(Array) #7 /home/s/semweb/orliman.shop/public_html/core/model/modx/modmanagerrequest.class.php(135): 
              modManagerRequest->prepareResponse() #8 /home/s/semweb/orliman.shop/public_html/manager/index.php(63): 
              modManagerRequest->handleRequest() #9 {main} thrown in /home/s/semweb/orliman.shop/public_html/core/components/minishop2/model/minishop2/msdeliveryhandler.class.php on line 3
              Я в файле core\components\minishop2\model\minishop2\msdeliveryhandler.class.php
              Закоментировал $this->modx->getOption('log_deprecated')
              <?php
              
              // if (!empty($this->modx->getOption('log_deprecated'))) {
                  // $this->modx->log(
                      // xPDO::LOG_LEVEL_ERROR,
                      // 'Deprecated: use handlers from catalog core/components/minishop2/handlers/'
                  // );
              // }
              require_once dirname(__FILE__, 3) . '/handlers/msdeliveryhandler.class.php';
              И заработало. Не понятно Эта ошибка из-за наших особенностей или что-то неправильно в msdeliveryhandler. По идее файл же не класс и $this-> вообще не должен присутствовать О_О.
                Александр Туниеков
                25 мая 2025, 12:56
                0
                Это очень странно, что такой выдающийся разработчик как ты не смог понять где происходит инициализация карты, учитывая, что в консоли справа написано в каком файле ошибка.
                Ну вот и покритиковать нельзя :-).
                У нас api-maps.yandex.ru/v3/?apikey=*** заработало когда поставили ограничение по домену.
                  Артур Шевченко
                  25 мая 2025, 17:42
                  0
                  Ну вот и покритиковать нельзя :-)
                  Критика должна быть конструктивной, а твоё пустословие никому неинтересно.
                  Александр Туниеков
                  25 мая 2025, 13:05
                  0

                  У нас что-то при установке не прописалось. Раздела minishop2\ms2_delivery_cdekhandler нет в системных настройках. Подскажи что там должно быть?
                    Александр Туниеков
                    25 мая 2025, 13:08
                    0
                    И плиз напиши плиз все-таки обработку ошибки со строкой в описании доставки. Когда компонент ждет целое.
                    А то корзина ложиться и не понятно из-за чего. Мы 3 часа пропарились из-за этого.
                  Dima
                  24 мая 2025, 15:26
                  0
                  Учитывает ли модуль кол-во товаров, вес товара и габариты?
                  Можно ли выбрать разные способы, например экспресс или обыная?
                  Также может в демо не обновлена версия, но у меня работает пока немного странно: если я 1 раз выбрал ПВЗ, то потом я не могу уже никак выбрать другой, даже после обновления страницы. Ну и не всегда удобно выбрать без карты (понятно, что карта это доп нагрузка, но можно и в модалку положить — только мнение).
                    Артур Шевченко
                    25 мая 2025, 17:38
                    0
                    Учитывает ли модуль кол-во товаров, вес товара и габариты?
                    С версии 2.4.2 учитывает

                    Можно ли выбрать разные способы, например экспресс или обыная?
                    Можно. Для этого нужно указать соответствующие номера тарифов в системных настройках ms_cdek2_tariffs и в ms_cdek2_deliveries.

                    если я 1 раз выбрал ПВЗ, то потом я не могу уже никак выбрать другой
                    Возможно вы смотрели в процессе доработок.

                    понятно, что карта это доп нагрузка, но можно и в модалку положить — только мнение
                    Если положить карту в модалку это никак не снизит нагрузку на сеть и не увеличит скорость загрузки страницы.
                    Александр Туниеков
                    25 мая 2025, 13:16
                    0
                    Выбор пункта на карте не интуитивно понятен :-(. При клике на маркер с цифрой лучше чтоб происходило увеличение маштаба карты. А при выборе пвз какое-нибудь сообшение. А то я не сразу понял что пункт выбран.
                      Артур Шевченко
                      25 мая 2025, 17:00
                      0
                      По умолчанию это происходит при двойном клике на карту
                        kudesia
                        25 мая 2025, 22:50
                        0
                        Ката показывается, пункт выбран, но расчет стоимости не происходит.
                        В Журнале:
                        /core/components/ms_cdek2/services/custom/MsCdek2.php	255
                        PHP warning: A non-numeric value encountered
                        Хотя, «Размер упаковки по умолчанию» заполнен.
                          Артур Шевченко
                          25 мая 2025, 23:01
                          0
                          А в поле size у товара есть значение?
                            kudesia
                            25 мая 2025, 23:49
                            0
                            Нет.
                            А для чего его заполнять, если есть размер упаковки по умолчанию?
                              kudesia
                              26 мая 2025, 00:19
                              0
                              Заполнили размер на тестовом товаре — ошибка не ушла.
                                Артур Шевченко
                                26 мая 2025, 08:11
                                0
                                Это не ошибка, это предупреждение. Какие проблемы оно вызывает? Расчёт неверный или не происходит совсем?
                                  kudesia
                                  26 мая 2025, 22:58
                                  0
                                  Не происходит
                                kudesia
                                26 мая 2025, 00:39
                                0
                                В логе
                                [code] => not_available_country_code
                                [additional_code] => 0x84916502
                                [message] => Код страны не поддерживается: 643
                                  Артур Шевченко
                                  26 мая 2025, 08:10
                                  0
                                  И какой код страны вы передаёте?
                                    kudesia
                                    26 мая 2025, 22:05
                                    0
                                    643 и RU пробовали
                                    **26.05.2025 21:56:31** [MsCdek2Services\ExternalApi\Base::send] Запрос calculator/tariff вернул ошибку: 
                                    Array
                                    (
                                        [errors] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [code] => not_available_country_code
                                                        [additional_code] => 0x84916502
                                                        [message] => Код страны не поддерживается: 643
                                                    )
                                    
                                            )
                                    
                                    )
                                    **26.05.2025 21:56:31** [MsCdek2Services\MsCdek2::getCost] Данные запроса: 
                                    Array
                                    (
                                        [lang] => rus
                                        [tariff_code] => 136
                                        [from_location] => Array
                                            (
                                                [postal_code] => 215506
                                                [country_code] => 643
                                            )
                                    
                                        [to_location] => Array
                                            (
                                                [postal_code] => 101000
                                                [country_code] => 643
                                            )
                                    
                                        [services] => Array
                                            (
                                            )
                                    
                                        [packages] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [weight] => 700
                                                        [length] => 1
                                                        [width] => 1
                                                        [height] => 1
                                                    )
                                    
                                            )
                                    
                                    )
                                    137 тариф
                                    **26.05.2025 22:12:55** [MsCdek2Services\ExternalApi\Base::send] Запрос calculator/tariff вернул ошибку: 
                                    Array
                                    (
                                        [errors] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [code] => not_available_country_code
                                                        [additional_code] => 0x84916502
                                                        [message] => Код страны не поддерживается: 643
                                                    )
                                    
                                            )
                                    
                                    )
                                    
                                    **26.05.2025 22:12:55** [MsCdek2Services\MsCdek2::getCost] Данные запроса: 
                                    Array
                                    (
                                        [lang] => rus
                                        [tariff_code] => 137
                                        [from_location] => Array
                                            (
                                                [postal_code] => 215506
                                                [country_code] => 643
                                            )
                                    
                                        [to_location] => Array
                                            (
                                                [postal_code] => 119331
                                                [country_code] => 643
                                            )
                                    
                                        [services] => Array
                                            (
                                            )
                                    
                                        [packages] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [weight] => 700
                                                        [length] => 1
                                                        [width] => 1
                                                        [height] => 1
                                                    )
                                    
                                            )
                                    
                                    )
                                    Журнал
                                    public_html/core/components/ms_cdek2/services/custom/MsCdek2.php	256
                                    PHP warning: A non-numeric value encountered
                                    ms_CDEK2
                                    2.4.4-pl
                                    Переустановлено
                                    26-05-2025, 21:58
                                      kudesia
                                      26 мая 2025, 22:08
                                      0
                                      Почему
                                      [length] => 1
                                                          [width] => 1
                                                          [height] => 1
                                      Если в настройках 30х30х30 системных ms_cdek2_default_size не пойму никак…
                                        Артур Шевченко
                                        26 мая 2025, 23:14
                                        0
                                        Тут похоже мой косяк, забыл системную настройку забрать и просто захардкодил
                                          Артур Шевченко
                                          27 мая 2025, 09:58
                                          0
                                          Я проверил на тестовом сайте, ошибки нет. Если размеров нет в корзине, если их нет в товаре, то берётся дефолтное значение из настроек.
                                          Артур Шевченко
                                          26 мая 2025, 23:12
                                          0
                                          У каждой системной настройки можно раскрыть описание, почитайте описание для системной настройки с кодом страны.
                                            kudesia
                                            27 мая 2025, 20:27
                                            0
                                            Читали и вставили значение соответственно описанию. Кроме того, в это поле нельзя ввести ничего кроме цифр.
                                            А в файле core/components/ms_cdek2/services/custom/MsCdek2.php
                                            'sender_country_code' => $this->modx->getOption('ms_cdek2_sender_country', null, 'RU', true),
                                            
                                                        'size_multiplier' => $this->modx->getOption('ms_cdek2_size_multiplier', null, 1, true),
                                                        'weight_multiplier' => $this->modx->getOption('ms_cdek2_weight_multiplier', null, 1000, true),
                                            
                                                        'defaultSize' => $this->modx->getOption('ms_cdek2_default_size', null, '1x1x1'),
                                            Может, в этом дело?
                                              Артур Шевченко
                                              27 мая 2025, 23:11
                                              0
                                              Напишите мне в телеграм, контакт есть в профиле.
                                              kudesia
                                              27 мая 2025, 20:35
                                              0
                                                kudesia
                                                27 мая 2025, 20:38
                                                0
                                                В итоге, просто оставили пустым это поле.
                                                Какой-то расчет стал происходить. Насчет его правильности — не знаю пока.
                                                  Артур Шевченко
                                                  27 мая 2025, 23:09
                                                  0
                                                  Вот это точно мой косяк, я настройку скопировал из индекса и забыл тип поля поменять, но вы можете сменить его самостоятельно. Код страны должен содержать только буквы, заглавные, две штуки.
                                  Руслан Алеев
                                  25 мая 2025, 21:21
                                  0
                                  Артур, спасибо за компонент, давно ждали!
                                  Вопрос: а SendIt сильно там нужен? Как бы, если SendIt не используется, не особо хочется тянуть лишний компонент…
                                    Артур Шевченко
                                    25 мая 2025, 23:03
                                    +1
                                    SendIt сильно нужен. Рекомендую начать использовать, так как есть мысль связать все свои компоненты в одну систему, чтобы минимизировать дублирование кода.
                                    Александр Туниеков
                                    26 мая 2025, 22:14
                                    0
                                    Обновились на новую версию 2.4.4-pl и я 4 часа разбирался почему все перестало работать. Наполовину mscdek и sendit изучил. Итог изумительный. Перестало работать потому что в браузере скрипты закешировались! И ctrl+shift+r и ctrl+f5 этот кеш не чистят.
                                    Помогла эта галочка

                                    Но клиенты у кого за неделю скрипты закешировались это не поймут.
                                    @Артур Шевченко можешь механизм обновления скриптов mscdek и sendit предусмотреть?
                                      Артур Шевченко
                                      26 мая 2025, 23:24
                                      0
                                      Ты действительно потратил 4 часа на то, чтобы понять, что браузер берёт файлы из кэша? Это феерично. А по поводу механизма обновления, он давно существует: добавь get-параметры к пути и браузер будет думать что это новый файл. Но это актуально только на этапе разработки и после обновления, в остальное время это не нужно. Я позаботился о том, чтобы ты мог управлять подключением скриптов, а дальше ты уж как-нибудь сам, хорошо?
                                        Александр Туниеков
                                        27 мая 2025, 14:56
                                        0
                                        добавь get-параметры к пути
                                        к каким путям? где это прописывать? Ты нормально приложение не можешь сделать?
                                          Артур Шевченко
                                          27 мая 2025, 23:04
                                          0
                                          В принципе да, надо было нормально сделать, в одном файле весь код написать. Чего-то я с инъекциями зависимостей и модулями погорячился. Не подумал, что такие таланты как ты захотят воспользоваться моим никчёмным компонентом. Извини. Я думаю тебе не стоит страдать, сделай сам, лучше. Будешь пользоваться и получать удовольствие.
                                          Александр Туниеков
                                          27 мая 2025, 14:57
                                          0
                                          добавь get-параметры к пути
                                          к каким путям? где это прописывать? Я в твоих di контейнерах с трудом разбираюсь. Если было как обычно сделано я бы не спрашивал.
                                            Артур Шевченко
                                            27 мая 2025, 22:45
                                            0
                                            Ты ещё посетуй на то, что я jQuery не использую и жизнь тебе усложняю:-)
                                            Александр Туниеков
                                            27 мая 2025, 14:58
                                            0
                                            Ты действительно потратил 4 часа на то, чтобы понять, что браузер берёт файлы из кэша
                                            да потратил. Бывают вот такие мутные приложения
                                              Артур Шевченко
                                              27 мая 2025, 22:54
                                              0
                                              А бывают разработчики, которые не умеют читать код.
                                              Александр Туниеков
                                              27 мая 2025, 15:34
                                              0
                                              Мда… не думал, что тебя так критика зацепит.
                                              У Василия в минишопе обновления версии js скриптов через гет-параметы встроенно. Меняется версия минишоп — меняется гет-параметр. Я так же делаю. Тебе нужно подумать, чтобы при обновлении js они автоматически в браузере обновлялись. А то сделаешь ты обновление mscdek через полгода и на всех сайтах у их постоянных клиентов mscdek отвалится и владельцы сайтов потеряют клиентов. Веская причина?
                                              Искал в чем причина ошибки 4 часа. ctrl+shift+r я всегда делаю и стем что оно не срабатывает первый раз столкнулся. Так что даже не подозревал, что скрипты старые в браузере. Пришлось дебажить и изучать mscdek и sendit. Как они работают. В итоге разобрался, что header x-sipreset не верный, нашел где он отправляется, а потом уже проверил что за js в установочном пакете.
                                              4 часа дебажить такую ошибку не так уж и долго :-).
                                              Надеюсь, что ты все-таки воспримешь это от меня как фидбек :-)
                                                Артур Шевченко
                                                27 мая 2025, 22:52
                                                0
                                                Это не фидбэк, а рассказ о том как ты не умеешь дебажить JS :-)
                                                  Александр Туниеков
                                                  01 июня 2025, 17:41
                                                  0
                                                  Печалька. Вот казалось человек а на проверку мнит себя самым умным :-(
                                                    Артур Шевченко
                                                    01 июня 2025, 18:37
                                                    0
                                                    Давай закроем эту тему. Я добавил версионирование. Остальные вопрос по компоненту задавай через техподдержку modstore.
                                            kudesia
                                            27 мая 2025, 20:46
                                            0
                                            Сделайте, пожалуйста, настройку общего размера (габаритов) заказа.

                                            Чтобы не задавать каждому товару размер упаковки, а просто всей посылке из корзины задать размеры по умолчанию.
                                              Артур Шевченко
                                              27 мая 2025, 22:43
                                              0
                                              Общая настройка габаритов заказа это как? В системных настройках можно прописать размеры по умолчанию. Настройка работает, я проверял.
                                              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                              53