modx-pro / miniShop2

Second version of simple online shop for MODX Revolution
GNU General Public License v2.0
150 stars 128 forks source link

Проблема с одновременным заполнением нескольких полей заказа #879

Open AlexSus opened 1 year ago

AlexSus commented 1 year ago

Сообщение об ошибке / Error message

Есть проблема, если одномоментно заполнить несколько полей в форме заказа (получатель, телефон, индекс, город, улица, регион и.т.д.) Такое может случаться, например, при использовании сторонних доставок (Почта Росиии, СДЭК), которые при автокомплите города, одновременно заполняют несколько полей: поля города, индекса и области, либо же это вполне может произойти и просто, если соединение с интернетом нестабильно и одновременно на сервер уйдут несколько запросов, возможно такое может происходить при автозаполнении сохраненных полей браузером, типа подстановки имени и телефона. Когда происходит одновременно несколько запросов к order/add - видимо из-за конкуренции в итоге сохранится лишь одно, максимум 2 поля. Остальное перезапишется предыдущим значением.

Резюме / Summary

Скорей всего проблема в том, что при запросе к order/add перезаписывается вся сессия и получается тот запрос, который выполнился последним, он затрет значения параллельных запросов и поля не сохранятся.

Шаг для воспроизведения / Step to play

Я смог воспроизвести проблему на демо сайте https://minishop2.com/cart таким кодом в консоли браузера:

$(miniShop2.Order.order + ' [name="city"]').val('Москва').change();
$(miniShop2.Order.order + ' [name="index"]').val('606000').change();
$(miniShop2.Order.order + ' [name="street"]').val('Арбат').change();
$(miniShop2.Order.order + ' [name="region"]').val('Московская область').change();

Наблюдаемое поведение / Observed behavior

Мы увидим в панели сетевых запросов, что ушло 4 запроса, все они вернули success. Обновляем страницу и видим, что в лучшем случае будет заполнено лишь одно-два поля, а остальные пустые, т.к. перезатерлись.

Ожидаемое поведение / Expected behavior

Хотелось бы, чтобы все поля правильно сохранялись в заказ, независимо от других запросов, не мешая друг другу.

Environment

Проверялось на версии https://minishop2.com/cart и на сайте с Minishop2 2.4.18-pl и modx 2.7.1

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