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
- 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)
- Añadir un callback para validar el formulario hook_commerce_checkout_pane_info_alter(&$checkout_panes)
- 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
Esperamos sea de ayuda. Si conoces otro modo de hacerlo o te surge alguna duda puedes utilizar los comentarios, son bienvenidos.