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

1

В процессе разработки плагина доставки столкнулись с ситуацией, что если посчитать сроки, цену доставки можно только, если пользователь ввел улицу, то список вариантов доставки и информация в блоке "Типы доставки" - "Курьер" выглядят ущербно, то есть информация в них отсутствует. В итоге, чтобы хоть как-то выйти из ситуации приходится добавлять настройку "Улица, дом (по умолчанию)". 

Вот так выглядит выбор без "костыля".

А вот так, когда с костылём

Разница очевидна. Но такая история прокатит только если стоимость доставки не зависит от адреса внутри города и скорее является ошибкой, а не верным поведением формы оформления заказа. А если в городе пользователя нет "Улицы Ленина 1", то он будет видет голый вариант "без костыля".

12 комментариев

  • +1
    Anton F Anton F 23 марта 2022 14:00 #

    не представляю как курьер может доставить товар без указания улицы и дома

    • +1
      creativit.ru creativit.ru 28 марта 2022 15:57 #

      Вопрос не в то, что кто-то не указывает улицу, а в том, что у многих способов оплаты улица не влияет на стоимость доставки, то есть все тарифы рассчитываются до передачи улицы. И вот в "новом" оформлении заказа функцию расчета доставки дергают несколько раз (и первый раз без улицы), и вот в выпадающее меню попадает не то, что было отвечено на последний запрос (когда приходит весь адрес), а то что ответили в первом. Поэтому плагин, который может сообщить сроки и цену без указания улицы может и в первом и последующих запросах ответить одно и тоже. А мы нет.... Даже если адрес будет полностью заполнен и нажать F5, то всё-равно в плагин прилетит несколько запросов: без улицы (для списка) и с улицей...уж не знаю для чего.

      • +1
        Anton F Anton F 28 марта 2022 16:19 #

        Это уже совсем другой вопрос. я так понимаю ребята которые писали нормальный JS свалили из WA и снова пошел индусский код вроде этого 

        Поэтому плагин, который может сообщить сроки и цену без указания улицы может и в первом и последующих запросах ответить одно и тоже.

        waShippingPlugin::requestedAddressFields()

        waShippingPlugin::requestedAddressFieldsForService()

        массивы полей содержат ключ "cost"? Покажи основной код плагина чтобы было понятнее


        • +1
          creativit.ru creativit.ru 30 марта 2022 22:36 #

          requestedAddressFieldsForService()  вот этого метода у меня нет. 

          а в первом есть страна, регион, город, улица и все и cost и required. 

          да можно написать любой минимальный статичный плагин, можно даже стандартный плагин "Курьер" помучать. 

          Условие. В calculate получаем адрес 

          $address = $this->getAddress();

          Если есть 

          $address['street'] 

          то возвращаем какой-то статичный массив rates из нескольких вариантов. 

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

          То есть первый квест вообще сообразить, как сделать вывод нескольких вариантов, если цену и сроки ты можешь сказать только когда знаешь улицу. Когда первый квест пройден.....сделать чтобы было не как на первой картинке, а как на второй.

          • +1
            Anton F Anton F 1 апреля 2022 14:58 #
            можно даже стандартный плагин "Курьер"

            старые плагины по другому обрабатываются по крайней мере раньше так было

            проверил на одном из своих плагинов доставки, приходит 1 запрос для курьерской доставки.

            plugin.php

            <?php
            return [
                ...
                'external' => false,
                'external_tracking' => true,
                'services_by_type' => true,
            ];

            Методы плагина:

            public function allowedAddress()
            {
                $cities = $this->getSettings('to_cities');
                $cities = empty($cities) ? $this->getDeliveryCities() : explode(',', $cities);
                return [
                    ['country' => ['rus'], 'city' => $cities]
                ];
            }
            
            public function requestedAddressFields()
            {
                return [
                    'country' => [
                        'cost'     => true,
                        'required' => true,
                        'hidden'   => true,
                        'value'    => 'rus'
                    ],
                    'region' => [
                        'cost'     => true,
                        'required' => true
                    ],
                    'city' => [
                        'cost'     => true,
                        'required' => true
                    ],
                ];
            }
            
            public function requestedAddressFieldsForService($service)
            {
                $fields = $this->requestedAddressFields();
                if ($service['type'] === self::TYPE_TODOOR) {
                    $fields['street'] = ['required' => true];
                } elseif ($service['type'] === self::TYPE_POST) {
                    $fields['zip'] = ['required' => true];
                }
                return $fields;
            }
            
            public function customFieldsForService(waOrder $order, $service)
            {
                $fields = $this->customFields($order);
                if ($service['type'] === self::TYPE_TODOOR && $this->getAdapter()->getAppProperties('desired_date')) {
                    $fields['desired_delivery'] = [
                        'value' => [
                            'date_str' => ifset($order, 'shipping_params', 'desired_delivery.date_str', null),
                            'date' => ifset($order, 'shipping_params', 'desired_delivery.date', null),
                            'interval' => ifset($order, 'shipping_params', 'desired_delivery.interval', null),
                        ],
                        'title' => 'Желаемое время доставки',
                        'control_type' => waHtmlControl::DATETIME,
                        'params' => $service['custom_data'][self::TYPE_TODOOR]['interval'],
                    ];
                }
                
                return $fields;
            }
            • +1
              creativit.ru creativit.ru 1 апреля 2022 16:58 #

              у тебя нет 

              'street' => ['cost' => true, 'required' => true],

              плюс надо загнать себя в ситуацию, когда тебе нужна улица для возвращения условий доставки.....и искусственно, нет улицы ты не можешь сообщить о вариантах доставки

              • +1
                Anton F Anton F 1 апреля 2022 17:18 #
                у тебя нет

                все там есть:

                if ($service['type'] === self::TYPE_TODOOR) { $fields['street'] = ['required' => true];
                только не для всех сервисов

                • +1
                  creativit.ru creativit.ru 3 апреля 2022 16:17 #

                  cost нет )

                  • +1
                    Anton F Anton F 3 апреля 2022 16:22 #

                    у данной службы доставки единый тариф в пределах города т.е. это поле не требуется для расчета стоимости доставки

                  • +1
                    Anton F Anton F 28 марта 2022 16:29 #

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

                  • +1
                    creativit.ru creativit.ru 7 апреля 2022 08:04 #

                    И по тихому сняли "На рассмотрении". Нет ни "Не принято", ни "Принято".

                    • +1
                      creativit.ru creativit.ru 8 апреля 2022 15:54 #

                      Яндекс добавил метод получение стоимости по городу, так что теперь всё это уже некритично.

                      Добавить комментарий

                      Чтобы добавить комментарий, зарегистрируйтесь или войдите