Как создать панель для оформления заказа в Drupal Commerce

Первым делом имплементируем хук hook_commerce_checkout_pane_info, в нем нам необходимо добавить информацию о создаваемой панели. Полный список свойств панели:

  • pane_id - машинное имя панели, допускается использование строчных букв и цифр, а так же символов "-", "_"
  • title - название панели
  • name - имя панели, используемое при отображении на административных страницах, если не указано, используется title
  • page - page_id на странице оформления заказа на которой панель должна появиться по умолчанию; по умолчанию checkout
  • collapsible - будет ли панель сворачиваемая; по умолчанию FALSE
  • collapsed - будет ли панель свернута по умолчанию; по умолчанию FALSE
  • weight - вес панели; по умолчанию 0
  • enabled - будет ли панель включена по умолчанию; по умолчанию TRUE
  • review - будет ли панель включена в область просмотра; по умолчанию TRUE
  • module - название модуля, который определяет панель; Этот параметр не должен заполняться при создании панели, он будет создан автоматически при загрузке панели
  • file - путь к файлу, в котором хранятся callback функции для панели
  • base - используется на создания имен callback функций, каждое название функции будет формироваться по умолчанию по шаблону [base]_[callback]
  • callbacks - массив callback функций:
    • settings_form($checkout_pane) - возвращает форму с настройками для панели
    • checkout_form($form, &$form_state, $checkout_pane, $order) - возвращает форму, которая будет выводиться на панели в процессе оформления заказа
    • checkout_form_validate($form, &$form_state, $checkout_pane, $order) - проверяет введенные данные в процессе оформления заказа и возвращает TRUE или FALSE
    • checkout_form_submit($form, &$form_state, $checkout_pane, $order) - обработчик введенных данных в процессе оформления заказа
    • review($form, $form_state, $checkout_pane, $order) - возвращает данные, используемые в области просмотра

И так, для начала объявляем саму панель:

/**
 * Implements hook_commerce_checkout_pane_info()
 */
function moduleName_commerce_checkout_pane_info() {
  $panes['moduleName'] = array(
    'title' => t('Pane title'),
    'page' => 'checkout',
    'weight' => 1,
    'file' => 'includes/moduleName.checkout_pane.inc',
    'base' => 'moduleName_pane',
  );

  return $panes;
}

Далее создаем файл includes/moduleName.checkout_pane.inc и добавляем следующее:

/**
 * Checkout pane callback: returns the pane's settings form.
 */
function moduleName_pane_settings_form($checkout_pane) {
  $form['moduleName_pane_field'] = array(
    '#type' => 'textfield',
    '#title' => t('Pane settings field'),
  );

  return $form;
}

Вышеописанную функцию можно не добавлять, если у панели нет настроек. Далее добавляем функцию, которая будет выводить содержимое в процессе оформления заказа:

/**
 * Checkout pane callback: returns the contents View for inclusion in the checkout form.
 */
function moduleName_pane_checkout_form($form, $form_state, $checkout_pane, $order) {
  $checkout_form['moduleName_pane_field'] = array(
    '#type' => 'textfield',
    '#title' => t('Pane field'),
  );

  return $checkout_form;
}

Далее добавляем валидатор введенных данных:

/**
 * Checkout pane callback: validation callback.
 */
function moduleName_pane_checkout_form_validate($form, &$form_state, $checkout_pane, $order) {
  $pane_values = $form_state['values'][$pane_id];
  if (empty($pane_values['moduleName_pane_field'])) {
    drupal_set_message(t('Message.'), 'warning');
    return FALSE;
  }

  return TRUE;
}

В конце добавляем обработчик введенных данных:

/**
 * Checkout pane callback: submit callback.
 */
function moduleName_pane_checkout_form_submit($form, &$form_state, $checkout_pane, $order) {
  // Что нибудь делаем с данными.
}

Комментарии (6)

Аватар пользователя Вадим
Вадим

а как теперь из созданной формы передать введеные значения в заказ?

Аватар пользователя Benya
Benya

На сабмите делайте, что вам надо

Аватар пользователя Вадим
Вадим

А где почитать про работу с submit. Гуглю, никак не найду примеры или документацию =\

Аватар пользователя Вадим
Вадим

Я так понимаю мне для передачи данных из формы в заказ вот это нужно?:
$order = commerce_order_load($form_state['order']->order_id);

только как с этим работать?)

Аватар пользователя Benya
Benya

Вам для начала нужно изучить Forms API, чтобы понимать, что происходит