Вы здесь

Как сделать зависимые поля формы чекаута от способа доставки?

0

Добрый день!
Решил тут сделать свою доставку, на основе модуля с примером, как вывести свою форму и заполнить я знаю, но как правильно вызвать форму "Информация о плательщике"? Т.е. ставлю радиобаттон на "Доставка по России" и вылазит:

Или надо делать свою форму с нуля, получить данные и проверить?

Версия Drupal: 
7.x
Категория: 
Form API
Связанные проекты: 
Drupal Commerce
Вопрос задан 14.03.2016 - 19:41
Аватар пользователя Sora
Sora
92

Ответы

1

UPD: перечитал ещё раз вопрос и понял, что не по теме ответил. Оставлю, может кому-то будет полезно. По вопросу: вызвать её можно через drupal_get_form(): http://drupal.stackexchange.com/questions/178143/how-to-render-a-commerc...

Я сделал это, разнеся выбор способа доставки и формы по доставке на разные шаги оформления заказа. В зависимости от выбранного способа доставки, показывается та или иная информация пользователю. Мне кажется, что это не самое хорошее решение, может кто-то ещё предложит в комментариях.

/*
 * Hook hook_commerce_checkout_pane_info_alter($checkout_pane)
 */
function MYMODULE_commerce_checkout_pane_info_alter(&$checkout_pane) {
  global $user;
  if(arg(0) == 'checkout' && arg(2) == 'shipping'){
    // задаём какая панель должна быть видна в зависимости от выбранного способа доставки
    $checkout_profile_panes = _return_profile_checkout_panes();

    // выключаем все панели с доставкой
    foreach ($checkout_profile_panes as $key => $pane) {
      $checkout_pane[$pane]['title'] = 'Для оформления заказа заполните форму';
      $checkout_pane[$pane]['enabled'] = 0;
    }

    // обходим все панели, которые есть на текущий момент
    foreach($checkout_pane as $pane_name => &$pane_data) {

      //нам нужна только панель с информацией о доставке
      if($pane_name == 'commerce_shipping') {

        //зугружаем текущий заказ
        $order = commerce_cart_order_load($user->uid);
        $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
        $shipping_service = NULL;

        //определяем, какой выбран вариант доставки
        foreach ($order_wrapper->commerce_line_items as $delta => $line_item_wrapper) {
          if ($line_item_wrapper->type->value() == 'shipping') {
            $shipping_service = $line_item_wrapper->commerce_shipping_service->value();

            //включаем нужную нам панель 
            $pane_name = isset($checkout_profile_panes[$shipping_service]) ? 
              $checkout_profile_panes[$shipping_service] : $checkout_profile_panes['default'];

            $checkout_pane[$pane_name]['enabled'] = 1;

            break;
          }
        }
      }
    }
  }
}

/*
 * Вспомогательная функция. Для какого метода доставки какую использовать панель
 */
function _return_profile_checkout_panes(){
  $output = array(
    'courier_metro' => 'customer_profile_profile_mini',
    'courier_cash' => 'customer_profile_chprofile_big',
    'worldwide_shipping' => 'customer_profile_worldwid_mail',
    'default' => 'customer_profile_chprofile_mai'
  );

  return $output;
}
Ответ дан 14.03.2016 - 20:10
Аватар пользователя shu
shu
176

Т.е. примерно так вы сделал в настройках процесса? В первом шаге выбираем способ и потом разную информацию?

В принципе наверное и ваш способ подойдет.
UP. По ходу понял, надо свою панель определить... Не работал с Commerce толком, только вникаю :)

Комментарий оставлен 14.03.2016 - 20:54
0

Так же как и в прошлом вопросе:
hook_form_alter + #states
или hook_form_alter + #ajax

Ответ дан 14.03.2016 - 20:32
Аватар пользователя xandeadx
xandeadx
1542

Если честно не понял, есть хук MODULE_service_details_form он возвращает форму для доставки, я в ней могу руками создать форму. А я хотел получить уже готовую с адресом, а не руками ее создавать...

Комментарий оставлен 14.03.2016 - 20:41