country) {
$this->country = isset($country) ? $country : variable_get('uc_store_country', 840);
}
}
/**
* Compares two UcAddress objects to determine if they represent the same
* physical address.
*
* Address properties such as first_name, phone, and email aren't considered
* in this comparison because they don't contain information about the
* physical location.
*
* @param $address
* An object of type UcAddress.
*
* @return
* TRUE if the two addresses are the same physical location, else FALSE.
*/
public function isSamePhysicalLocation(UcAddress $address) {
$physicalProperty = array(
'street1', 'street2', 'city', 'zone', 'country', 'postal_code'
);
foreach ($physicalProperty as $property) {
// Canonicalize properties before comparing.
if (UcAddress::makeCanonical($this->$property) !=
UcAddress::makeCanonical($address->$property) ) {
return FALSE;
}
}
return TRUE;
}
/**
* Utility function to simplify comparison of address properties.
*
* For the purpose of this function, the canonical form is stripped of all
* whitespace and has been converted to upper case. This ensures that we
* don't get false inequalities when comparing address properties that a
* human would consider identical, but may be capitalized differently or
* have different whitespace.
*
* @param $string
* String to make canonical.
*
* @return
* Canonical form of input string.
*/
public static function makeCanonical($string = '') {
// Remove all whitespace.
$string = preg_replace('/\s+/', '', $string);
// Make all characters upper case.
$string = drupal_strtoupper($string);
return $string;
}
/**
* Formats the address for display based on the country's address format.
*
* @return
* A formatted string containing the address.
*/
public function __toString() {
$result = db_query('SELECT * FROM {uc_zones} WHERE zone_id = :id', array(':id' => $this->zone));
if (!($zone_data = $result->fetchAssoc())) {
$zone_data = array('zone_code' => t('N/A'), 'zone_name' => t('Unknown'));
}
$result = db_query('SELECT * FROM {uc_countries} WHERE country_id = :id', array(':id' => $this->country));
if (!($country_data = $result->fetchAssoc())) {
$country_data = array(
'country_name' => t('Unknown'),
'country_iso_code_2' => t('N/A'),
'country_iso_code_3' => t('N/A'),
);
}
$variables = array(
"\r\n" => '
',
'!company' => check_plain($this->company),
'!first_name' => check_plain($this->first_name),
'!last_name' => check_plain($this->last_name),
'!street1' => check_plain($this->street1),
'!street2' => check_plain($this->street2),
'!city' => check_plain($this->city),
'!zone_code' => $zone_data['zone_code'],
'!zone_name' => $zone_data['zone_name'],
'!postal_code' => check_plain($this->postal_code),
'!country_name' => t($country_data['country_name']),
'!country_code2' => $country_data['country_iso_code_2'],
'!country_code3' => $country_data['country_iso_code_3'],
);
if (uc_store_default_country() != $this->country) {
$variables['!country_name_if'] = t($country_data['country_name']);
$variables['!country_code2_if'] = $country_data['country_iso_code_2'];
$variables['!country_code3_if'] = $country_data['country_iso_code_3'];
}
else {
$variables['!country_name_if'] = '';
$variables['!country_code2_if'] = '';
$variables['!country_code3_if'] = '';
}
$format = variable_get('uc_address_format_' . $this->country, '');
if (empty($format)) {
$format = "!company\r\n!first_name !last_name\r\n!street1\r\n!street2\r\n!city, !zone_code !postal_code\r\n!country_name_if";
}
$address = strtr($format, $variables);
$address = strtr($address, array("\n" => '
'));
$match = array('`^
`', '`
$`', '`
(\s*|[\s*
\s*]+)
`', '`
`', '`
, N/A`');
$replace = array('', '', '
', '
', '', '');
$address = preg_replace($match, $replace, $address);
return $address;
}
/**
* PHP magic method to use in relation with var_export().
*
* Created for strongarm compatibility.
*
* @param array $data
* Data to import
*/
public static function __set_state($data) {
$obj = new self;
foreach ($data as $key => $val) {
$obj->$key = $val;
}
return $obj;
}
}