Делаю сайт на Drupal 8 + Commerce 2 + Commerce Shipping. Создал способы доставки, выбираю нужный способ на чекауте, но в итоге сумма за доставку не добавляется к сумме заказа, хотя выбранный способ доставки сохраняется в заказ. В чём может быть дело? Может кто-то сталкивался?
Вопрос по настройке Commerce Shipping
Главные вкладки
Лучший ответ
Оказалось всё просто - у меня свой одношаговый чекаут флоу. Поскольку следующий шаг - это комплит, то ордер сперва переводится в состояние 'placed', а затем сохраняется. А если заказ не корзина, то перед сохранением не вызывается рефреш и не выставляются эджастменты. В итоге для решения задачи в своём классе CheckoutFlow вместо родительского метода submitForm нужно сделать свой метод
<?php
public function submitForm(array &$form, FormStateInterface $form_state) {
foreach ($this->getVisiblePanes($form['#step_id']) as $pane_id => $pane) {
$pane->submitPaneForm($form[$pane_id], $form_state, $form);
}
if ($this->hasSidebar($form['#step_id'])) {
foreach ($this->getVisiblePanes('_sidebar') as $pane_id => $pane) {
$pane->submitPaneForm($form['sidebar'][$pane_id], $form_state, $form);
}
}
if ($next_step_id = $this->getNextStepId($form['#step_id'])) {
$this->order->set('checkout_step', $next_step_id);
$form_state->setRedirect('commerce_checkout.form', [
'commerce_order' => $this->order->id(),
'step' => $next_step_id,
]);
if (
$next_step_id === 'complete') {
// Вот тут вся соль
$this->orderRefresh->refresh($this->order);
// Place the order.
$transition = $this->order->getState()->getWorkflow()->getTransition('place');
$this->order->getState()->applyTransition($transition);
}
}
$this->order->save();
}
?>
Ну и как можно догадаться, пришлось загрузить в класс сервис commerce_order.order_refresh
Комментарии
Drupal 8 + Commerce 2 - да вы, батенька, смельчак. ИМХО, должно сильно повезти, чтобы кто-то сталкивался. У них даже документация не готова ещё. Так что только XDebug, только хардкор.
Оказалось всё просто - у меня свой одношаговый чекаут флоу. Поскольку следующий шаг - это комплит, то ордер сперва переводится в состояние 'placed', а затем сохраняется. А если заказ не корзина, то перед сохранением не вызывается рефреш и не выставляются эджастменты. В итоге для решения задачи в своём классе CheckoutFlow вместо родительского метода submitForm нужно сделать свой метод
<?php
$this->order->save();
public function submitForm(array &$form, FormStateInterface $form_state) {
foreach ($this->getVisiblePanes($form['#step_id']) as $pane_id => $pane) {
$pane->submitPaneForm($form[$pane_id], $form_state, $form);
}
if ($this->hasSidebar($form['#step_id'])) {
foreach ($this->getVisiblePanes('_sidebar') as $pane_id => $pane) {
$pane->submitPaneForm($form['sidebar'][$pane_id], $form_state, $form);
}
}
if ($next_step_id = $this->getNextStepId($form['#step_id'])) {
$this->order->set('checkout_step', $next_step_id);
$form_state->setRedirect('commerce_checkout.form', [
'commerce_order' => $this->order->id(),
'step' => $next_step_id,
]);
if (
$next_step_id === 'complete') {// Вот тут вся соль
$this->orderRefresh->refresh($this->order);
// Place the order.
$transition = $this->order->getState()->getWorkflow()->getTransition('place');
$this->order->getState()->applyTransition($transition);
}
}
}
?>
Ну и как можно догадаться, пришлось загрузить в класс сервис commerce_order.order_refresh