Добрый день! Извиняюсь за долгий ответ, был в отъе

Добрый день! Извиняюсь за долгий ответ, был в отъезде на несколько дней. Вопрос ваш довольно интересный. Вам ребята судя по всему помогли, но чтобы еще более фэншуйно получилось, надо конечно нам и ядро чуть-чуть доработать будет, добавив признак связанных товаров. Ведь по сути, даже если вы реализовали добавление нескольких товаров, если в итоге клиент захочет отказаться от какого-то товара, то и все сопутствующие к нему товары надо бы убирать. Да и вообще видеть их в форме заказа, хотя бы для удобства.

Ну да ладно, это потом, а пока просто еще более детально разберем еще один вариант реализации этой задачи, потому что тайминги в JS — это не совсем круто, да и прочие моменты есть. Вам на самом деле просто надо переопределить action-процессор и в нем реализовать циклическое выполнение процессора добавления товара. Как это делается, написано здесь (читайте внимательно раздел «Переопределяем процессоры»). В кастомном action-процессоре укажите свой отдельный процессор, в методе process которого и пропишите примерно следующее:

public function process(){
    $path = $this->modx->getObject('modNamespace', 'basket')->getCorePath().'processors/';
    
    foreach($products as $product_id => $quantity){
        
        if(!$response = $modx->runProcessor('basket/web/orders/products/add',
        array(
            "product_id"    => $product_id,
            "quantity"      => $quantity ? $quantity : 1,
        ), array(
            'processors_path' => $path,
        ))){
            return $this->failure("Не удалось выполнить процессор");
        }
        
        // else
        if($response->isError()){
            return $response->getResponse();
        }
    }

    return $this->success('Товары успешно добавлены');
}

Тут конечно могут быть логические ошибки с обработчиком ошибок (к примеру, из пяти товаров 3 добавилось, а с четвертым ошибка, и он вернет ошибку, хотя три все-таки будут добавлены), но это крайне мелкая вероятность, так что можно пренебречь. И именно поэтому и надо ядро доработать. Но в целом это вполне рабочий вариант, и выполнено будет в один запрос, после чего корректно на сервер уйдет запрос на состояние корзины.

P.S. Спасибо за положительные отзывы :)