Processor: isOrderStarted()
Есть один нюанс. Метод определяет что оформление заказа начато по наличию инициированной сессии, на сколько я понял. И тут возникает момент.
Допустим если у нас есть 2 страницы (корзина/форма заказа). Очевидно, что находясь на странице оформления заказа (там где лежит форма order) - он начат. Вопрос, начато ли оформление заказа если пользователь зашел один раз на форму заказа, что-то там сделал, сессия создалась, метод isOrderStarted() отдал =true, затем вернулся на страницу корзины и удалил часть товаров или изменил количество, казалось бы ответ - ДА, на форму заходил ведь, что-то нажал, просто потом отошел в сортир/корзину/страницу с котами =). Но вот момент, если сделать плагин и в событии "OnRegisterDelivery" описать, как пример, получение данных от апи сервиса, то каждый раз, когда пользователь нажимает +- или меняет что-то на странице корзины, событие "OnRegisterDelivery" отрабатывает и данные запрашиваются даже когда формы не видно. Исходя из названия события, он должно отрабатывать когда мы добавляем способы доставки, по идее находясь на странице, где был вызван "Order".
Если конечно корзина на одной странице с формой, вопрос отпадает.
Можно ли методами Commerce определить, что пользователь в процессе оформления и в форме? Я изначально попробовал ($modx->documentIdentifier !== $params['order_page_id']), грубо, но ajax запросы проходят через 404 я так понимаю и там не получается в "OnRegisterDelivery" определить id страницы. Ожидаю именно в "OnRegisterDelivery", чтобы просто заблокировать запросы по какому-либо условию что юзверь не в корзине или где-либо еще. Каждый раз просто плюс нажал и пошел спам в сервис, при этом изменение данных корзины тоже тормозить начинает из-за ожидания ответа.
Не нужно обращаться к апи в OnRegisterDelivery. Или кэшировать обращения, если по-другому никак.
Не нужно обращаться к апи в OnRegisterDelivery.
А в каком событии можно? Чтобы перерисовывать форму согласно изменившимся данным? Я просто не нашел ничего в доках по этому поводу. Там в событии OnRegisterDelivery и массиве $rows добавляется свой вариант и у него есть markup и туда можно добавить дополнительный контент (мне показалось что туда зайдет форма от сервиса из 6 полей), которую можно менять еще и через браузер при помощи, грубо JS: onChange = Commerce.updateOrderData($('[data-commerce-order]')); Оно все прекрасно работает, только проблема в том, что при изменении количества товаров идет пересчет сумм доставок даже когда пользователь не на странице с формой. Из-за того, что сессия распространяется на все страницы, а данные мы берем из сессии через $processor->getRawData() в событии OnRegisterDelivery.
Кеширование в принципе да, вариант, но не в этом случае, когда почти на любое действие в форме или в корзине нужно перезапрашивать АПИ за новым перерасчетом и перерисовкой формы.
У меня пока один вариант, воткнуть костыль [[Order? &isOrderstarted=1]] может быть тогда из массива $params в событии OnRegisterDelivery можно будет вытащить эту переменную и если она существует, значит мы на стадии оформления через форму...
Перерисовывать форму по данным нужно в OnOrderRawDataChanged
Перерисовывать форму по данным нужно в OnOrderRawDataChanged
Если форма в OnRegisterDelivery рисуется, то в OnOrderRawDataChanged нет к ней доступа в любом случае. Все что есть в OnOrderRawDataChanged это только сессия. Тут смысла в ней нет. Ее можно получить $processor->getRawData() в событии OnRegisterDelivery.