Вопрос по настройке Commerce Shipping

Аватар пользователя gun_dose gun_dose 18 января 2018 в 14:54

Делаю сайт на Drupal 8 + Commerce 2 + Commerce Shipping. Создал способы доставки, выбираю нужный способ на чекауте, но в итоге сумма за доставку не добавляется к сумме заказа, хотя выбранный способ доставки сохраняется в заказ. В чём может быть дело? Может кто-то сталкивался?

0 Thanks

Лучший ответ

Аватар пользователя gun_dose gun_dose 18 января 2018 в 16:32
1

Оказалось всё просто - у меня свой одношаговый чекаут флоу. Поскольку следующий шаг - это комплит, то ордер сперва переводится в состояние 'placed', а затем сохраняется. А если заказ не корзина, то перед сохранением не вызывается рефреш и не выставляются эджастменты. В итоге для решения задачи в своём классе CheckoutFlow вместо родительского метода submitForm нужно сделать свой метод

<?php
public function submitForm(array &$formFormStateInterface $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

Комментарии

Аватар пользователя fairrandir fairrandir 18 января 2018 в 15:25

Drupal 8 + Commerce 2 - да вы, батенька, смельчак. ИМХО, должно сильно повезти, чтобы кто-то сталкивался. У них даже документация не готова ещё. Так что только XDebug, только хардкор.

Аватар пользователя gun_dose gun_dose 18 января 2018 в 16:32
1

Оказалось всё просто - у меня свой одношаговый чекаут флоу. Поскольку следующий шаг - это комплит, то ордер сперва переводится в состояние 'placed', а затем сохраняется. А если заказ не корзина, то перед сохранением не вызывается рефреш и не выставляются эджастменты. В итоге для решения задачи в своём классе CheckoutFlow вместо родительского метода submitForm нужно сделать свой метод

<?php
public function submitForm(array &$formFormStateInterface $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