Add an extra delivery address I'm a Drupal novice and struggling to build a webshop with Drupal Commerce.
It's really starting to work out, but I've still have some problems regarding overriding and restyling themes.

Is it possible to add an extra delivery address form to the Drupal Commerce address field module (different billing, delivery addresses with checkbox to show delivery address)?

How can I restyle the address form? Is there a template file for it, or does it have to be done through CSS?

It would be really usefull if somebody could help me with some information or maybe some kind of guideline.
The customer information is stored as commerce_customer entity. By default it has an address field attached to it. For multiple addresses, you could either allow multiple values on the field, and use some theming to display one as billing and the other as delivery.

The other option would be to add a new address field and use that for delivery/billing. With hook_form_alter you could add custom elements to the form, like the checkbox and JavaScript effects.

You have a few options if you want to customize your address field form. You can implement AddressFieldForm, the default looks like this:

/**
 * Default address handler.
 */
class AddressFieldForm_default implements AddressFieldForm {
  public function form($address, $field, $instance, $langcode, $items, $delta, $element) {
    $required = $delta == 0 &amp;&amp; $instance['required'];

    $form['thoroughfare'] = array(
      '#title' =&gt; t('Street'),
      '#type' =&gt; 'textfield',
      '#required' =&gt; $required,
      '#default_value' =&gt; $address['thoroughfare'],
    );
    $form['premise'] = array(
      '#title' =&gt; t('Residence, building, ...'),
      '#type' =&gt; 'textfield',
      '#default_value' =&gt; $address['premise'],
    );
    $form['sub_premise'] = array(
      '#title' =&gt; t('Floor, stairway, ...'),
      '#type' =&gt; 'textfield',
      '#default_value' =&gt; $address['sub_premise'],
    );
    $form['dependent_locality'] = array(
      '#title' =&gt; t('Suburb, post box, ...'),
      '#type' =&gt; 'textfield',
      '#default_value' =&gt; $address['dependent_locality'],
    );
    $form['postal_code'] = array(
      '#title' =&gt; t('Postal Code'),
      '#type' =&gt; 'textfield',
      '#size' =&gt; 5,
      '#required' =&gt; $required,
      '#default_value' =&gt; $address['postal_code'],
    );
    $form['locality'] = array(
      '#title' =&gt; t('City'),
      '#type' =&gt; 'textfield',
      '#size' =&gt; 30,
      '#required' =&gt; $required,
      '#default_value' =&gt; $address['locality'],
    );

    // All the other fields are unsupported by this handler.
    foreach (array('administrative_area', 'sub_administrative_area') as $field) {
      $form[$field] = array(
        '#type' =&gt; 'value',
        '#value' =&gt; '',
      );
    }
    return $form;
  }
}


This is what addressfield uses to internally handle different address types. Using addressfield_mapping_alter you would be able to overwrite the default mapping, or create a mapping for your own country:

function module_addressfield_mapping_alter(&amp;$mapping) {
  $mapping['default'] = 'AddressFieldForm_my_custom_default_form',
  $mapping['DK'] = 'AddressFieldForm_dk', // Add for Denmark which doesn't exist yet
}


In addition to this, you have all the usual tools, like hook_form_alter and adding a custom theme function to render the form like you which. You should be aware that addressfield makes heavy use of AJAX to replace form elements when changing country.