Blog

Drupal Commerce alter checkout form and custom validate

22/01/2016

Drupal Commerce cómo modificar el formulario de checkout y añadir validaciones personalizadas

Commerce dispone de su propia API http://drupalcommerce.org/, que hemos utilizado para ajustar a nuestras necesidades el funcionamiento del formulario de checkout.

Descripción de la funcionalidad solicitada

En la información de facturación de un pedido hemos añadido los campos «Solicitar factura» y «NIF/CIF». Por defecto el campos «Solicitar factura» no está checkeado y «NIF/CIF» está oculto y no obligatorio. Cuando el comprador marca el campo «Solicitar factura» el campo «NIF/CIF» se muestra y es obligatorio.

Solución propuesta

  1. Añadir la lógica que cambia el campo «NIF/CIF» cuando se checkea «Solicitar factura». Utilizando hook_form_FORM_ID_alter(&$form, &$form_state, $form_id)
  2. Añadir un callback para validar el formulario hook_commerce_checkout_pane_info_alter(&$checkout_panes)
  3. Añadimos la función de validación commerce_billing_pane_validate(&$form, &$form_state, $checkout_pane, $order)

Paso 1. Alter del formulario para añadir el comportamiento al campo field_request_invoice

function example_form_commerce_checkout_form_checkout_alter(&$form, &$form_state, $form_id) {
  global $user;
  $form['customer_profile_billing']['field_cif_nif']['#states'] = array(
    'visible' => array(
      ':input[name="customer_profile_billing[field_request_invoice][und]"]' => array('checked' => TRUE),
    ),
    'required' => array(
      ':input[name="customer_profile_billing[field_request_invoice][und]"]' => array('checked' => TRUE),
    ),
  );
}

Paso 2. Alter del panel customer_profile_billing para añadir el callback a la función de validación

function example_commerce_checkout_pane_info_alter(&$checkout_panes) {
  if (isset($checkout_panes['customer_profile_billing'])) {
    $checkout_panes['customer_profile_billing']['callbacks']['checkout_form_validate'] = 'example_commerce_billing_pane_validate';
  }
}

Paso 3. Función custom de validación

function example_commerce_billing_pane_validate(&$form, &$form_state, $checkout_pane, $order) {
  if ($form_state['values']['customer_profile_billing']['field_request_invoice']['und'][0]['value'] == 1 && empty($form_state['values']['customer_profile_billing']['field_cif_nif']['und'][0]['value'])) {
    form_set_error($checkout_pane['pane_id'] . '][field_cif_nif][und][0][value', t('DNI/CIF/NIF field is required.'));
    return FALSE;
  }
  return TRUE;
}

Resultado en la interfaz

Commerce checkout validation

Esperamos sea de ayuda. Si conoces otro modo de hacerlo o te surge alguna duda puedes utilizar los comentarios, son bienvenidos.

También te puede gustar…

Caso de éxito: Binfluencer

Caso de éxito: Binfluencer

Binfluencer es otra de las empresas que ha confiado en ASPgems. En este caso de éxito te contamos nuestra colaboración con ellos.

ASPgems icon
C/ Sextante, 9
28023 Madrid,
España

Hablemos.

A %d blogueros les gusta esto: