care-8.x-1.x-dev/care_fields/includes/address_select.inc

care_fields/includes/address_select.inc
<?php

/**
 * @file
 * Definitions and callbacks for CARE address selector field.
 */

/**
 * Form definition.
 */
function _care_fields_address_select_form(&$element, $form_state, $field, $instance, $items, $delta) {
  /*
   * Address numbers are used for addresses previously saved in CARE.
   * An address number of zero means an address for the user that has not yet
   * been saved.
   */
  $settings = $instance['settings']['input_options'];
  $number_field_name = "";

  foreach ($element['#field_parents'] as $index => $parent) {
    if ($index) {
      $number_field_name .= "[$parent]";
    }
    else {
      $number_field_name = $parent;
    }
  }
  if ($number_field_name) {
    $number_field_name .= "[" . $field['field_name'] . "]";
  }
  else {
    $number_field_name .= $field['field_name'];
  }
  $number_field_name .= "[" . $element['#language'] . "][" . $element['#delta'] . "][address_index]";

  $element['prefix'] = [
    '#type' => 'markup',
    '#markup' => '<fieldset class="form-wrapper"><legend><span class="fieldset-legend">' . $instance['label'] . '</legend>',
  ];

  // If we have a non-anonymous user, show their addresses as options.
  if ($settings['default_from_current_user'] && user_is_logged_in()) {
    global $user;
    if ($user && $user->uid != 0) {
      $waccount = entity_metadata_wrapper('user', $user);
      $address_options = [];
      $address_default = -1;
      $address_field_name = variable_get('care_user_address_field', '');
      $address_data = $waccount->$address_field_name->value();
      $field_info = field_info_field($address_field_name);
      $multiple_value_field = ($field_info['cardinality'] == '-1');
      if (!$multiple_value_field && $address_data) {
        $multi_address_data = [
          0 => $address_data,
        ];
        $address_data = $multi_address_data;
      }
      $element['address_data'] = [
        '#type' => 'value',
        '#value' => $address_data,
      ];
      foreach ($address_data as $index => $address) {
        $compact_address = [];
        $compact_address[] = $address['address_line_1'];
        if ($address['address_line_2']) {
          $compact_address[] = $address['address_line_2'];
        }
        if ($address['address_line_3']) {
          $compact_address[] = $address['address_line_3'];
        }
        $compact_address[] = $address['town'];
        $compact_address[] = $address['postcode'];
        $address_options[$index] = implode(", ", $compact_address);
        $address_default = isset($items[$delta]['address_index']) ? $items[$delta]['address_index'] : 0;
      }
      $address_options[(-1)] = 'New Address';
      $element['address_index'] = [
        '#type' => 'radios',
        '#title' => 'Address',
        '#options' => $address_options,
        '#default_value' => $address_default,
      ];
    }
    else {
      $element['address_index'] = [
        '#type' => 'value',
        '#value' => -1,
      ];
    }
  }
  else {
    $element['address_index'] = [
      '#type' => 'value',
      '#value' => -1,
    ];
  }
  $element['address_number'] = [
    '#type' => 'value',
    '#description' => 'CARE address number, or zero for a new address',
    '#value' => 0,
  ];
  // Generate country field options.
  $countries = variable_get('care_fields_countries', 'UK|United Kingdom');
  $countries = preg_split('/\r\n|[\r\n]/', $countries);
  $country_default = isset($items[$delta]['country_code']) ? $items[$delta]['country_code'] : variable_get('care_fields_country_default', 'UK');
  $country_options = [];
  if ($country_default == '') {
    $country_options += [
      '' => t(' - select - '),
    ];
  }
  foreach ($countries as $index => $country) {
    if (trim($country)) {
      $data = explode("|", $country);
      $country_options[$data[0]] = $data[1];
    }
  }

  $element['address_line_1'] = [
    '#type' => 'textfield',
    '#title' => t('Address line 1'),
    '#states' => [
      'visible' => [
        ':input[name="' . $number_field_name . '"]' => [
          'value' => -1,
        ],
      ],
      'required' => [
        ':input[name="' . $number_field_name . '"]' => [
          'value' => -1,
        ],
      ],
    ],
    '#default_value' => isset($items[$delta]['address_line_1']) ? $items[$delta]['address_line_1'] : '',
    '#size' => 30,
  ];
  $element['address_line_2'] = [
    '#type' => 'textfield',
    '#title' => t('Address line 2'),
    '#states' => [
      'visible' => [
        ':input[name="' . $number_field_name . '"]' => [
          'value' => -1,
        ],
      ],
    ],
    '#default_value' => isset($items[$delta]['address_line_2']) ? $items[$delta]['address_line_2'] : '',
    '#size' => 30,
  ];
  $element['address_line_3'] = [
    '#type' => 'textfield',
    '#title' => t('Address line 3'),
    '#states' => [
      'visible' => [
        ':input[name="' . $number_field_name . '"]' => [
          'value' => -1,
        ],
      ],
    ],
    '#default_value' => isset($items[$delta]['address_line_3']) ? $items[$delta]['address_line_3'] : '',
    '#size' => 30,
  ];
  $element['town'] = [
    '#type' => 'textfield',
    '#title' => t('Town'),
    '#states' => [
      'visible' => [
        ':input[name="' . $number_field_name . '"]' => [
          'value' => -1,
        ],
      ],
      'required' => [
        ':input[name="' . $number_field_name . '"]' => [
          'value' => -1,
        ],
      ],
    ],
    '#default_value' => isset($items[$delta]['town']) ? $items[$delta]['town'] : '',
    '#size' => 30,
  ];
  $element['county'] = [
    '#type' => 'textfield',
    '#title' => t('County'),
    '#states' => [
      'visible' => [
        ':input[name="' . $number_field_name . '"]' => [
          'value' => -1,
        ],
      ],
    ],
    '#default_value' => isset($items[$delta]['county']) ? $items[$delta]['county'] : '',
    '#size' => 30,
  ];
  $element['country_code'] = [
    '#type' => 'select',
    '#title' => t('Country'),
    '#states' => [
      'visible' => [
        ':input[name="' . $number_field_name . '"]' => [
          'value' => -1,
        ],
      ],
    ],
    '#options' => $country_options,
    '#default_value' => $country_default,
  ];
  $element['postcode'] = [
    '#type' => 'textfield',
    '#title' => t('Postcode'),
    '#states' => [
      'visible' => [
        ':input[name="' . $number_field_name . '"]' => [
          'value' => -1,
        ],
      ],
      'required' => [
        ':input[name="' . $number_field_name . '"]' => [
          'value' => -1,
        ],
      ],
    ],
    '#default_value' => isset($items[$delta]['postcode']) ? $items[$delta]['postcode'] : '',
    '#size' => 10,
    '#maxlength' => 10,
  ];
  $element['suffix'] = [
    '#type' => 'markup',
    '#markup' => '</div>',
  ];
  $element['local_unsent_changes'] = [
    '#type' => 'value',
    '#value' => isset($items[$delta]['local_unsent_changes']) ? $items[$delta]['local_unsent_changes'] : CARE_FIELDS_UNCHANGED,
  ];
  $element['#element_validate'] = [
    '_care_fields_field_widget_address_select_validate',
  ];

}

/**
 * Form validation.
 */
function _care_fields_field_widget_address_select_validate(&$element, &$form_state) {
  $address_index = $element['address_index']['#value'];
  if ($address_index == -1 && $element['#required']) {
    if (trim($element['address_line_1']['#value']) == '') {
      form_error($element['address_line_1'], t('%field is required for %name', [
        '%field' => t('Address line 1'),
        '%name' => $element['#title'],
      ]));
    }
    if (trim($element['town']['#value']) == '') {
      form_error($element['town'], t('%field is required for %name', [
        '%field' => t('Town'),
        '%name' => $element['#title'],
      ]));
    }
    if (trim($element['postcode']['#value']) == '') {
      form_error($element['postcode'], t('%field is required for %name', [
        '%field' => t('Postcode'),
        '%name' => $element['#title'],
      ]));
    }
  }
  if ($address_index == -1) {
    form_set_value($element['local_unsent_changes'], CARE_FIELDS_CHANGED, $form_state);
    form_set_value($element['address_number'], 0, $form_state);
  }
  else {
    $address_number = $element['address_data']['#value'][$address_index]['address_number'];
    form_set_value($element['address_number'], $address_number, $form_state);
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc