Странное формирование списка вариантов доставки и блока типы доставки, если расчет доставки возможен только когда адрес введен включая улицу.
Архив
1
В процессе разработки плагина доставки столкнулись с ситуацией, что если посчитать сроки, цену доставки можно только, если пользователь ввел улицу, то список вариантов доставки и информация в блоке "Типы доставки" - "Курьер" выглядят ущербно, то есть информация в них отсутствует. В итоге, чтобы хоть как-то выйти из ситуации приходится добавлять настройку "Улица, дом (по умолчанию)".
Вот так выглядит выбор без "костыля".
А вот так, когда с костылём
Разница очевидна. Но такая история прокатит только если стоимость доставки не зависит от адреса внутри города и скорее является ошибкой, а не верным поведением формы оформления заказа. А если в городе пользователя нет "Улицы Ленина 1", то он будет видет голый вариант "без костыля".
Вопрос не в то, что кто-то не указывает улицу, а в том, что у многих способов оплаты улица не влияет на стоимость доставки, то есть все тарифы рассчитываются до передачи улицы. И вот в "новом" оформлении заказа функцию расчета доставки дергают несколько раз (и первый раз без улицы), и вот в выпадающее меню попадает не то, что было отвечено на последний запрос (когда приходит весь адрес), а то что ответили в первом. Поэтому плагин, который может сообщить сроки и цену без указания улицы может и в первом и последующих запросах ответить одно и тоже. А мы нет.... Даже если адрес будет полностью заполнен и нажать F5, то всё-равно в плагин прилетит несколько запросов: без улицы (для списка) и с улицей...уж не знаю для чего.
requestedAddressFieldsForService() вот этого метода у меня нет.
а в первом есть страна, регион, город, улица и все и cost и required.
да можно написать любой минимальный статичный плагин, можно даже стандартный плагин "Курьер" помучать.
Условие. В calculate получаем адрес
$address = $this->getAddress();
Если есть
$address['street']
то возвращаем какой-то статичный массив rates из нескольких вариантов.
Если улица пустая.....то попробуй догадаться, что надо передавать, чтобы.....в "новом" оформлении был выбор из нескольких вариантов, если улица заполнена в форме ))))
То есть первый квест вообще сообразить, как сделать вывод нескольких вариантов, если цену и сроки ты можешь сказать только когда знаешь улицу. Когда первый квест пройден.....сделать чтобы было не как на первой картинке, а как на второй.
плюс надо загнать себя в ситуацию, когда тебе нужна улица для возвращения условий доставки.....и искусственно, нет улицы ты не можешь сообщить о вариантах доставки
Добавление сервисов к старому функционалу waShippingPlugin привело к чрезмерному усложнению и нечеткой логике работы т.ч. попытка сесть на 2 стула завершилась традиционно: все равно нужно переписывать класс и все плагины доставки, но этого делать никто не будет т.к. это долго и партнеры разорутся )
12 комментариев
не представляю как курьер может доставить товар без указания улицы и дома
Вопрос не в то, что кто-то не указывает улицу, а в том, что у многих способов оплаты улица не влияет на стоимость доставки, то есть все тарифы рассчитываются до передачи улицы. И вот в "новом" оформлении заказа функцию расчета доставки дергают несколько раз (и первый раз без улицы), и вот в выпадающее меню попадает не то, что было отвечено на последний запрос (когда приходит весь адрес), а то что ответили в первом. Поэтому плагин, который может сообщить сроки и цену без указания улицы может и в первом и последующих запросах ответить одно и тоже. А мы нет.... Даже если адрес будет полностью заполнен и нажать F5, то всё-равно в плагин прилетит несколько запросов: без улицы (для списка) и с улицей...уж не знаю для чего.
Это уже совсем другой вопрос. я так понимаю ребята которые писали нормальный JS свалили из WA и снова пошел индусский код вроде этого
waShippingPlugin::requestedAddressFields()
waShippingPlugin::requestedAddressFieldsForService()
массивы полей содержат ключ "cost"? Покажи основной код плагина чтобы было понятнее
requestedAddressFieldsForService() вот этого метода у меня нет.
а в первом есть страна, регион, город, улица и все и cost и required.
да можно написать любой минимальный статичный плагин, можно даже стандартный плагин "Курьер" помучать.
Условие. В calculate получаем адрес
Если есть
то возвращаем какой-то статичный массив rates из нескольких вариантов.
Если улица пустая.....то попробуй догадаться, что надо передавать, чтобы.....в "новом" оформлении был выбор из нескольких вариантов, если улица заполнена в форме ))))
То есть первый квест вообще сообразить, как сделать вывод нескольких вариантов, если цену и сроки ты можешь сказать только когда знаешь улицу. Когда первый квест пройден.....сделать чтобы было не как на первой картинке, а как на второй.
старые плагины по другому обрабатываются по крайней мере раньше так было
проверил на одном из своих плагинов доставки, приходит 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; }у тебя нет
плюс надо загнать себя в ситуацию, когда тебе нужна улица для возвращения условий доставки.....и искусственно, нет улицы ты не можешь сообщить о вариантах доставки
все там есть:
только не для всех сервисовcost нет )
у данной службы доставки единый тариф в пределах города т.е. это поле не требуется для расчета стоимости доставки
Добавление сервисов к старому функционалу waShippingPlugin привело к чрезмерному усложнению и нечеткой логике работы т.ч. попытка сесть на 2 стула завершилась традиционно: все равно нужно переписывать класс и все плагины доставки, но этого делать никто не будет т.к. это долго и партнеры разорутся )
И по тихому сняли "На рассмотрении". Нет ни "Не принято", ни "Принято".
Яндекс добавил метод получение стоимости по городу, так что теперь всё это уже некритично.