Example #1
0
/**
 * Creates an address format definition from Google's raw definition.
 */
function create_address_format_definition($countryCode, $rawDefinition)
{
    // Avoid notices.
    $rawDefinition += ['lang' => null, 'fmt' => null, 'require' => null, 'upper' => null, 'state_name_type' => null, 'locality_name_type' => null, 'sublocality_name_type' => null, 'zip_name_type' => null];
    // ZZ holds the defaults for all address formats, and these are missing.
    if ($countryCode == 'ZZ') {
        $rawDefinition['state_name_type'] = AdministrativeAreaType::getDefault();
        $rawDefinition['sublocality_name_type'] = DependentLocalityType::getDefault();
        $rawDefinition['zip_name_type'] = PostalCodeType::getDefault();
    }
    $addressFormat = ['locale' => process_locale($rawDefinition['lang']), 'format' => null, 'local_format' => null, 'required_fields' => convert_fields($rawDefinition['require'], 'required'), 'uppercase_fields' => convert_fields($rawDefinition['upper'], 'uppercase')];
    if (isset($rawDefinition['lfmt']) && $rawDefinition['lfmt'] != $rawDefinition['fmt']) {
        $addressFormat['format'] = convert_format($countryCode, $rawDefinition['lfmt']);
        $addressFormat['local_format'] = convert_format($countryCode, $rawDefinition['fmt']);
    } else {
        $addressFormat['format'] = convert_format($countryCode, $rawDefinition['fmt']);
        // We don't need the locale if there's no local format.
        unset($addressFormat['locale']);
    }
    $addressFormat['administrative_area_type'] = $rawDefinition['state_name_type'];
    $addressFormat['locality_type'] = $rawDefinition['locality_name_type'];
    $addressFormat['dependent_locality_type'] = $rawDefinition['sublocality_name_type'];
    $addressFormat['postal_code_type'] = $rawDefinition['zip_name_type'];
    if (isset($rawDefinition['zip'])) {
        $addressFormat['postal_code_pattern'] = $rawDefinition['zip'];
    }
    if (isset($rawDefinition['postprefix'])) {
        // Workaround for https://github.com/googlei18n/libaddressinput/issues/72.
        if ($rawDefinition['postprefix'] == 'PR') {
            $rawDefinition['postprefix'] = 'PR ';
        } elseif ($rawDefinition['postprefix'] == 'SI-') {
            $rawDefinition['postprefix'] = 'SI- ';
        }
        $addressFormat['postal_code_prefix'] = $rawDefinition['postprefix'];
        // Remove the prefix from the format strings.
        // Workaround for https://github.com/googlei18n/libaddressinput/issues/71.
        $addressFormat['format'] = str_replace($addressFormat['postal_code_prefix'], '', $addressFormat['format']);
        $addressFormat['local_format'] = str_replace($addressFormat['postal_code_prefix'], '', $addressFormat['local_format']);
    }
    // Add the subdivision_depth to the end of the ZZ definition.
    if ($countryCode == 'ZZ') {
        $addressFormat['subdivision_depth'] = 0;
    }
    // Apply any customizations.
    $customizations = get_address_format_customizations($countryCode);
    foreach ($customizations as $key => $values) {
        $addressFormat[$key] = $values;
    }
    // Denote the end of the format string for file_put_php().
    if (!empty($addressFormat['format'])) {
        $addressFormat['format'] .= ';;;';
    }
    if (!empty($addressFormat['local_format'])) {
        $addressFormat['local_format'] .= ';;;';
    }
    // Remove NULL keys.
    $addressFormat = array_filter($addressFormat, function ($value) {
        return !is_null($value);
    });
    // Remove empty local formats.
    if (empty($addressFormat['local_format'])) {
        unset($addressFormat['local_format']);
    }
    return $addressFormat;
}
Example #2
0
/**
 * Creates an address format definition from Google's raw definition.
 */
function create_address_format_definition($rawDefinition)
{
    $addressFormat = ['locale' => determine_locale($rawDefinition), 'format' => null, 'required_fields' => convert_fields($rawDefinition['require'], 'required'), 'uppercase_fields' => convert_fields($rawDefinition['upper'], 'uppercase')];
    // Make sure the recipient is always required by default.
    if (!in_array(AddressField::RECIPIENT, $addressFormat['required_fields'])) {
        $addressFormat['required_fields'] = array_merge([AddressField::RECIPIENT], $addressFormat['required_fields']);
    }
    $translations = [];
    if (isset($rawDefinition['lfmt']) && $rawDefinition['lfmt'] != $rawDefinition['fmt']) {
        // Handle the China/Korea/Japan dual formats via translations.
        $language = $rawDefinition['lang'];
        $translations[$language]['format'] = convert_format($rawDefinition['fmt']);
        $addressFormat['format'] = convert_format($rawDefinition['lfmt']);
    } else {
        $addressFormat['format'] = convert_format($rawDefinition['fmt']);
    }
    if (strpos($addressFormat['format'], '%' . AddressField::ADMINISTRATIVE_AREA) !== false) {
        $addressFormat['administrative_area_type'] = $rawDefinition['state_name_type'];
    }
    if (strpos($addressFormat['format'], '%' . AddressField::LOCALITY) !== false) {
        $addressFormat['locality_type'] = $rawDefinition['locality_name_type'];
    }
    if (strpos($addressFormat['format'], '%' . AddressField::DEPENDENT_LOCALITY) !== false) {
        $addressFormat['dependent_locality_type'] = $rawDefinition['sublocality_name_type'];
    }
    if (strpos($addressFormat['format'], '%' . AddressField::POSTAL_CODE) !== false) {
        $addressFormat['postal_code_type'] = $rawDefinition['zip_name_type'];
        if (isset($rawDefinition['zip'])) {
            $addressFormat['postal_code_pattern'] = $rawDefinition['zip'];
        }
        if (isset($rawDefinition['postprefix'])) {
            // Workaround for https://github.com/googlei18n/libaddressinput/issues/72.
            if ($rawDefinition['postprefix'] == 'PR') {
                $rawDefinition['postprefix'] = 'PR ';
            } elseif ($rawDefinition['postprefix'] == 'SI-') {
                $rawDefinition['postprefix'] = 'SI- ';
            }
            $addressFormat['postal_code_prefix'] = $rawDefinition['postprefix'];
            // Remove the prefix from the format strings.
            // Workaround for https://github.com/googlei18n/libaddressinput/issues/71.
            $addressFormat['format'] = str_replace($addressFormat['postal_code_prefix'], '', $addressFormat['format']);
            foreach ($translations as $language => $translation) {
                $translations[$language]['format'] = str_replace($addressFormat['postal_code_prefix'], '', $translation['format']);
            }
        }
    }
    // Add translations as the last key.
    if ($translations) {
        $addressFormat['translations'] = $translations;
    }
    return $addressFormat;
}